public void CompleteTagConstructor_HasInvalidLanguageName_MovedToPrivateUse() { var cleaner = new IetfLanguageTagCleaner("234"); cleaner.Clean(); Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("qaa-x-234")); }
// There's some confusion between the Palaso migrator and our version 19 migrator about whether an old language // tag should have multiple X's if it has more than one private-use component. Since such X's are not // significant, ignore them. private bool TryGetNewTag(string oldTag, out string newTag) { string key = RemoveMultipleX(oldTag.ToLowerInvariant()); if (m_tagMap.TryGetValue(key, out newTag)) { return(!newTag.Equals(oldTag, StringComparison.OrdinalIgnoreCase)); } var cleaner = new IetfLanguageTagCleaner(oldTag); cleaner.Clean(); // FieldWorks needs to handle this special case. if (cleaner.Language.ToLowerInvariant() == "cmn") { var region = cleaner.Region; if (string.IsNullOrEmpty(region)) { region = "CN"; } cleaner = new IetfLanguageTagCleaner("zh", cleaner.Script, region, cleaner.Variant, cleaner.PrivateUse); } newTag = cleaner.GetCompleteTag(); while (m_tagMap.Values.Contains(newTag, StringComparer.OrdinalIgnoreCase)) { // We can't use this tag because it would conflict with what we are mapping something else to. cleaner = new IetfLanguageTagCleaner(cleaner.Language, cleaner.Script, cleaner.Region, cleaner.Variant, WritingSystemIdMigrator.GetNextDuplPart(cleaner.PrivateUse)); newTag = cleaner.GetCompleteTag(); } m_tagMap[key] = newTag; return(!newTag.Equals(oldTag, StringComparison.OrdinalIgnoreCase)); }
public void ScriptEndingWithX_IsHandledCorrectly() { var cleaner = new IetfLanguageTagCleaner("zh-Phnx-CN-fonipa-x-emic"); cleaner.Clean(); VerifyRfcCleaner(cleaner, "zh", "Phnx", "CN", "fonipa", "zh-Phnx-CN-fonipa-x-emic"); }
public void ValidLanguageCodeMarkedPrivate_InsertsQaa() { var cleaner = new IetfLanguageTagCleaner("x-de", "", "", "", ""); cleaner.Clean(); VerifyRfcCleaner(cleaner, "qaa", "", "", "", "qaa-x-de"); }
public void NewTagWithPrivateLanguage_IsNotModified() { var cleaner = new IetfLanguageTagCleaner("qaa-Qaaa-QM-x-kal-Mysc-YY"); cleaner.Clean(); VerifyRfcCleaner(cleaner, "qaa", "Qaaa", "QM", "", "qaa-Qaaa-QM-x-kal-Mysc-YY"); }
public void RegionCodesThatMatchLanguageCodesNotMovedToPrivateUse() { var cleaner = new IetfLanguageTagCleaner("rwr-IN"); cleaner.Clean(); VerifyRfcCleaner(cleaner, "rwr", "", "IN", "", "rwr-IN"); }
public void PrivateRegionMultiPartVariant_InsertsPrivateRegionCode() { var cleaner = new IetfLanguageTagCleaner("fr", "", "x-ZY", "fonipa-x-etic", ""); cleaner.Clean(); VerifyRfcCleaner(cleaner, "fr", "", "QM", "fonipa", "fr-QM-fonipa-x-ZY-etic"); }
public void PrivateUseVariantLanguageCode_IsNotShortened() { var cleaner = new IetfLanguageTagCleaner("qaa", "", "", "", "x-kal"); cleaner.Clean(); VerifyRfcCleaner(cleaner, "qaa", "", "", "", "qaa-x-kal"); }
public void PrivateRegionKnownLanguageAndScript_InsertsPrivateRegionCode() { var cleaner = new IetfLanguageTagCleaner("fr", "Latn", "x-ZY", "", ""); cleaner.Clean(); VerifyRfcCleaner(cleaner, "fr", "Latn", "QM", "", "fr-Latn-QM-x-ZY"); }
public void CompleteTagConstructor_HasLanguageNameAndOtherName_OtherNameMovedToPrivateUse() { var cleaner = new IetfLanguageTagCleaner("abc-123"); cleaner.Clean(); Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("abc-x-123")); }
public void PrivateScriptKnownLanguageAndRegion_InsertsPrivateScriptCode() { var cleaner = new IetfLanguageTagCleaner("fr", "x-script", "NO", "", ""); cleaner.Clean(); VerifyRfcCleaner(cleaner, "fr", "Qaaa", "NO", "", "fr-Qaaa-NO-x-script"); }
public void AllPrivateComponents_InsertsStandardPrivateCodes() { var cleaner = new IetfLanguageTagCleaner("x-kal", "x-script", "x-RG", "fonipa-x-etic", ""); cleaner.Clean(); VerifyRfcCleaner(cleaner, "qaa", "Qaaa", "QM", "fonipa", "qaa-Qaaa-QM-fonipa-x-kal-script-RG-etic"); }
public void CompleteTagConstructor_ValidRfctagWithLegacyIso3CodeAndPrivateUse_MigratesToRfc2LetterCodeAndPrivateUse() { var cleaner = new IetfLanguageTagCleaner("eng-bogus"); cleaner.Clean(); Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("en-x-bogus")); }
public void CompleteTagConstructor_LanguageNameWithAudio_GetZxxxAdded() { var cleaner = new IetfLanguageTagCleaner("aaa-x-audio"); cleaner.Clean(); Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("aaa-Zxxx-x-audio")); }
public void MultiPartVariantWithoutX_InsertsX() { var cleaner = new IetfLanguageTagCleaner("fr", "", "", "fonipa-etic", ""); cleaner.Clean(); VerifyRfcCleaner(cleaner, "fr", "", "", "fonipa", "fr-fonipa-x-etic"); }
public void CompleteTagConstructor_PrivateUseWithAudioAndDuplicateX_MakesAudioTag() { var cleaner = new IetfLanguageTagCleaner("x-en-Zxxx-x-audio"); cleaner.Clean(); Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("qaa-Zxxx-x-en-Zxxx-audio")); }
public void ZhNoRegion_InsertsRegionCN() { var cleaner = new IetfLanguageTagCleaner("zh", "", "", "", ""); cleaner.Clean(); VerifyRfcCleaner(cleaner, "zh", "", "CN", "", "zh-CN"); }
public void LanguageCodeAfterX_IsNotShortened() { var cleaner = new IetfLanguageTagCleaner("qaa-x-kal"); cleaner.Clean(); VerifyRfcCleaner(cleaner, "qaa", "", "", "", "qaa-x-kal"); }
public void CmnNoRegion_BecomesZhCN() { var cleaner = new IetfLanguageTagCleaner("cmn", "", "", "", ""); cleaner.Clean(); VerifyRfcCleaner(cleaner, "zh", "", "CN", "", "zh-CN"); }
public void NewTag_IsNotModified() { var cleaner = new IetfLanguageTagCleaner("fr-Qaaa-QM-x-Mysc-YY"); cleaner.Clean(); VerifyRfcCleaner(cleaner, "fr", "Qaaa", "QM", "", "fr-Qaaa-QM-x-Mysc-YY"); }
public void Pes_BecomesFa() { var cleaner = new IetfLanguageTagCleaner("pes", "Latn", "", "", ""); cleaner.Clean(); VerifyRfcCleaner(cleaner, "fa", "Latn", "", "", "fa-Latn"); }
public void CleanMarksCustomScriptMovedToPrivateUse() { var cleaner = new IetfLanguageTagCleaner("en-Zyxw"); cleaner.Clean(); VerifyRfcCleaner(cleaner, "en", "Qaaa", "", "", "en-Qaaa-x-Zyxw"); }
public void Arb_BecomesAr() { var cleaner = new IetfLanguageTagCleaner("arb", "", "x-ZG", "", ""); cleaner.Clean(); VerifyRfcCleaner(cleaner, "ar", "", "QM", "", "ar-QM-x-ZG"); }
public void CompleteTagConstructor_XDashBeforeValidLanguageNameInVariant_NoChange() { var cleaner = new IetfLanguageTagCleaner("", "", "", "x-de", ""); cleaner.Clean(); Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("x-de")); }
public void LanguageSubtagContainsMultipleValidLanguageSubtagsAsWellAsDataThatIsNotValidLanguageScriptRegionOrVariant_AllSubtagsButFirstValidLanguageSubtagAreMovedToPrivateUse() { var cleaner = new IetfLanguageTagCleaner("bogus-en-audio-tpi-bogus2-x-", "", "", "", ""); cleaner.Clean(); VerifyRfcCleaner(cleaner, "en", "Zxxx", "", "", "en-Zxxx-x-bogus-audio-bogus2-tpi"); }
public void Language_XDashBeforeString_AddsQaa() { var cleaner = new IetfLanguageTagCleaner("x-blah"); cleaner.Clean(); Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("qaa-x-blah")); }
public void CmnRegion_BecomesZh() { var cleaner = new IetfLanguageTagCleaner("cmn", "", "NO", "", ""); cleaner.Clean(); VerifyRfcCleaner(cleaner, "zh", "", "NO", "", "zh-NO"); }
public void CompleteTagConstructor_TagContainsOnlyPrivateUseWithAdditionalXDash_RedundantXDashRemoved() { var cleaner = new IetfLanguageTagCleaner("x-some-x-whatever"); cleaner.Clean(); Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("qaa-x-some-whatever")); }
public void EmicWithoutFonipa_AddsFonipa() { var cleaner = new IetfLanguageTagCleaner("en", "", "", "x-emic", ""); cleaner.Clean(); VerifyRfcCleaner(cleaner, "en", "", "", "fonipa", "en-fonipa-x-emic"); }
private IEnumerable <Tuple <string, string> > GetLanguageAndKeyboardCombinations() { foreach (InputLanguage language in InputLanguage.InstalledInputLanguages) { CultureInfo culture; try { //http://www.wesay.org/issues/browse/WS-34598 //Oddly enough, this can throw. It seems like it might have to do with a badly applied .Net patch //http://www.ironspeed.com/Designer/3.2.4/WebHelp/Part_VI/Culture_ID__XXX__is_not_a_supported_culture.htm and others culture = language.Culture; } catch (CultureNotFoundException) { continue; } if (culture.EnglishName.StartsWith("Invariant")) { continue; } string region = string.Empty; if (Environment.OSVersion.Platform != PlatformID.Unix) { region = GetRegion(language); } var cleaner = new IetfLanguageTagCleaner(culture.TwoLetterISOLanguageName, "", region, "", ""); cleaner.Clean(); yield return(Tuple.Create(cleaner.GetCompleteTag(), language.LayoutName)); } }
public override void Migrate(string sourceFilePath, string destinationFilePath) { string sourceFileName = Path.GetFileName(sourceFilePath); var writingSystemDefinitionV0 = new WritingSystemDefinitionV0(); new LdmlAdaptorV0().Read(sourceFilePath, writingSystemDefinitionV0); var rfcHelper = new IetfLanguageTagCleaner( writingSystemDefinitionV0.ISO639, writingSystemDefinitionV0.Script, writingSystemDefinitionV0.Region, writingSystemDefinitionV0.Variant, ""); rfcHelper.Clean(); var writingSystemDefinitionV1 = new WritingSystemDefinitionV1 { DefaultFontName = writingSystemDefinitionV0.DefaultFontName, Abbreviation = writingSystemDefinitionV0.Abbreviation, DefaultFontSize = writingSystemDefinitionV0.DefaultFontSize, IsUnicodeEncoded = !writingSystemDefinitionV0.IsLegacyEncoded, Keyboard = writingSystemDefinitionV0.Keyboard, LanguageName = writingSystemDefinitionV0.LanguageName, RightToLeftScript = writingSystemDefinitionV0.RightToLeftScript, SortRules = writingSystemDefinitionV0.SortRules, SortUsing = (WritingSystemDefinitionV1.SortRulesType) writingSystemDefinitionV0.SortUsing, SpellCheckingId = writingSystemDefinitionV0.SpellCheckingId, VersionDescription = writingSystemDefinitionV0.VersionDescription, DateModified = DateTime.Now }; writingSystemDefinitionV1.SetAllComponents( rfcHelper.Language, rfcHelper.Script, rfcHelper.Region, ConcatenateVariantAndPrivateUse(rfcHelper.Variant, rfcHelper.PrivateUse) ); _writingSystemsV1[sourceFileName] = writingSystemDefinitionV1; //_migratedWs.VerboseDescription //not written out by LdmlAdaptorV1 - flex? //_migratedWs.NativeName //not written out by LdmlAdaptorV1 - flex?); // Record the details for use in PostMigrate where we change the file name to match the rfc tag where we can. var migrationInfo = new LdmlMigrationInfo(sourceFileName) { LanguageTagBeforeMigration = writingSystemDefinitionV0.Rfc5646, LanguageTagAfterMigration = writingSystemDefinitionV1.Bcp47Tag }; _migrationInfo.Add(migrationInfo); }
public override void Migrate(string sourceFilePath, string destinationFilePath) { string sourceFileName = Path.GetFileName(sourceFilePath); var writingSystemDefinitionV1 = new WritingSystemDefinitionV1(); new LdmlAdaptorV1().Read(sourceFilePath, writingSystemDefinitionV1); string abbreviation = writingSystemDefinitionV1.Abbreviation; float defaultFontSize = writingSystemDefinitionV1.DefaultFontSize; string keyboard = writingSystemDefinitionV1.Keyboard; string spellCheckingId = writingSystemDefinitionV1.SpellCheckingId; string defaultFontName = writingSystemDefinitionV1.DefaultFontName; string languageName = writingSystemDefinitionV1.LanguageName.IsOneOf("Unknown Language", "Language Not Listed") ? string.Empty : writingSystemDefinitionV1.LanguageName; string variant, privateUse; IetfLanguageTag.SplitVariantAndPrivateUse(writingSystemDefinitionV1.Variant, out variant, out privateUse); var langTagCleaner = new IetfLanguageTagCleaner(writingSystemDefinitionV1.Language, writingSystemDefinitionV1.Script, writingSystemDefinitionV1.Region, variant, privateUse); langTagCleaner.Clean(); string langTag = IetfLanguageTag.Canonicalize(langTagCleaner.GetCompleteTag()); List<string> knownKeyboards = writingSystemDefinitionV1.KnownKeyboards.Select(k => string.IsNullOrEmpty(k.Locale) ? k.Layout : string.Format("{0}_{1}", k.Locale, k.Layout)).ToList(); bool isGraphiteEnabled = false; string legacyMapping = string.Empty; string scriptName = string.Empty; string regionName = string.Empty; string variantName = string.Empty; SystemCollationDefinition scd = null; // Create system collation definition if applicable if ((writingSystemDefinitionV1.SortUsing == WritingSystemDefinitionV1.SortRulesType.OtherLanguage) && (!string.IsNullOrEmpty(writingSystemDefinitionV1.SortRules))) scd = new SystemCollationDefinition { LanguageTag = writingSystemDefinitionV1.SortRules }; // Migrate fields from legacy fw namespace, and then remove fw namespace XElement ldmlElem = XElement.Load(sourceFilePath); XElement fwElem = ldmlElem.Elements("special").FirstOrDefault(e => !string.IsNullOrEmpty((string) e.Attribute(XNamespace.Xmlns + "fw"))); if (fwElem != null) { XElement graphiteEnabledElem = fwElem.Element(FW + "graphiteEnabled"); if (graphiteEnabledElem != null) { if (!bool.TryParse((string) graphiteEnabledElem.Attribute("value"), out isGraphiteEnabled)) isGraphiteEnabled = false; } // LegacyMapping XElement legacyMappingElem = fwElem.Element(FW + "legacyMapping"); if (legacyMappingElem != null) legacyMapping = (string) legacyMappingElem.Attribute("value"); // ScriptName XElement scriptNameElem = fwElem.Element(FW + "scriptName"); if (scriptNameElem != null) scriptName = (string) scriptNameElem.Attribute("value"); // RegionName XElement regionNameElem = fwElem.Element(FW + "regionName"); if (regionNameElem != null) regionName = (string) regionNameElem.Attribute("value"); // VariantName XElement variantNameElem = fwElem.Element(FW + "variantName"); if (variantNameElem != null) variantName = (string) variantNameElem.Attribute("value"); } // Record the details for use in PostMigrate where we change the file name to match the ieft language tag where we can. var migrationInfo = new LdmlMigrationInfo(sourceFileName) { LanguageTagBeforeMigration = writingSystemDefinitionV1.Bcp47Tag, LanguageTagAfterMigration = langTag, RemovedPropertiesSetter = ws => { if (!string.IsNullOrEmpty(abbreviation)) ws.Abbreviation = abbreviation; if (defaultFontSize != 0) ws.DefaultFontSize = defaultFontSize; if (!string.IsNullOrEmpty(keyboard)) ws.Keyboard = keyboard; if (!string.IsNullOrEmpty(spellCheckingId)) ws.SpellCheckingId = spellCheckingId; if (!string.IsNullOrEmpty(defaultFontName)) ws.DefaultFont = ws.Fonts[defaultFontName]; if (!string.IsNullOrEmpty(languageName)) ws.Language = new LanguageSubtag(ws.Language, languageName); ws.IsGraphiteEnabled = isGraphiteEnabled; if (!string.IsNullOrEmpty(legacyMapping)) ws.LegacyMapping = legacyMapping; if (!string.IsNullOrEmpty(scriptName) && ws.Script != null && ws.Script.IsPrivateUse) ws.Script = new ScriptSubtag(ws.Script, scriptName); if (!string.IsNullOrEmpty(regionName) && ws.Region != null && ws.Region.IsPrivateUse) ws.Region = new RegionSubtag(ws.Region, regionName); if (scd != null) ws.DefaultCollation = scd; foreach (string keyboardId in knownKeyboards) { IKeyboardDefinition kd; if (!Keyboard.Controller.TryGetKeyboard(keyboardId, out kd)) kd = Keyboard.Controller.CreateKeyboard(keyboardId, KeyboardFormat.Unknown, Enumerable.Empty<string>()); ws.KnownKeyboards.Add(kd); } } }; _migrationInfo.Add(migrationInfo); // Store things that stay in ldml but are being moved: WindowsLcid, variantName, font, known keyboards, collations, font features, character sets // misc properties var staging = new Staging { WindowsLcid = writingSystemDefinitionV1.WindowsLcid, DefaultFontName = writingSystemDefinitionV1.DefaultFontName, SortUsing = writingSystemDefinitionV1.SortUsing, SortRules = writingSystemDefinitionV1.SortRules, }; // Determine if variantName is non-common private use before preserving it if (!string.IsNullOrEmpty(variantName)) { int index = IetfLanguageTag.GetIndexOfFirstNonCommonPrivateUseVariant(IetfLanguageTag.GetVariantSubtags(migrationInfo.LanguageTagAfterMigration)); if (index > -1) staging.VariantName = variantName; } if (fwElem != null) { // DefaultFontFeatures XElement fontFeatsElem = fwElem.Element(FW + "defaultFontFeatures"); if (fontFeatsElem != null && !string.IsNullOrEmpty(staging.DefaultFontName)) staging.DefaultFontFeatures = (string) fontFeatsElem.Attribute("value"); //MatchedPairs, PunctuationPatterns, QuotationMarks deprecated // Valid Chars XElement validCharsElem = fwElem.Element(FW + "validChars"); if (validCharsElem != null) { try { var fwValidCharsElem = XElement.Parse((string) validCharsElem.Attribute("value")); AddCharacterSet(fwValidCharsElem, staging, "WordForming", "main"); AddCharacterSet(fwValidCharsElem, staging, "Numeric", "numeric"); AddCharacterSet(fwValidCharsElem, staging, "Other", "punctuation"); } catch (XmlException) { ParseLegacyWordformingCharOverridesFile(staging); } } } _staging[sourceFileName] = staging; }