mirror of
https://github.com/austinried/subtracks.git
synced 2025-12-27 17:19:27 +01:00
* basic i18n poc * translate home, filters, tabs support dot notation in backend for namespaces * i18n context menu, artist filters, list controls also nothings here fix backend not caching fallback * i18n queue, artist view, search/results * i18n settings and server view * Added translation using Weblate (Norwegian Bokmål) * Translated using Weblate (Norwegian Bokmål) Currently translated at 100.0% (6 of 6 strings) Translation: Subtracks/subtracks Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/nb_NO/ * Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Subtracks/subtracks Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/ * Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Subtracks/subtracks Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/ * Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Subtracks/subtracks Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/ * fix url escaping * added some mostly naive text overflow fixes rewrote filter context menu as a slide in because the old one apparently can't handle dynamic width * Added translation using Weblate (French) * Translated using Weblate (French) Currently translated at 17.4% (11 of 63 strings) Translation: Subtracks/subtracks Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/fr/ * Translated using Weblate (French) Currently translated at 19.0% (12 of 63 strings) Translation: Subtracks/subtracks Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/fr/ * Translated using Weblate (French) Currently translated at 40.0% (26 of 65 strings) Translation: Subtracks/subtracks Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/fr/ * add weblate and some pretty badges to readme * fix link * Translated using Weblate (French) Currently translated at 50.7% (33 of 65 strings) Translation: Subtracks/subtracks Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/fr/ * Translated using Weblate (English) Currently translated at 100.0% (65 of 65 strings) Translation: Subtracks/subtracks Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/en/ * Translated using Weblate (French) Currently translated at 90.7% (59 of 65 strings) Translation: Subtracks/subtracks Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/fr/ * i18n now playing context type fix overscroll on new filter menu fix getting default namespace from the i18n backend * Translated using Weblate (French) Currently translated at 96.9% (63 of 65 strings) Translation: Subtracks/subtracks Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/fr/ * Translated using Weblate (French) Currently translated at 100.0% (66 of 66 strings) Translation: Subtracks/subtracks Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/fr/ * Translated using Weblate (Japanese) (#98) Currently translated at 7.5% (5 of 66 strings) Translation: Subtracks/subtracks Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/ja/ Co-authored-by: Austin Riedhammer <austinried@functionkey.xyz> * little note to remind me why that's there * update licenses Co-authored-by: Allan Nordhøy <epost@anotheragency.no> Co-authored-by: Hosted Weblate <hosted@weblate.org> Co-authored-by: Clyhtsuriva <aimeric@adjutor.xyz>
65 lines
1.8 KiB
TypeScript
65 lines
1.8 KiB
TypeScript
import { BackendModule, LanguageDetectorAsyncModule } from 'i18next'
|
|
import path from 'path'
|
|
import RNFS from 'react-native-fs'
|
|
import * as RNLocalize from 'react-native-localize'
|
|
import _ from 'lodash'
|
|
|
|
const I18N_ASSETS_DIR = path.join('custom', 'i18n')
|
|
|
|
const cache: {
|
|
[language: string]: {
|
|
[key: string]: any
|
|
}
|
|
} = {}
|
|
|
|
async function loadTranslation(language: string) {
|
|
const text = await RNFS.readFileAssets(path.join(I18N_ASSETS_DIR, `${language}.json`), 'utf8')
|
|
return JSON.parse(text)
|
|
}
|
|
|
|
async function readTranslation(language: string, namespace: string) {
|
|
if (!cache[language]) {
|
|
cache[language] = await loadTranslation(language)
|
|
}
|
|
|
|
return namespace === 'translation' ? cache[language] : _.get(cache[language], namespace)
|
|
}
|
|
|
|
export const backend = {
|
|
type: 'backend',
|
|
init: () => {},
|
|
read: async (language, namespace, callback) => {
|
|
try {
|
|
callback(null, await readTranslation(language, namespace))
|
|
} catch (err) {
|
|
callback(err as any, null)
|
|
}
|
|
},
|
|
} as BackendModule
|
|
|
|
export const languageDetector = {
|
|
type: 'languageDetector',
|
|
async: true,
|
|
detect: async callback => {
|
|
try {
|
|
const languageTags = (await RNFS.readDirAssets(I18N_ASSETS_DIR))
|
|
.map(f => f.name)
|
|
.filter(n => n.endsWith('.json'))
|
|
.map(n => n.slice(0, -5))
|
|
|
|
console.log('translations available:', languageTags)
|
|
console.log(
|
|
'locales list:',
|
|
RNLocalize.getLocales().map(l => l.languageTag),
|
|
)
|
|
console.log('best language:', RNLocalize.findBestAvailableLanguage(languageTags)?.languageTag)
|
|
|
|
callback(RNLocalize.findBestAvailableLanguage(languageTags)?.languageTag)
|
|
} catch {
|
|
callback(undefined)
|
|
}
|
|
},
|
|
init: () => {},
|
|
cacheUserLanguage: () => {},
|
|
} as LanguageDetectorAsyncModule
|