Saltatu eduki nagusira

Nazioartekotzea (i18n)

Trainium-ek bere nazioartekotze-sistema inplementatzen du Compose-n, exekuzioan interfazearen hizkuntza aldatzea ahalbidetzen duena aplikazioa berrabiarazi gabe, CompositionLocal batean oinarrituta.

Sistemaren arkitektura​

Sistema data/i18n/ paketeko bost fitxategiz osatuta dago:

FitxategiaErantzukizuna
AppLanguage.ktEnum Locale-tik onartzen diren 12 hizkuntzekin eta haien bereizmenarekin
AppStrings.ktDatu-klasea UI literal guztiak propietate gisa String
LocalStrings.ktCompositionLocal + funtzioa stringsForLanguage()
LanguageManager.ktHizkuntza iraunkortasuna DataStore
LanguagePickerDialog.ktHizkuntza hautatzeko elkarrizketa-koadroa (ikusmenaren osagaia)

Kate-fitxategiek (StringsEs.kt, StringsEn.kt, etab.) hizkuntza bakoitzerako AppStrings-ren instantzia zehatzak dituzte.

Onartutako hizkuntzak​

EnumkodeaNombre nativo
SPANISHesEspañol
ENGLISHeningelesa
VALENCIANca-VALENCIAValencià
CATALANcaCatalà
FRENCHfrFrançais
MOROCCAN_ARABICar-MAالدارجة
BASQUEeuEuskara
GALICIANglGalego
GERMANdeDeutsch
PORTUGUESEptportugesa
RUSSIANruРусский
CHINESEzh中文

Hizkuntzaren detekzioa eta ebazpena​

Aplikazioa antolatu, MainActivity behatu Flow<AppLanguage?> de LanguageManager:

  • Erabiltzaileak hizkuntza bat eskuz hautatu badu jada (balio nulua), hori erabiltzen da.
  • Balioa null bada (lehen exekuzioa edo garbitutako hobespena), detectSystemLanguage() deitzen da, sistemaren Locale hurbilen dagoen AppLanguagerekin mapatzen duena. Sistemak onartzen ez den hizkuntza bat erabiltzen badu, ordezkoa SPANISH da.
val resolvedLanguage by remember(savedLanguage) {
derivedStateOf {
savedLanguage ?: languageManager.detectSystemLanguage()
}
}

val currentStrings = remember(resolvedLanguage) {
stringsForLanguage(resolvedLanguage)
}

CompositionLocalProvider(LocalStrings provides currentStrings) {
// toda la jerarquía de composables
}

Konposagarrietan kateetarako sarbidea​

CompositionLocalProvider barruan dagoen edozein konposagarri hizkuntza aktiboko kateetara sartzen da:

val strings = LocalStrings.current
Text(strings.login)

Ez da beharrezkoa kateak parametro gisa pasatzea: CompositionLocal automatikoki hedatzen ditu hierarkia osora.

Hizkuntza aldaketa exekuzioan​

Erabiltzaileak hautatzailea irekitzen du pantaila nagusietan eskuragarri dagoen globo ikonoa (Icons.Default.Language) sakatuz. LanguagePickerDialog hizkuntzen zerrenda erakusten du bere jatorrizko izenekin. Berrespenean:

scope.launch { languageManager.setLanguage(selectedLanguage) }

LanguageManager.setLanguage hizkuntza-kodea idazten du DataStore-n. Flow behatuz MainActivity balio berria ateratzen du, resolvedLanguage aldatzen da, currentStrings berriro kalkulatzen da eta CompositionLocalProvider birkonposatzen da. Aldaketa berehalakoa da eta interfaze osoan ikusgai dago aplikazioa berrabiarazi beharrik gabe.

Hizkuntza-kudeatzailea​

class LanguageManager(private val context: Context) {
val currentLanguage: Flow<AppLanguage?>
suspend fun setLanguage(language: AppLanguage)
fun detectSystemLanguage(): AppLanguage
}

currentLanguage null ateratzen du erabiltzaileak hizkuntza bat lehen aldiz hautatu arte. detectSystemLanguage() funtzio sinkrono bat da, Locale.getDefault() dagokion AppLanguagerekin mapatzen duena.

Gehitu hizkuntza berri bat​

Hizkuntza gehigarri baterako laguntza gehitzeko:

  1. Gehitu sarrera berri bat AppLanguage zerrendan bere code, displayName eta nativeNamerekin.
  2. Gehitu kode horren detekzioa AppLanguage.fromLocale() blokean when.
  3. Sortu StringsXx objektu berri bat, itzulpen guztiekin AppStrings instantziatuko duena.
  4. Gehitu kasua stringsForLanguage() funtzioan LocalStrings.kt.