MOBILE-4288 core: Refactor getParentLanguage

This method was taking a language argument, but in reality it didn't work if you didn't pass it the current language so it was misleading.
main
Noel De Martin 2023-04-26 10:20:18 +02:00
parent 998eddb74c
commit db3a998f71
3 changed files with 41 additions and 34 deletions

View File

@ -45,7 +45,7 @@ export class AddonFilterMultilang2HandlerService extends CoreFilterDefaultHandle
const currentLang = await CoreLang.getCurrentLanguage(); const currentLang = await CoreLang.getCurrentLanguage();
this.replacementDone = false; this.replacementDone = false;
const parentLanguage = CoreLang.getParentLanguage(currentLang); const parentLanguage = CoreLang.getParentLanguage();
const search = /{\s*mlang\s+((?:[a-z0-9_-]+)(?:\s*,\s*[a-z0-9_-]+\s*)*)\s*}(.*?){\s*mlang\s*}/gim; const search = /{\s*mlang\s+((?:[a-z0-9_-]+)(?:\s*,\s*[a-z0-9_-]+\s*)*)\s*}(.*?){\s*mlang\s*}/gim;
const result = text.replace( const result = text.replace(

View File

@ -152,12 +152,11 @@ export class CoreLangProvider {
/** /**
* Get the parent language defined on the language strings. * Get the parent language defined on the language strings.
* *
* @param currentLanguage Current language.
* @returns If a parent language is set, return the index name. * @returns If a parent language is set, return the index name.
*/ */
getParentLanguage(currentLanguage: string): string | undefined { getParentLanguage(): string | undefined {
const parentLang = Translate.instant('core.parentlanguage'); const parentLang = Translate.instant('core.parentlanguage');
if (parentLang != '' && parentLang != 'core.parentlanguage' && parentLang != currentLanguage) { if (parentLang !== '' && parentLang !== 'core.parentlanguage' && parentLang !== this.currentLanguage) {
return parentLang; return parentLang;
} }
} }
@ -169,41 +168,16 @@ export class CoreLangProvider {
* @returns Promise resolved when the change is finished. * @returns Promise resolved when the change is finished.
*/ */
async changeCurrentLanguage(language: string): Promise<void> { async changeCurrentLanguage(language: string): Promise<void> {
const promises: Promise<unknown>[] = [];
// Change the language, resolving the promise when we receive the first value.
promises.push(new Promise((resolve, reject) => {
CoreSubscriptions.once(Translate.use(language), async data => {
// Check if it has a parent language.
const fallbackLang = this.getParentLanguage(language);
if (fallbackLang) {
try {
// Merge parent translations with the child ones.
const parentTranslations = Translate.translations[fallbackLang] ?? await this.readLangFile(fallbackLang);
const mergedData = Object.assign(parentTranslations, data);
Object.assign(data, mergedData);
} catch {
// Ignore errors.
}
}
resolve(data);
}, reject);
}));
// Change the config.
promises.push(CoreConfig.set('current_language', language));
// Use british english when parent english is loaded. // Use british english when parent english is loaded.
moment.locale(language == 'en' ? 'en-gb' : language); moment.locale(language == 'en' ? 'en-gb' : language);
this.currentLanguage = language; this.currentLanguage = language;
try { try {
await Promise.all(promises); await Promise.all([
this.reloadLanguageStrings(),
CoreConfig.set('current_language', language),
]);
} finally { } finally {
// Load the custom and site plugins strings for the language. // Load the custom and site plugins strings for the language.
if (this.loadLangStrings(this.customStrings, language) || this.loadLangStrings(this.sitePluginsStrings, language)) { if (this.loadLangStrings(this.customStrings, language) || this.loadLangStrings(this.sitePluginsStrings, language)) {
@ -558,6 +532,39 @@ export class CoreLangProvider {
} }
} }
/**
* Reload language strings for the current language.
*/
protected async reloadLanguageStrings(): Promise<void> {
const currentLanguage = this.currentLanguage;
if (!currentLanguage) {
return;
}
await new Promise((resolve, reject) => {
CoreSubscriptions.once(Translate.use(currentLanguage), async data => {
// Check if it has a parent language.
const fallbackLang = this.getParentLanguage();
if (fallbackLang) {
try {
// Merge parent translations with the child ones.
const parentTranslations = Translate.translations[fallbackLang] ?? await this.readLangFile(fallbackLang);
const mergedData = Object.assign(parentTranslations, data);
Object.assign(data, mergedData);
} catch {
// Ignore errors.
}
}
resolve(data);
}, reject);
});
}
} }
export const CoreLang = makeSingleton(CoreLangProvider); export const CoreLang = makeSingleton(CoreLangProvider);

View File

@ -261,7 +261,7 @@ export class CoreUrlUtilsProvider {
try { try {
let lang = await CoreLang.getCurrentLanguage(); let lang = await CoreLang.getCurrentLanguage();
lang = CoreLang.getParentLanguage(lang) || lang; lang = CoreLang.getParentLanguage() || lang;
return docsUrl.replace('/en/', '/' + lang + '/'); return docsUrl.replace('/en/', '/' + lang + '/');
} catch (error) { } catch (error) {