diff --git a/src/surveyStrings.ts b/src/surveyStrings.ts index 9ed5aa7565..8aa7d02e90 100644 --- a/src/surveyStrings.ts +++ b/src/surveyStrings.ts @@ -23,27 +23,30 @@ export var surveyLocalization = { getLocaleStrings(loc: string): any { return this.locales[loc]; }, - getCurrentStrings(locale?: string): any { - let loc = locale && this.locales[locale]; - if (!loc) loc = this.currentLocale ? this.locales[this.currentLocale] : this.locales[this.defaultLocale]; - if (!loc) loc = this.locales[this.defaultLocale]; - if (!loc) loc = this.locales["en"]; - return loc; - }, getString: function (strName: string, locale: string = null) { - const originalLocale = locale; - locale = locale || this.currentLocale || this.defaultLocale; - var loc = this.getCurrentStrings(locale); - if (!!loc[strName]) return loc[strName]; - const index = !!locale ? locale.indexOf("-") : -1; - if(index > -1) return this.getString(strName, locale.substring(0, index)); - loc = this.locales[this.defaultLocale]; - var result = loc[strName]; - if (result === undefined) { - result = this.locales["en"][strName]; + const locs = new Array(); + const addLocaleCore = (locName: string): void => { + if(!!this.locales[locName]) locs.push(this.locales[locName]); + }; + const addLocale = (locName: string): void => { + if(!locName) return; + addLocaleCore(locName); + const index = locName.indexOf("-"); + if(index < 1) return; + locName = locName.substring(0, index); + addLocaleCore(locName); + }; + addLocale(locale); + addLocale(this.currentLocale); + addLocale(this.defaultLocale); + if(this.defaultLocale !== "en") { + addLocale("en"); + } + for(let i = 0; i < locs.length; i ++) { + const res = locs[i][strName]; + if(res !== undefined) return res; } - if(result === undefined) return this.onGetExternalString(strName, originalLocale); - return result; + return this.onGetExternalString(strName, locale); }, getLocales: function (removeDefaultLoc: boolean = false): Array { var res = []; diff --git a/tests/surveyLocalizationTests.ts b/tests/surveyLocalizationTests.ts index e7cd15be40..d700ae535c 100644 --- a/tests/surveyLocalizationTests.ts +++ b/tests/surveyLocalizationTests.ts @@ -11,6 +11,7 @@ import "../src/localization/czech"; import "../src/localization/portuguese"; import "../src/localization/portuguese-br"; import { QuestionCheckboxBase } from "../src/question_baseselect"; +import { englishStrings } from "../src/localization/english"; export default QUnit.module("LocalizationsTests"); @@ -269,4 +270,57 @@ QUnit.test( QUnit.test("Support language dialect", function(assert) { assert.equal(surveyLocalization.getString("pagePrevText", "pt-br"), "Anterior", "get from pt"); assert.equal(surveyLocalization.getString("loadingFile", "pt-br"), "Carregando...", "get from pt-br"); +}); + +QUnit.test("Support language dialect & current locale", function(assert) { + const locABABTest = { + prop1: "Prop1 ABABTest", + prop2: "Prop2 ABABTest", + }; + const locABTest = { + prop2: "Prop2 ABTest", + prop3: "Prop3 ABTest", + }; + const locCDCDTest = { + prop3: "Prop3 CDCDTest", + prop4: "Prop4 CDCDTest", + }; + const locCDTest = { + prop4: "Prop4 CDTest", + prop5: "Prop5 CDTest", + }; + const locEFEFTest = { + prop5: "Prop5 EFEFTest", + prop6: "Prop6 EFEFTest", + }; + const locEFTest = { + prop6: "Prop5 EFTest", + prop7: "Prop7 EFTest", + }; + englishStrings["prop7"] = "Prop7 EnTest"; + englishStrings["prop8"] = "Prop8 EnTest"; + surveyLocalization.locales["ab-AB"] = locABABTest; + surveyLocalization.locales["ab"] = locABTest; + surveyLocalization.locales["cd-CD"] = locCDCDTest; + surveyLocalization.locales["cd"] = locCDTest; + surveyLocalization.locales["ef-EF"] = locEFEFTest; + surveyLocalization.locales["ef"] = locEFTest; + surveyLocalization.defaultLocale = "ef-EF"; + surveyLocalization.currentLocale = "cd-CD"; + assert.equal(surveyLocalization.getString("prop1", "ab-AB"), "Prop1 ABABTest", "prop1"); + assert.equal(surveyLocalization.getString("prop2", "ab-AB"), "Prop2 ABABTest", "prop2"); + assert.equal(surveyLocalization.getString("prop3", "ab-AB"), "Prop3 ABTest", "prop3"); + assert.equal(surveyLocalization.getString("prop4", "ab-AB"), "Prop4 CDCDTest", "prop4"); + assert.equal(surveyLocalization.getString("prop5", "ab-AB"), "Prop5 CDTest", "prop5"); + assert.equal(surveyLocalization.getString("prop6", "ab-AB"), "Prop6 EFEFTest", "prop6"); + assert.equal(surveyLocalization.getString("prop7", "ab-AB"), "Prop7 EFTest", "prop7"); + assert.equal(surveyLocalization.getString("prop8", "ab-AB"), "Prop8 EnTest", "prop8"); + + surveyLocalization.defaultLocale = "en"; + surveyLocalization.currentLocale = ""; + delete surveyLocalization.locales["ab-AB"]; + delete surveyLocalization.locales["ab"]; + delete surveyLocalization.locales["cd-CD"]; + delete surveyLocalization.locales["cd"]; + delete surveyLocalization.locales["df"]; }); \ No newline at end of file