(empty log message)
@@ -8,6 +8,7 @@ | ||
8 | 8 | |
9 | 9 | import static jp.sourceforge.mergedoc.pleiades.resource.FileNamez.*; |
10 | 10 | |
11 | +import java.nio.charset.Charset; | |
11 | 12 | import java.util.ArrayList; |
12 | 13 | import java.util.List; |
13 | 14 | import java.util.Set; |
@@ -354,6 +355,17 @@ | ||
354 | 355 | ends.insert(0, mat.group(4)); |
355 | 356 | } |
356 | 357 | } |
358 | + | |
359 | + // 先頭絵文字をトリム | |
360 | + if (body.length() >= 2) { | |
361 | + Charset MS_CHAR = Charset.forName("MS932"); | |
362 | + String bef = body.substring(0, 1); | |
363 | + String aft = new String(bef.getBytes(MS_CHAR), MS_CHAR); | |
364 | + if (!bef.equals(aft)) { | |
365 | + starts.append(bef); | |
366 | + body = body.substring(1); | |
367 | + } | |
368 | + } | |
357 | 369 | |
358 | 370 | // ピリオド + 連続する英小文字の場合は何もしない 例) .project |
359 | 371 | if (body.startsWith(".") && body.matches("\\.[a-z]+")) { |
@@ -10,6 +10,7 @@ | ||
10 | 10 | |
11 | 11 | import java.io.File; |
12 | 12 | import java.io.FileNotFoundException; |
13 | +import java.nio.charset.Charset; | |
13 | 14 | import java.util.HashMap; |
14 | 15 | import java.util.List; |
15 | 16 | import java.util.Map; |
@@ -56,6 +57,9 @@ | ||
56 | 57 | |
57 | 58 | /** グローバルマルチバイト文字配列 (英語圏でも使用されるマルチバイト文字) */ |
58 | 59 | private static final char[] GLOBAL_MULTIBYTES_CHARS = "‐‘’“”¤¶\u00A0…⇧⌘⌥⌃⏎→".toCharArray(); |
60 | + | |
61 | + /** 絵文字が使用できない日本語文字セット (絵文字混入判定用) */ | |
62 | + private static final Charset NON_EMOJI_JP_CHARSET = Charset.forName("MS932"); | |
59 | 63 | |
60 | 64 | /** Pleiades コンテキスト */ |
61 | 65 | private static PleiadesContext pleiadesContext = PleiadesContext.getInstance(); |
@@ -476,7 +480,9 @@ | ||
476 | 480 | if ( |
477 | 481 | e.length() != e.getBytes().length && |
478 | 482 | !e.contains(" (") && // 丸括弧内のみ翻訳されている場合があるため |
479 | - !StringUtils.containsAny(e, GLOBAL_MULTIBYTES_CHARS) | |
483 | + !StringUtils.containsAny(e, GLOBAL_MULTIBYTES_CHARS) && | |
484 | + // ただし、絵文字 (MS 日本語以外のマルチバイト) が含まれていないこと (先頭絵文字トリム対応) | |
485 | + e.equals(new String(e.getBytes(NON_EMOJI_JP_CHARSET), NON_EMOJI_JP_CHARSET)) | |
480 | 486 | ) { |
481 | 487 | ja = en; |
482 | 488 | } |
@@ -394,6 +394,13 @@ | ||
394 | 394 | assertLookup("Invalid input url:", "無効な URL 入力:"); |
395 | 395 | assertLookup("Invalid input url", "無効な URL 入力"); |
396 | 396 | |
397 | + // 先頭トリム:絵文字 | |
398 | + assertLookup("📂 Browse...", "📂 参照..."); | |
399 | + assertLookup("🗑️ Remove", "🗑️ 除去"); | |
400 | + assertLookup("⚠️ Security risk", "⚠️ セキュリティー・リスク"); | |
401 | + assertLookup("🔏 Open in Editor...", "🔏 エディターで開く..."); | |
402 | + assertLookup("⚠️ Do you trust unsigned content of unknown origin?", "⚠️ 出所不明の署名されていないコンテンツを信頼しますか?"); | |
403 | + | |
397 | 404 | // 全角混在 (記号表記は AOP で変更可能にしたため訳から除外) |
398 | 405 | assertLookup("Space ( ・ )", "空白"); |
399 | 406 | assertLookup("Ideographic space ( ° )", "全角空白"); |