From b2db252065b3c1332ca38436a534049d571a4ca4 Mon Sep 17 00:00:00 2001 From: Zacchary Dempsey-Plante Date: Fri, 5 Feb 2021 21:26:17 -0500 Subject: [PATCH] Hopefully fixed an issue that only appears in CD tests, where the Japanese Sokuon character is treated as a small Tsu. --- .../Languages/Japanese/ModifiedHepburn.cs | 21 ++++++++------ .../JapaneseTests/ModifiedHepburnTests.cs | 28 +++++++++---------- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/Romanization/Languages/Japanese/ModifiedHepburn.cs b/Romanization/Languages/Japanese/ModifiedHepburn.cs index 94c7e9c..7b5e602 100644 --- a/Romanization/Languages/Japanese/ModifiedHepburn.cs +++ b/Romanization/Languages/Japanese/ModifiedHepburn.cs @@ -1,6 +1,8 @@ using Romanization.LanguageAgnostic; +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; +using System.Globalization; // ReSharper disable CheckNamespace // ReSharper disable CommentTypo @@ -32,11 +34,14 @@ public sealed class ModifiedHepburn : IRomanizationSystem private readonly CharSub LongOSub = new CharSub($"o{Choonpu}", Constants.MacronO, false); private readonly CharSub LongUSub = new CharSub($"u{Choonpu}", Constants.MacronU, false); - private readonly CharSub SyllabicNVowelsSub = new CharSub($"[{SyllabicNHiragana}{SyllabicNKatakana}]([{Constants.LatinVowels}])", "n'${1}"); - private readonly CharSub SyllabicNConsonantsSub = new CharSub($"[{SyllabicNHiragana}{SyllabicNKatakana}]([{Constants.LatinConsonants}])", "n${1}"); + private readonly CharSub SyllabicNVowelsSub = + new CharSub($"[{SyllabicNHiragana}{SyllabicNKatakana}]([{Constants.LatinVowels}])", "n'${1}"); + private readonly CharSub SyllabicNConsonantsSub = + new CharSub($"[{SyllabicNHiragana}{SyllabicNKatakana}]([{Constants.LatinConsonants}])", "n${1}"); - private readonly CharSub SokuonGeneralCaseSub = new CharSub($"[{SokuonHiragana}{SokuonKatakana}]([{Constants.LatinConsonants}])", "${1}${1}"); - private readonly CharSub SokuonChCaseSub = new CharSub($"[{SokuonHiragana}{SokuonKatakana}]ch", "tch"); + private readonly CharSub SokuonGeneralCaseSub = + new CharSub($"[{SokuonHiragana}{SokuonKatakana}]([{Constants.LatinConsonants}])", "${1}${1}", false); + private readonly CharSub SokuonChCaseSub = new CharSub($"[{SokuonHiragana}{SokuonKatakana}]ch", "tch", false); /// /// Instantiates a copy of the system to process romanizations. @@ -291,15 +296,15 @@ public ModifiedHepburn() /// A romanized version of the text, leaving unrecognized characters untouched. Note that all romanized text will be lowercase. [Pure] public string Process(string text) - => text + => Utilities.RunWithCulture(CultureInfo.GetCultureInfo("ja-JP"), () => text // Replace common alternate characters .ReplaceCommonAlternates() // Insert spaces at boundaries between Latin characters and Japanese ones (ie. ニンテンドーDSiブラウザー) .SeparateLanguageBoundaries() // Do multi-char combinations first (Yōon) - .ReplaceFromChart(YoonChart) + .ReplaceFromChart(YoonChart, StringComparison.CurrentCulture) // Then single-char replacements (Gojūon) - .ReplaceFromChart(GojuonChart) + .ReplaceFromChart(GojuonChart, StringComparison.CurrentCulture) // Do special subsitutions .ReplaceMany( // Convert chōonpu usage in original text into macrons to mark long vowels in a romanized manner @@ -307,7 +312,7 @@ public string Process(string text) // Render syllabic n as either "n'" or "n" based on whether or not it preceeds a vowel or consonant, respectively SyllabicNVowelsSub, SyllabicNConsonantsSub, // Take sokuon usage into account (repeating the following consonant to mark long consonants) - SokuonChCaseSub, SokuonGeneralCaseSub); + SokuonChCaseSub, SokuonGeneralCaseSub)); } } } diff --git a/RomanizationTests/JapaneseTests/ModifiedHepburnTests.cs b/RomanizationTests/JapaneseTests/ModifiedHepburnTests.cs index 3211628..3e6e0bb 100644 --- a/RomanizationTests/JapaneseTests/ModifiedHepburnTests.cs +++ b/RomanizationTests/JapaneseTests/ModifiedHepburnTests.cs @@ -23,24 +23,24 @@ public void LongVowelTest() [TestMethod] public void SyllabicNTest() { - Assert.AreEqual("annai", _system.Process("あんない")); - Assert.AreEqual("gunma", _system.Process("ぐんま")); - Assert.AreEqual("kan'i", _system.Process("かんい")); - Assert.AreEqual("shin'you", _system.Process("しんよう")); + Assert.AreEqual("annai", _system.Process("あんない")); + Assert.AreEqual("gunma", _system.Process("ぐんま")); + Assert.AreEqual("kan'i", _system.Process("かんい")); + Assert.AreEqual("shin'you", _system.Process("しんよう")); } [TestMethod] public void LongConsonantTest() { - Assert.AreEqual("kekka", _system.Process("けっか")); - Assert.AreEqual("sassato", _system.Process("さっさと")); - Assert.AreEqual("zutto", _system.Process("ずっと")); - Assert.AreEqual("kippu", _system.Process("きっぷ")); - Assert.AreEqual("zasshi", _system.Process("ざっし")); - Assert.AreEqual("issho", _system.Process("いっしょ")); - Assert.AreEqual("kotchi", _system.Process("こっち")); - Assert.AreEqual("matcha", _system.Process("まっちゃ")); - Assert.AreEqual("mittsu", _system.Process("みっつ")); + Assert.AreEqual("kekka", _system.Process("けっか")); + Assert.AreEqual("sassato", _system.Process("さっさと")); + Assert.AreEqual("zutto", _system.Process("ずっと")); + Assert.AreEqual("kippu", _system.Process("きっぷ")); + Assert.AreEqual("zasshi", _system.Process("ざっし")); + Assert.AreEqual("issho", _system.Process("いっしょ")); + Assert.AreEqual("kotchi", _system.Process("こっち")); + Assert.AreEqual("matcha", _system.Process("まっちゃ")); + Assert.AreEqual("mittsu", _system.Process("みっつ")); } } -} \ No newline at end of file +}