mirror of https://github.com/ghostfolio/ghostfolio
Browse Source
* Add i18n service to query XML files * Update changelog --------- Co-authored-by: Thomas <4159106+dtslvr@users.noreply.github.com>pull/2453/head^2
Aldrin
1 year ago
committed by
GitHub
3 changed files with 75 additions and 12 deletions
@ -0,0 +1,67 @@ |
|||
import { readFileSync, readdirSync } from 'fs'; |
|||
import { join } from 'path'; |
|||
|
|||
import { DEFAULT_LANGUAGE_CODE } from '@ghostfolio/common/config'; |
|||
import { Logger } from '@nestjs/common'; |
|||
import * as cheerio from 'cheerio'; |
|||
|
|||
export class I18nService { |
|||
private localesPath = join(__dirname, 'assets', 'locales'); |
|||
private translations: { [locale: string]: cheerio.CheerioAPI } = {}; |
|||
|
|||
public constructor() { |
|||
this.loadFiles(); |
|||
} |
|||
|
|||
public getTranslation({ |
|||
id, |
|||
languageCode |
|||
}: { |
|||
id: string; |
|||
languageCode: string; |
|||
}): string { |
|||
const $ = this.translations[languageCode]; |
|||
|
|||
if (!$) { |
|||
Logger.warn(`Translation not found for locale '${languageCode}'`); |
|||
} |
|||
|
|||
const translatedText = $( |
|||
`trans-unit[id="${id}"] > ${ |
|||
languageCode === DEFAULT_LANGUAGE_CODE ? 'source' : 'target' |
|||
}` |
|||
).text(); |
|||
|
|||
if (!translatedText) { |
|||
Logger.warn( |
|||
`Translation not found for id '${id}' in locale '${languageCode}'` |
|||
); |
|||
} |
|||
|
|||
return translatedText; |
|||
} |
|||
|
|||
private loadFiles() { |
|||
try { |
|||
const files = readdirSync(this.localesPath, 'utf-8'); |
|||
|
|||
for (const file of files) { |
|||
const xmlData = readFileSync(join(this.localesPath, file), 'utf8'); |
|||
this.translations[this.parseLanguageCode(file)] = |
|||
this.parseXml(xmlData); |
|||
} |
|||
} catch (error) { |
|||
Logger.error(error, 'I18nService'); |
|||
} |
|||
} |
|||
|
|||
private parseLanguageCode(aFileName: string) { |
|||
const match = aFileName.match(/\.([a-zA-Z]+)\.xlf$/); |
|||
|
|||
return match ? match[1] : DEFAULT_LANGUAGE_CODE; |
|||
} |
|||
|
|||
private parseXml(xmlData: string): cheerio.CheerioAPI { |
|||
return cheerio.load(xmlData, { xmlMode: true }); |
|||
} |
|||
} |
Loading…
Reference in new issue