diff --git a/jslib b/jslib index 119a9ba6..0ad2c9d6 160000 --- a/jslib +++ b/jslib @@ -1 +1 @@ -Subproject commit 119a9ba6bc847049624244c8fb6957e7e2f28256 +Subproject commit 0ad2c9d6676783f2cd68a27733c3823eafc6d65b diff --git a/src/app/accounts/settings.component.ts b/src/app/accounts/settings.component.ts index 08c41740..5bd68f09 100644 --- a/src/app/accounts/settings.component.ts +++ b/src/app/accounts/settings.component.ts @@ -15,8 +15,6 @@ import { StorageService } from 'jslib/abstractions/storage.service'; import { ConstantsService } from 'jslib/services/constants.service'; -import { SupportedTranslationLocales } from '../../services/i18n.service'; - @Component({ selector: 'app-settings', templateUrl: 'settings.component.html', @@ -49,7 +47,7 @@ export class SettingsComponent implements OnInit { ]; this.localeOptions = [{ name: i18nService.t('default'), value: null }]; - SupportedTranslationLocales.forEach((locale) => { + i18nService.supportedTranslationLocales.forEach((locale) => { this.localeOptions.push({ name: locale, value: locale }); }); } diff --git a/src/services/i18n.service.ts b/src/services/i18n.service.ts index 690bba0c..98b3cd9b 100644 --- a/src/services/i18n.service.ts +++ b/src/services/i18n.service.ts @@ -3,104 +3,21 @@ import * as path from 'path'; import { I18nService as I18nServiceAbstraction } from 'jslib/abstractions/i18n.service'; -// First locale is the default (English) -export const SupportedTranslationLocales = [ - 'en', 'cs', 'da', 'de', 'es', 'et', 'fi', 'fr', 'hr', 'hu', 'id', 'it', 'ja', - 'nb', 'nl', 'pl', 'pt-BR', 'pt-PT', 'ro', 'ru', 'sk', 'sv', 'tr', 'uk', 'vi', - 'zh-CN', 'zh-TW', -]; +import { I18nService as BaseI18nService } from 'jslib/services/i18n.service'; -export class I18nService implements I18nServiceAbstraction { - defaultMessages: any = {}; - localeMessages: any = {}; - locale: string; - translationLocale: string; - collator: Intl.Collator; - inited: boolean; +export class I18nService extends BaseI18nService { + constructor(systemLanguage: string, localesDirectory: string) { + super(systemLanguage, localesDirectory, (formattedLocale: string) => { + const filePath = path.join(__dirname, this.localesDirectory + '/' + formattedLocale + '/messages.json'); + const localesJson = fs.readFileSync(filePath, 'utf8'); + const locales = JSON.parse(localesJson.replace(/^\uFEFF/, '')); // strip the BOM + return Promise.resolve(locales); + }); - constructor(private systemLanguage: string, private localesDirectory: string) { - } - - async init(locale?: string) { - if (this.inited) { - throw new Error('i18n already initialized.'); - } - - this.inited = true; - this.locale = this.translationLocale = locale != null ? locale : this.systemLanguage; - this.collator = new Intl.Collator(this.locale); - - if (SupportedTranslationLocales.indexOf(this.translationLocale) === -1) { - this.translationLocale = this.translationLocale.slice(0, 2); - - if (SupportedTranslationLocales.indexOf(this.translationLocale) === -1) { - this.translationLocale = SupportedTranslationLocales[0]; - } - } - - await this.loadMessages(this.translationLocale, this.localeMessages); - if (this.translationLocale !== SupportedTranslationLocales[0]) { - await this.loadMessages(SupportedTranslationLocales[0], this.defaultMessages); - } - } - - t(id: string, p1?: string, p2?: string, p3?: string): string { - return this.translate(id, p1, p2, p3); - } - - translate(id: string, p1?: string, p2?: string, p3?: string): string { - let result: string; - if (this.localeMessages.hasOwnProperty(id) && this.localeMessages[id]) { - result = this.localeMessages[id]; - } else if (this.defaultMessages.hasOwnProperty(id) && this.defaultMessages[id]) { - result = this.defaultMessages[id]; - } else { - result = ''; - } - - if (result !== '') { - if (p1 != null) { - result = result.split('__$1__').join(p1); - } - if (p2 != null) { - result = result.split('__$2__').join(p2); - } - if (p3 != null) { - result = result.split('__$3__').join(p3); - } - } - - return result; - } - - private loadMessages(locale: string, messagesObj: any): Promise { - const formattedLocale = locale.replace('-', '_'); - const filePath = path.join(__dirname, this.localesDirectory + '/' + formattedLocale + '/messages.json'); - const localesJson = fs.readFileSync(filePath, 'utf8'); - const locales = JSON.parse(localesJson.replace(/^\uFEFF/, '')); // strip the BOM - for (const prop in locales) { - if (!locales.hasOwnProperty(prop)) { - continue; - } - messagesObj[prop] = locales[prop].message; - - if (locales[prop].placeholders) { - for (const placeProp in locales[prop].placeholders) { - if (!locales[prop].placeholders.hasOwnProperty(placeProp) || - !locales[prop].placeholders[placeProp].content) { - continue; - } - - const replaceToken = '\\$' + placeProp.toUpperCase() + '\\$'; - let replaceContent = locales[prop].placeholders[placeProp].content; - if (replaceContent === '$1' || replaceContent === '$2' || replaceContent === '$3') { - replaceContent = '__' + replaceContent + '__'; - } - messagesObj[prop] = messagesObj[prop].replace(new RegExp(replaceToken, 'g'), replaceContent); - } - } - } - - return Promise.resolve(); + this.supportedTranslationLocales = [ + 'en', 'cs', 'da', 'de', 'es', 'et', 'fi', 'fr', 'hr', 'hu', 'id', 'it', 'ja', + 'nb', 'nl', 'pl', 'pt-BR', 'pt-PT', 'ro', 'ru', 'sk', 'sv', 'tr', 'uk', 'vi', + 'zh-CN', 'zh-TW', + ]; } }