public void GetDynamicStringInEnglish_NoDefault_FindsEnglish() { using (var folder = new TempFolder("GetDynamicStringInEnglish_NoDefault_FindsEnglish")) { SetupManager(folder, "en"); Assert.That(LocalizationManager.GetDynamicString(AppId, "blahId", null), Is.EqualTo("blah"), "With no default supplied, should find saved English"); } }
public void GetDynamicString_ArabicTMXHasArabicValue_ArabicTMXWins() { using (var folder = new TempFolder("GetDynamicString_EnglishTMXHasDIfferentStringThanParameter_ParameterWins")) { SetupManager(folder, "ar"); Assert.AreEqual("inArabic", LocalizationManager.GetDynamicString(AppId, "theId", "from c# code")); } }
public void GetDynamicStringOrEnglish() { using (var folder = new TempFolder("GetDynamicString_EnglishTMXHasDIfferentStringThanParameter_ParameterWins")) { SetupManager(folder, "ar"); Assert.AreEqual("blahInEnglishInCode", GetBlah("en"), "If asked for English, should give whatever is in the code."); Assert.AreEqual("blahInFrench", GetBlah("fr"), "We do have french for this, should have found it."); Assert.AreEqual("blahInEnglishInCode", GetBlah("ar"), "We don't have french so should get the English from code."); } }
[TestCase(new[] { "ar", "fr", "en" }, "blahInFrench", "fr", TestName = "GetString_OverloadThatTakesListOfLanguages_Works_7")] // our arabic doesn't have a translation of 'blah', so fall to French public void GetString_OverloadThatTakesListOfLanguages_Works(IEnumerable <string> preferredLangIds, string expectedResult, string expectedLanguage) { using (var folder = new TempFolder("GetString")) { SetupManager(folder, "ii" /* UI language not important */); string languageFound; var result = LocalizationManager.GetString("blahId", "blahInEnglishCode", "comment", preferredLangIds, out languageFound); Assert.AreEqual(expectedResult, result); Assert.AreEqual(expectedLanguage, languageFound); } }
public float FractionApproved(string langId) { LocalizationManager.UseLanguageCodeFolders = true; using (var folder = new TempFolder()) { AddRandomTranslation("ii", GetInstalledDirectory(folder)); SetupManager(folder, "ii" /* UI language not important */); return(LocalizationManager.FractionApproved(langId)); } }
private static void MakeEnglishTmxWithApparentOrphan(TempFolder folder) { var englishDoc = new TMXDocument { Header = { SourceLang = "en" } }; englishDoc.Header.SetPropValue(LocalizationManager.kAppVersionPropTag, LowerVersion); englishDoc.AddTransUnit(MakeTransUnit("en", null, "Title", "SuperClassMethod.TestId", false)); // This is the one ID found in our test code englishDoc.AddTransUnit(MakeTransUnit("en", null, "Title", "AnotherContext.AnotherDialog.TestId", true)); // Simulates an 'orphan' that we can't otherwise tell we need. Directory.CreateDirectory(GetInstalledDirectory(folder)); englishDoc.Save(Path.Combine(GetInstalledDirectory(folder), LocalizationManager.GetTmxFileNameForLanguage(AppId, "en"))); }
public void GetAvailableUILanguageTags_FindsThreeLanguages() { using (var folder = new TempFolder("GetAvailableUILanguageTags_FindsThreeLanguages")) { SetupManager(folder, "en"); var tags = LocalizationManager.GetAvailableUILanguageTags(GetInstalledDirectory(folder), AppId).ToArray(); Assert.That(tags.Length, Is.EqualTo(3)); Assert.That(tags.Contains("ar"), Is.True); Assert.That(tags.Contains("en"), Is.True); Assert.That(tags.Contains("fr"), Is.True); } }
/// <summary> /// - "Installs" English, Arabic, and French /// - Sets the UI language /// - Constructs a LocalizationManager and adds it to LocalizationManager.LoadedManagers[AppId] /// </summary> private static void SetupManager(TempFolder folder, string uiLanguageId = null) { AddEnglishTmx(GetInstalledDirectory(folder), AppVersion); AddArabicTmx(GetInstalledDirectory(folder)); AddFrenchTmx(GetInstalledDirectory(folder)); LocalizationManager.SetUILanguage(uiLanguageId, true); var manager = new LocalizationManager(AppId, AppName, AppVersion, GetInstalledDirectory(folder), GetGeneratedDirectory(folder), GetUserModifiedDirectory(folder)); // REVIEW (Hasso) 2015.01: Since AppId is static, I wonder what conflicts this may cause (even though each test has its own TempFolder) LocalizationManager.LoadedManagers[AppId] = manager; }
private static void MakeArabicTmxWithApparentOrphans(TempFolder folder, string englishForObsoleteTitle) { var arabicDoc = new TMXDocument { Header = { SourceLang = "ar" } }; arabicDoc.Header.SetPropValue(LocalizationManager.kAppVersionPropTag, LowerVersion); // Note that we do NOT have arabic for SuperClassMethod.TestId. We may end up getting a translation from the orphan, however. arabicDoc.AddTransUnit(MakeTransUnit("ar", "Title", "Title in Arabic", "AnotherContext.AnotherDialog.TestId", true)); // Not an orphan, because English TMX has this too // Interpreted as an orphan iff englishForObsoleteTitle is "Title" (matching the English for SuperClassMethod.TestId) arabicDoc.AddTransUnit(MakeTransUnit("ar", englishForObsoleteTitle, "Title in Arabic", "AnObsoleteNameForSuperclass.TestId", true)); Directory.CreateDirectory(GetInstalledDirectory(folder)); arabicDoc.Save(Path.Combine(GetInstalledDirectory(folder), LocalizationManager.GetTmxFileNameForLanguage(AppId, "ar"))); }
public void CreateOrUpdateDefaultTmxFileIfNecessary_CopiesInstalledIfAvailable() { using (var folder = new TempFolder("CreateOrUpdate_CopiesInstalledIfAvailable")) { // SUT (buried down in there somewhere) SetupManager(folder); // verify presence and identicality of the generated file to the installed file var filename = LocalizationManager.GetTmxFileNameForLanguage(AppId, LocalizationManager.kDefaultLang); var installedFilePath = Path.Combine(GetInstalledDirectory(folder), filename); var generatedFilePath = Path.Combine(GetGeneratedDirectory(folder), filename); Assert.That(File.Exists(generatedFilePath), "Generated file {0} should exist", generatedFilePath); FileAssert.AreEqual(installedFilePath, generatedFilePath, "Generated file should be copied from and identical to Installed file"); } }
public void OrphanLogicNotUsedForEnglish() { using (var folder = new TempFolder("OrphanLogicNotUsedForEnglish")) { MakeEnglishTmxWithApparentOrphan(folder); var manager = new LocalizationManager(AppId, AppName, AppVersion, GetInstalledDirectory(folder), GetUserModifiedDirectory(folder), GetUserModifiedDirectory(folder)); LocalizationManager.LoadedManagers[AppId] = manager; Assert.That(LocalizationManager.GetDynamicStringOrEnglish(AppId, "SuperClassMethod.TestId", null, null, "en"), Is.EqualTo("Title")); // This will fail if we treated it as an orphan: the ID will not occur at all in the TMX. Assert.That(LocalizationManager.GetDynamicStringOrEnglish(AppId, "AnotherContext.AnotherDialog.TestId", null, null, "en"), Is.EqualTo("Title")); } }
public void OrphanLogicUsedForArabic_ButNotIfFoundInEnglishTmx() { using (var folder = new TempFolder("OrphanLogicUsedForArabic_ButNotIfFoundInEnglishTmx")) { MakeEnglishTmxWithApparentOrphan(folder); MakeArabicTmxWithApparentOrphans(folder, "Title"); var manager = new LocalizationManager(AppId, AppName, AppVersion, GetInstalledDirectory(folder), GetUserModifiedDirectory(folder), GetUserModifiedDirectory(folder)); LocalizationManager.LoadedManagers[AppId] = manager; Assert.That(LocalizationManager.GetDynamicStringOrEnglish(AppId, "SuperClassMethod.TestId", null, null, "en"), Is.EqualTo("Title")); Assert.That(LocalizationManager.GetDynamicStringOrEnglish(AppId, "AnotherContext.AnotherDialog.TestId", null, null, "en"), Is.EqualTo("Title")); Assert.That(LocalizationManager.GetDynamicStringOrEnglish(AppId, "SuperClassMethod.TestId", null, null, "ar"), Is.EqualTo("Title in Arabic")); // remapped AnObsoleteNameForSuperclass.TestId Assert.That(LocalizationManager.GetDynamicStringOrEnglish(AppId, "AnotherContext.AnotherDialog.TestId", null, null, "ar"), Is.EqualTo("Title in Arabic")); // not remapped, since English tmx validates it } }
public void ValidateInFoldersAgainstSchema() { LocalizationManager.UseLanguageCodeFolders = true; using (var folder = new TempFolder("FileLocation")) { Directory.CreateDirectory(folder.Path); new XLiffLocalizationManagerTests().SetupManager(folder); var schemas = new XmlSchemaSet(); using (var reader = XmlReader.Create(SchemaLocation)) { schemas.Add("urn:oasis:names:tc:xliff:document:1.2", reader); //English var filename = LocalizationManager.GetTranslationFileNameForLanguage("test", "en"); Assert.AreEqual(Path.Combine("en", "test.xlf"), filename); var filepath = Path.Combine(folder.Path, filename); var document = XDocument.Load(filepath); document.Validate(schemas, (sender, args) => Assert.Fail("Xliff saved at {0} did not validate against schema: {1}", filepath, args.Message)); //French filename = LocalizationManager.GetTranslationFileNameForLanguage("test", "fr"); Assert.AreEqual(Path.Combine("fr", "test.xlf"), filename); filepath = Path.Combine(folder.Path, filename); document = XDocument.Load(filepath); document.Validate(schemas, (sender, args) => Assert.Fail("Xliff saved at {0} did not validate against schema: {1}", filepath, args.Message)); //Arabic filename = LocalizationManager.GetTranslationFileNameForLanguage("test", "ar"); Assert.AreEqual(Path.Combine("ar", "test.xlf"), filename); filepath = Path.Combine(folder.Path, filename); document = XDocument.Load(filepath); document.Validate(schemas, (sender, args) => Assert.Fail("Xliff saved at {0} did not validate against schema: {1}", filepath, args.Message)); } } }
public void GetDynamicString_EnglishAndArabicHaveDifferentValuesOfEnglishString_EnglishTMXWins() { using (var folder = new TempFolder("GetString_EnglishAndArabicHaveDifferentValuesOfEnglishString_EnglishTMXWins")) { SetupManager(folder, "en"); //This was the original assertion, and it worked: // Assert.AreEqual("from English TMX", LocalizationManager.GetDynamicString(AppId, "theId", "some default")); //However, later I decided, I don't care what is in the English TMX, either. If the c# code just gave a new // value for this, what the c# code said should win. Who cares what's in the English TMX. It's only real // purpose in life is to provide a list of strings that have been disovered dynamically when the translator // needs a list of strings to translate (without it, the translator would have to cause the program to visit // each part of the UI so as to trip over all the GetDynamicString() calls. //So now, this is correct: Assert.AreEqual("from the c# code", LocalizationManager.GetDynamicString(AppId, "theId", "from the c# code")); } }
public void CreateOrUpdateDefaultTmxFileIfNecessary_DoesNotOverwriteUpToDateGeneratedFile() { using (var folder = new TempFolder("CreateOrUpdate_DoesNotOverwriteUpToDateGeneratedFile")) { var filename = LocalizationManager.GetTmxFileNameForLanguage(AppId, LocalizationManager.kDefaultLang); var generatedFilePath = Path.Combine(GetGeneratedDirectory(folder), filename); // "generate" an English TMX for a higher version Directory.CreateDirectory(GetGeneratedDirectory(folder)); AddEnglishTmx(GetGeneratedDirectory(folder), HigherVersion); var generatedTmxContents = File.ReadAllText(generatedFilePath); // SUT (buried down in there somewhere) SetupManager(folder); // verify identicality of the generated file to its previous state Assert.AreEqual(generatedTmxContents, File.ReadAllText(generatedFilePath), "Generated file should not have been overwritten"); } }
public void LocalizedStringCache_LoadGroupNodes_DoesntLoadNoLongerUsedUnitsUIEnglish() { using (var folder = new TempFolder("LoadGroupNodes_EnglishTMXHasNoLongerUsedProperty_ArabicDoesnt_NoLongerUsedWins_EnglishUI")) { // Add a "generated" TMX for a lower version to force regeneration Directory.CreateDirectory(GetGeneratedDirectory(folder)); AddEnglishTmx(GetGeneratedDirectory(folder), LowerVersion); SetupManager(folder, "en"); var mgr = LocalizationManager.LoadedManagers[AppId]; var treeView = new TreeView(); var node = new LocTreeNode(mgr, mgr.Name, null, mgr.Name); treeView.Nodes.Add(node); var treeNodes = node.Nodes; mgr.StringCache.LoadGroupNodes(treeNodes); Assert.IsFalse(treeNodes.ContainsKey("notUsedId")); Assert.IsTrue(treeNodes.ContainsKey("theId")); } }
public void OrphanLogicNotUsed_WithWrongEnglishSource() { using (var folder = new TempFolder("OrphanLogicNotUsed_WithWrongEnglishSource")) { MakeEnglishTmxWithApparentOrphan(folder); // The critical difference compared to OrphanLogicUsedForArabic_ButNotIfFoundInEnglishTmx is that the English version of the orphan doesn't match MakeArabicTmxWithApparentOrphans(folder, "Some other Title, unrelated to SuperclassMethod.TestId"); var manager = new LocalizationManager(AppId, AppName, AppVersion, GetInstalledDirectory(folder), GetUserModifiedDirectory(folder), GetUserModifiedDirectory(folder)); LocalizationManager.LoadedManagers[AppId] = manager; Assert.That(LocalizationManager.GetDynamicStringOrEnglish(AppId, "SuperClassMethod.TestId", null, null, "en"), Is.EqualTo("Title")); Assert.That(LocalizationManager.GetDynamicStringOrEnglish(AppId, "AnotherContext.AnotherDialog.TestId", null, null, "en"), Is.EqualTo("Title")); Assert.That(LocalizationManager.GetDynamicStringOrEnglish(AppId, "SuperClassMethod.TestId", null, null, "ar"), Is.EqualTo("Title")); // no remapping, English doesn't match, so we have no Arabic, use English Assert.That(LocalizationManager.GetDynamicStringOrEnglish(AppId, "AnotherContext.AnotherDialog.TestId", null, null, "ar"), Is.EqualTo("Title in Arabic")); // not remapped, since English tmx validates it // We don't really care what happens to the entry for AnObsoleteNameForSuperclass.TestId, since presumably it is truly obsolete. } }
public void CreateOrUpdateDefaultTmxFileIfNecessary_CopiesOverEmptyGeneratedFile() { using (var folder = new TempFolder("CreateOrUpdate_CopiesOverEmptyGeneratedFile")) { var filename = LocalizationManager.GetTmxFileNameForLanguage(AppId, LocalizationManager.kDefaultLang); var installedFilePath = Path.Combine(GetInstalledDirectory(folder), filename); var generatedFilePath = Path.Combine(GetGeneratedDirectory(folder), filename); // generate an empty English TMX file Directory.CreateDirectory(GetGeneratedDirectory(folder)); var fileStream = File.Open(generatedFilePath, FileMode.Create, FileAccess.ReadWrite, FileShare.None); fileStream.Close(); // SUT (buried down in there somewhere) SetupManager(folder); // verify identicality of the generated file to the installed file FileAssert.AreEqual(installedFilePath, generatedFilePath, "Generated file should be copied from and identical to Installed file"); } }
public void GetAvailableUILanguageTags_AddRandomTranslation_FindsTmxFileInUserModifiedDirectory() { using (var folder = new TempFolder()) { SetupManager(folder); // add a custom localization in the User Modified directory AddRandomTranslation("ii", GetUserModifiedDirectory(folder)); // load available localizations var lm = LocalizationManager.LoadedManagers.Values.First(); var tags = lm.GetAvailableUILanguageTags().ToArray(); // was the 'ii' tag found? Assert.That(tags.Contains("ii"), Is.True, "Tag 'ii' not found."); // is the TMX file in the User Modified directory? Assert.That(File.Exists(Path.Combine(GetUserModifiedDirectory(folder), "test.ii.tmx")), Is.True, "File 'test.ii.tmx' not found in User Modified directory."); } }
public void CreateOrUpdateDefaultTmxFileIfNecessary_OverwritesOutdatedGeneratedFile() { using (var folder = new TempFolder("CreateOrUpdate_OverwritesOutdatedGeneratedFile")) { var filename = LocalizationManager.GetTmxFileNameForLanguage(AppId, LocalizationManager.kDefaultLang); var generatedFilePath = Path.Combine(GetGeneratedDirectory(folder), filename); // "generate" an English TMX for a lower version Directory.CreateDirectory(GetGeneratedDirectory(folder)); AddEnglishTmx(GetGeneratedDirectory(folder), LowerVersion); // SUT (buried down in there somewhere) SetupManager(folder); // verify that the generated file has been updated to the current version var headerElt = XElement.Load(generatedFilePath).Element("header"); var verElement = headerElt == null ? null : headerElt.Elements("prop").FirstOrDefault(e => (string)e.Attribute("type") == LocalizationManager.kAppVersionPropTag); var generatedVersion = verElement == null ? null : new Version(verElement.Value); Assert.AreEqual(new Version(AppVersion), generatedVersion, "Generated file should have been updated to the current version"); } }
private static string GetUserModifiedDirectory(TempFolder parentDir) { return(parentDir.Combine("userModified")); }
private static string GetInstalledDirectory(TempFolder parentDir) { return(parentDir.Path); // no reason we can't use the root temp dir for the "installed" Tmx's }
private static string GetGeneratedDirectory(TempFolder parentDir) { return(parentDir.Combine("generated")); }