Basics

Lokalisasi

Pengantar

Lokalisasi memungkinkan Anda menyediakan aplikasi dalam beberapa bahasa. Nylo Website v7 memudahkan pelokalan teks menggunakan file bahasa JSON.

Berikut contoh singkatnya:

lang/en.json

{
  "welcome": "Welcome",
  "greeting": "Hello {{name}}"
}

Di widget Anda:

Text("welcome".tr())              // "Welcome"
Text("greeting".tr(arguments: {"name": "Anthony"}))  // "Hello Anthony"

Konfigurasi

Lokalisasi dikonfigurasi di lib/config/localization.dart:

final class LocalizationConfig {
  // Kode bahasa default (sesuai dengan file JSON Anda, contoh: 'en' untuk lang/en.json)
  static final String languageCode =
      getEnv('DEFAULT_LOCALE', defaultValue: "en");

  // LocaleType.device - Gunakan pengaturan bahasa perangkat
  // LocaleType.asDefined - Gunakan languageCode di atas
  static final LocaleType localeType =
      getEnv('LOCALE_TYPE', defaultValue: 'asDefined') == 'device'
          ? LocaleType.device
          : LocaleType.asDefined;

  // Direktori yang berisi file JSON bahasa
  static const String assetsDirectory = 'lang/';

  // Daftar locale yang didukung
  static const List<Locale> supportedLocales = [
    Locale('en'),
    Locale('es'),
    // Tambahkan lebih banyak locale sesuai kebutuhan
  ];

  // Fallback ketika key tidak ditemukan di locale aktif
  static const String fallbackLanguageCode = 'en';

  // Kode bahasa RTL
  static const List<String> rtlLanguages = ['ar', 'he', 'fa', 'ur'];

  // Log peringatan untuk key terjemahan yang hilang
  static final bool debugMissingKeys =
      getEnv('DEBUG_TRANSLATIONS', defaultValue: 'false') == 'true';
}

Menambahkan File Lokal

Tambahkan file JSON bahasa Anda ke direktori lang/:

lang/
├── en.json   # Inggris
├── es.json   # Spanyol
├── fr.json   # Prancis
└── ...

lang/en.json

{
  "welcome": "Welcome",
  "settings": "Settings",
  "navigation": {
    "home": "Home",
    "profile": "Profile"
  }
}

lang/es.json

{
  "welcome": "Bienvenido",
  "settings": "Configuración",
  "navigation": {
    "home": "Inicio",
    "profile": "Perfil"
  }
}

Daftarkan di pubspec.yaml

Pastikan file bahasa Anda disertakan di pubspec.yaml Anda:

flutter:
  assets:
    - lang/

Melokalkan Teks

Gunakan extension .tr() atau helper trans() untuk menerjemahkan string:

// Menggunakan extension .tr()
"welcome".tr()

// Menggunakan helper trans()
trans("welcome")

Key Bersarang

Akses key JSON bersarang menggunakan notasi titik:

lang/en.json

{
  "navigation": {
    "home": "Home",
    "profile": "Profile"
  }
}
"navigation.home".tr()       // "Home"
trans("navigation.profile")  // "Profile"

Argumen

Sisipkan nilai dinamis ke dalam terjemahan Anda menggunakan sintaks {{key}}:

lang/en.json

{
  "greeting": "Hello {{name}}",
  "items_count": "You have {{count}} items"
}
"greeting".tr(arguments: {"name": "Anthony"})
// "Hello Anthony"

trans("items_count", arguments: {"count": "5"})
// "You have 5 items"

Memperbarui Locale

Ubah bahasa aplikasi saat runtime:

// Menggunakan NyLocalization secara langsung
await NyLocalization.instance.setLanguage(
  context,
  language: 'es'  // Harus sesuai dengan nama file JSON Anda (es.json)
);

Jika widget Anda meng-extend NyPage, gunakan helper changeLanguage:

class _SettingsPageState extends NyPage<SettingsPage> {

  @override
  Widget view(BuildContext context) {
    return ListView(
      children: [
        ListTile(
          title: Text("English"),
          onTap: () => changeLanguage('en'),
        ),
        ListTile(
          title: Text("Español"),
          onTap: () => changeLanguage('es'),
        ),
      ],
    );
  }
}

Mengatur Locale Default

Atur bahasa default di file .env Anda:

DEFAULT_LOCALE="en"

Atau gunakan locale perangkat dengan mengatur:

LOCALE_TYPE="device"

Setelah mengubah .env, regenerate konfigurasi environment Anda:

metro make:env --force

Locale yang Didukung

Tentukan locale mana yang didukung aplikasi Anda di LocalizationConfig:

static const List<Locale> supportedLocales = [
  Locale('en'),
  Locale('es'),
  Locale('fr'),
  Locale('de'),
  Locale('ar'),
];

Daftar ini digunakan oleh MaterialApp.supportedLocales Flutter.

Bahasa Fallback

Ketika key terjemahan tidak ditemukan di locale aktif, Nylo Website akan kembali ke bahasa yang ditentukan:

static const String fallbackLanguageCode = 'en';

Ini memastikan aplikasi Anda tidak pernah menampilkan key mentah jika terjemahan hilang.

Dukungan RTL

Nylo Website v7 menyertakan dukungan bawaan untuk bahasa kanan-ke-kiri (RTL):

static const List<String> rtlLanguages = ['ar', 'he', 'fa', 'ur'];

// Periksa apakah bahasa saat ini adalah RTL
if (LocalizationConfig.isRtl(currentLanguageCode)) {
  // Tangani tata letak RTL
}

Debug Key yang Hilang

Aktifkan peringatan untuk key terjemahan yang hilang selama pengembangan:

Di file .env Anda:

DEBUG_TRANSLATIONS="true"

Ini mencatat peringatan saat .tr() tidak dapat menemukan key, membantu Anda menemukan string yang belum diterjemahkan.

API NyLocalization

NyLocalization adalah singleton yang mengelola semua lokalisasi. Selain method dasar translate(), ia menyediakan beberapa method tambahan:

Memeriksa Apakah Terjemahan Ada

bool exists = NyLocalization.instance.hasTranslation('welcome');
// true jika key ada di file bahasa saat ini

// Juga bekerja dengan key bersarang
bool nestedExists = NyLocalization.instance.hasTranslation('navigation.home');

Mendapatkan Semua Key Terjemahan

Berguna untuk debugging untuk melihat key mana yang dimuat:

List<String> keys = NyLocalization.instance.getAllKeys();
// ['welcome', 'settings', 'navigation', ...]

Mengubah Locale Tanpa Restart

Jika Anda ingin mengubah locale secara diam-diam (tanpa me-restart aplikasi):

await NyLocalization.instance.setLocale(locale: Locale('fr'));

Ini memuat file bahasa baru tetapi tidak me-restart aplikasi. Berguna saat Anda ingin menangani pembaruan UI secara manual.

Memeriksa Arah RTL

bool isRtl = NyLocalization.instance.isDirectionRTL(context);

Mengakses Locale Saat Ini

// Mendapatkan kode bahasa saat ini
String code = NyLocalization.instance.languageCode;  // contoh: 'en'

// Mendapatkan objek Locale saat ini
Locale currentLocale = NyLocalization.instance.locale;

// Mendapatkan delegate lokalisasi Flutter (digunakan di MaterialApp)
var delegates = NyLocalization.instance.delegates;

Referensi API Lengkap

Method / Properti Mengembalikan Deskripsi
instance NyLocalization Instance singleton
translate(key, [arguments]) String Menerjemahkan key dengan argumen opsional
hasTranslation(key) bool Memeriksa apakah key terjemahan ada
getAllKeys() List<String> Mendapatkan semua key terjemahan yang dimuat
setLanguage(context, {language, restart}) Future<void> Mengubah bahasa, opsional restart
setLocale({locale}) Future<void> Mengubah locale tanpa restart
setDebugMissingKeys(enabled) void Mengaktifkan/menonaktifkan logging key yang hilang
isDirectionRTL(context) bool Memeriksa apakah arah saat ini RTL
restart(context) void Me-restart aplikasi
languageCode String Kode bahasa saat ini
locale Locale Objek Locale saat ini
delegates Iterable<LocalizationsDelegate> Delegate lokalisasi Flutter

NyLocaleHelper

NyLocaleHelper adalah kelas utilitas statis untuk operasi locale. Ia menyediakan method untuk mendeteksi locale saat ini, memeriksa dukungan RTL, dan membuat objek Locale.

// Mendapatkan locale sistem saat ini
Locale locale = NyLocaleHelper.getCurrentLocale(context: context);

// Mendapatkan kode bahasa dan negara
String langCode = NyLocaleHelper.getLanguageCode(context: context);  // 'en'
String? countryCode = NyLocaleHelper.getCountryCode(context: context);  // 'US' atau null

// Memeriksa apakah locale saat ini cocok
bool isEnglish = NyLocaleHelper.matchesLocale(context, 'en');
bool isUsEnglish = NyLocaleHelper.matchesLocale(context, 'en', 'US');

// Deteksi RTL
bool isRtl = NyLocaleHelper.isRtlLanguage('ar');  // true
bool currentIsRtl = NyLocaleHelper.isCurrentLocaleRtl(context: context);

// Mendapatkan arah teks
TextDirection direction = NyLocaleHelper.getTextDirection('ar');  // TextDirection.rtl
TextDirection currentDir = NyLocaleHelper.getCurrentTextDirection(context: context);

// Membuat Locale dari string
Locale newLocale = NyLocaleHelper.toLocale('en', 'US');

Referensi API Lengkap

Method Mengembalikan Deskripsi
getCurrentLocale({context}) Locale Mendapatkan locale sistem saat ini
getLanguageCode({context}) String Mendapatkan kode bahasa saat ini
getCountryCode({context}) String? Mendapatkan kode negara saat ini
matchesLocale(context, languageCode, [countryCode]) bool Memeriksa apakah locale saat ini cocok
isRtlLanguage(languageCode) bool Memeriksa apakah kode bahasa adalah RTL
isCurrentLocaleRtl({context}) bool Memeriksa apakah locale saat ini RTL
getTextDirection(languageCode) TextDirection Mendapatkan TextDirection untuk suatu bahasa
getCurrentTextDirection({context}) TextDirection Mendapatkan TextDirection untuk locale saat ini
toLocale(languageCode, [countryCode]) Locale Membuat Locale dari string

Konstanta rtlLanguages berisi: ar, he, fa, ur, yi, ps, ku, sd, dv.

Mengubah Bahasa dari Controller

Jika Anda menggunakan controller dengan halaman Anda, Anda dapat mengubah bahasa dari NyController:

class SettingsController extends NyController {

  void switchToSpanish() {
    changeLanguage('es');
  }

  void switchToEnglishNoRestart() {
    changeLanguage('en', restartState: false);
  }
}

Parameter restartState mengontrol apakah aplikasi akan restart setelah mengubah bahasa. Atur ke false jika Anda ingin menangani pembaruan UI sendiri.