Exemplo n.º 1
0
        public void CompleteTagConstructor_HasInvalidLanguageName_MovedToPrivateUse()
        {
            var cleaner = new IetfLanguageTagCleaner("234");

            cleaner.Clean();
            Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("qaa-x-234"));
        }
Exemplo n.º 2
0
        // 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));
        }
Exemplo n.º 3
0
        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");
        }
Exemplo n.º 4
0
        public void ValidLanguageCodeMarkedPrivate_InsertsQaa()
        {
            var cleaner = new IetfLanguageTagCleaner("x-de", "", "", "", "");

            cleaner.Clean();
            VerifyRfcCleaner(cleaner, "qaa", "", "", "", "qaa-x-de");
        }
Exemplo n.º 5
0
        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");
        }
Exemplo n.º 6
0
        public void RegionCodesThatMatchLanguageCodesNotMovedToPrivateUse()
        {
            var cleaner = new IetfLanguageTagCleaner("rwr-IN");

            cleaner.Clean();
            VerifyRfcCleaner(cleaner, "rwr", "", "IN", "", "rwr-IN");
        }
Exemplo n.º 7
0
        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");
        }
Exemplo n.º 8
0
        public void PrivateUseVariantLanguageCode_IsNotShortened()
        {
            var cleaner = new IetfLanguageTagCleaner("qaa", "", "", "", "x-kal");

            cleaner.Clean();
            VerifyRfcCleaner(cleaner, "qaa", "", "", "", "qaa-x-kal");
        }
Exemplo n.º 9
0
        public void PrivateRegionKnownLanguageAndScript_InsertsPrivateRegionCode()
        {
            var cleaner = new IetfLanguageTagCleaner("fr", "Latn", "x-ZY", "", "");

            cleaner.Clean();
            VerifyRfcCleaner(cleaner, "fr", "Latn", "QM", "", "fr-Latn-QM-x-ZY");
        }
Exemplo n.º 10
0
        public void CompleteTagConstructor_HasLanguageNameAndOtherName_OtherNameMovedToPrivateUse()
        {
            var cleaner = new IetfLanguageTagCleaner("abc-123");

            cleaner.Clean();
            Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("abc-x-123"));
        }
Exemplo n.º 11
0
        public void PrivateScriptKnownLanguageAndRegion_InsertsPrivateScriptCode()
        {
            var cleaner = new IetfLanguageTagCleaner("fr", "x-script", "NO", "", "");

            cleaner.Clean();
            VerifyRfcCleaner(cleaner, "fr", "Qaaa", "NO", "", "fr-Qaaa-NO-x-script");
        }
Exemplo n.º 12
0
        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");
        }
Exemplo n.º 13
0
        public void CompleteTagConstructor_ValidRfctagWithLegacyIso3CodeAndPrivateUse_MigratesToRfc2LetterCodeAndPrivateUse()
        {
            var cleaner = new IetfLanguageTagCleaner("eng-bogus");

            cleaner.Clean();
            Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("en-x-bogus"));
        }
Exemplo n.º 14
0
        public void CompleteTagConstructor_LanguageNameWithAudio_GetZxxxAdded()
        {
            var cleaner = new IetfLanguageTagCleaner("aaa-x-audio");

            cleaner.Clean();
            Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("aaa-Zxxx-x-audio"));
        }
Exemplo n.º 15
0
        public void MultiPartVariantWithoutX_InsertsX()
        {
            var cleaner = new IetfLanguageTagCleaner("fr", "", "", "fonipa-etic", "");

            cleaner.Clean();
            VerifyRfcCleaner(cleaner, "fr", "", "", "fonipa", "fr-fonipa-x-etic");
        }
Exemplo n.º 16
0
        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"));
        }
Exemplo n.º 17
0
        public void ZhNoRegion_InsertsRegionCN()
        {
            var cleaner = new IetfLanguageTagCleaner("zh", "", "", "", "");

            cleaner.Clean();
            VerifyRfcCleaner(cleaner, "zh", "", "CN", "", "zh-CN");
        }
Exemplo n.º 18
0
        public void LanguageCodeAfterX_IsNotShortened()
        {
            var cleaner = new IetfLanguageTagCleaner("qaa-x-kal");

            cleaner.Clean();
            VerifyRfcCleaner(cleaner, "qaa", "", "", "", "qaa-x-kal");
        }
Exemplo n.º 19
0
        public void CmnNoRegion_BecomesZhCN()
        {
            var cleaner = new IetfLanguageTagCleaner("cmn", "", "", "", "");

            cleaner.Clean();
            VerifyRfcCleaner(cleaner, "zh", "", "CN", "", "zh-CN");
        }
Exemplo n.º 20
0
        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");
        }
Exemplo n.º 21
0
        public void Pes_BecomesFa()
        {
            var cleaner = new IetfLanguageTagCleaner("pes", "Latn", "", "", "");

            cleaner.Clean();
            VerifyRfcCleaner(cleaner, "fa", "Latn", "", "", "fa-Latn");
        }
Exemplo n.º 22
0
        public void CleanMarksCustomScriptMovedToPrivateUse()
        {
            var cleaner = new IetfLanguageTagCleaner("en-Zyxw");

            cleaner.Clean();
            VerifyRfcCleaner(cleaner, "en", "Qaaa", "", "", "en-Qaaa-x-Zyxw");
        }
Exemplo n.º 23
0
        public void Arb_BecomesAr()
        {
            var cleaner = new IetfLanguageTagCleaner("arb", "", "x-ZG", "", "");

            cleaner.Clean();
            VerifyRfcCleaner(cleaner, "ar", "", "QM", "", "ar-QM-x-ZG");
        }
Exemplo n.º 24
0
        public void CompleteTagConstructor_XDashBeforeValidLanguageNameInVariant_NoChange()
        {
            var cleaner = new IetfLanguageTagCleaner("", "", "", "x-de", "");

            cleaner.Clean();
            Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("x-de"));
        }
Exemplo n.º 25
0
        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");
        }
Exemplo n.º 26
0
        public void Language_XDashBeforeString_AddsQaa()
        {
            var cleaner = new IetfLanguageTagCleaner("x-blah");

            cleaner.Clean();
            Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("qaa-x-blah"));
        }
Exemplo n.º 27
0
        public void CmnRegion_BecomesZh()
        {
            var cleaner = new IetfLanguageTagCleaner("cmn", "", "NO", "", "");

            cleaner.Clean();
            VerifyRfcCleaner(cleaner, "zh", "", "NO", "", "zh-NO");
        }
Exemplo n.º 28
0
        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"));
        }
Exemplo n.º 29
0
        public void EmicWithoutFonipa_AddsFonipa()
        {
            var cleaner = new IetfLanguageTagCleaner("en", "", "", "x-emic", "");

            cleaner.Clean();
            VerifyRfcCleaner(cleaner, "en", "", "", "fonipa", "en-fonipa-x-emic");
        }
Exemplo n.º 30
0
        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;
		}