लोकलाइज़ेशन
परिचय
लोकलाइज़ेशन आपको अपने ऐप को कई भाषाओं में प्रदान करने की अनुमति देता है। Nylo Website v7 JSON भाषा फ़ाइलों का उपयोग करके टेक्स्ट को लोकलाइज़ करना आसान बनाता है।
यहाँ एक त्वरित उदाहरण है:
lang/en.json
{
"welcome": "Welcome",
"greeting": "Hello {{name}}"
}
आपके विजेट में:
Text("welcome".tr()) // "Welcome"
Text("greeting".tr(arguments: {"name": "Anthony"})) // "Hello Anthony"
कॉन्फ़िगरेशन
लोकलाइज़ेशन lib/config/localization.dart में कॉन्फ़िगर किया जाता है:
final class LocalizationConfig {
// Default language code (matches your JSON file, e.g., 'en' for lang/en.json)
static final String languageCode =
getEnv('DEFAULT_LOCALE', defaultValue: "en");
// LocaleType.device - Use device's language setting
// LocaleType.asDefined - Use languageCode above
static final LocaleType localeType =
getEnv('LOCALE_TYPE', defaultValue: 'asDefined') == 'device'
? LocaleType.device
: LocaleType.asDefined;
// Directory containing language JSON files
static const String assetsDirectory = 'lang/';
// List of supported locales
static const List<Locale> supportedLocales = [
Locale('en'),
Locale('es'),
// Add more locales as needed
];
// Fallback when a key is not found in the active locale
static const String fallbackLanguageCode = 'en';
// RTL language codes
static const List<String> rtlLanguages = ['ar', 'he', 'fa', 'ur'];
// Log warnings for missing translation keys
static final bool debugMissingKeys =
getEnv('DEBUG_TRANSLATIONS', defaultValue: 'false') == 'true';
}
लोकलाइज़्ड फ़ाइलें जोड़ना
अपनी भाषा JSON फ़ाइलें lang/ डायरेक्टरी में जोड़ें:
lang/
├── en.json # English
├── es.json # Spanish
├── fr.json # French
└── ...
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"
}
}
pubspec.yaml में रजिस्टर करें
सुनिश्चित करें कि आपकी भाषा फ़ाइलें आपकी pubspec.yaml में शामिल हैं:
flutter:
assets:
- lang/
टेक्स्ट लोकलाइज़ करना
स्ट्रिंग्स को ट्रांसलेट करने के लिए .tr() एक्सटेंशन या trans() हेल्पर का उपयोग करें:
// Using the .tr() extension
"welcome".tr()
// Using the trans() helper
trans("welcome")
नेस्टेड कीज़
डॉट नोटेशन का उपयोग करके नेस्टेड JSON कीज़ एक्सेस करें:
lang/en.json
{
"navigation": {
"home": "Home",
"profile": "Profile"
}
}
"navigation.home".tr() // "Home"
trans("navigation.profile") // "Profile"
आर्ग्युमेंट्स
{{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"
लोकेल अपडेट करना
रनटाइम पर ऐप की भाषा बदलें:
// Using NyLocalization directly
await NyLocalization.instance.setLanguage(
context,
language: 'es' // Must match your JSON filename (es.json)
);
यदि आपका विजेट NyPage एक्सटेंड करता है, तो 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'),
),
],
);
}
}
डिफ़ॉल्ट लोकेल सेट करना
अपनी .env फ़ाइल में डिफ़ॉल्ट भाषा सेट करें:
DEFAULT_LOCALE="en"
या डिवाइस की लोकेल का उपयोग करने के लिए सेट करें:
LOCALE_TYPE="device"
.env बदलने के बाद, अपना एनवायरनमेंट कॉन्फ़िग रीजनरेट करें:
metro make:env --force
सपोर्टेड लोकेल्स
LocalizationConfig में डिफ़ाइन करें कि आपका ऐप कौन से लोकेल्स सपोर्ट करता है:
static const List<Locale> supportedLocales = [
Locale('en'),
Locale('es'),
Locale('fr'),
Locale('de'),
Locale('ar'),
];
यह सूची Flutter के MaterialApp.supportedLocales द्वारा उपयोग की जाती है।
फ़ॉलबैक भाषा
जब सक्रिय लोकेल में ट्रांसलेशन कुंजी नहीं मिलती, तो Nylo Website निर्दिष्ट भाषा पर फ़ॉलबैक करता है:
static const String fallbackLanguageCode = 'en';
यह सुनिश्चित करता है कि यदि ट्रांसलेशन गायब है तो आपका ऐप कभी भी रॉ कीज़ नहीं दिखाता।
RTL सपोर्ट
Nylo Website v7 में राइट-टू-लेफ्ट (RTL) भाषाओं के लिए बिल्ट-इन सपोर्ट शामिल है:
static const List<String> rtlLanguages = ['ar', 'he', 'fa', 'ur'];
// Check if current language is RTL
if (LocalizationConfig.isRtl(currentLanguageCode)) {
// Handle RTL layout
}
मिसिंग कीज़ डीबग करें
डेवलपमेंट के दौरान मिसिंग ट्रांसलेशन कीज़ के लिए चेतावनियाँ सक्षम करें:
अपनी .env फ़ाइल में:
DEBUG_TRANSLATIONS="true"
यह तब चेतावनियाँ लॉग करता है जब .tr() कोई कुंजी नहीं खोज पाता, जिससे आपको अनट्रांसलेटेड स्ट्रिंग्स पकड़ने में मदद मिलती है।
NyLocalization API
NyLocalization एक सिंगलटन है जो सभी लोकलाइज़ेशन प्रबंधित करता है। बेसिक translate() मेथड के अलावा, यह कई अतिरिक्त मेथड्स प्रदान करता है:
जाँचें कि ट्रांसलेशन मौजूद है या नहीं
bool exists = NyLocalization.instance.hasTranslation('welcome');
// true if the key exists in the current language file
// Also works with nested keys
bool nestedExists = NyLocalization.instance.hasTranslation('navigation.home');
सभी ट्रांसलेशन कीज़ प्राप्त करें
कौन सी कीज़ लोड हैं यह देखने के लिए डीबगिंग में उपयोगी:
List<String> keys = NyLocalization.instance.getAllKeys();
// ['welcome', 'settings', 'navigation', ...]
बिना रीस्टार्ट के लोकेल बदलें
यदि आप लोकेल को साइलेंटली बदलना चाहते हैं (ऐप को रीस्टार्ट किए बिना):
await NyLocalization.instance.setLocale(locale: Locale('fr'));
यह नई भाषा फ़ाइल लोड करता है लेकिन ऐप को रीस्टार्ट नहीं करता। तब उपयोगी है जब आप UI अपडेट्स को मैन्युअली हैंडल करना चाहते हैं।
RTL दिशा जाँचें
bool isRtl = NyLocalization.instance.isDirectionRTL(context);
वर्तमान लोकेल एक्सेस करें
// Get the current language code
String code = NyLocalization.instance.languageCode; // e.g., 'en'
// Get the current Locale object
Locale currentLocale = NyLocalization.instance.locale;
// Get Flutter localization delegates (used in MaterialApp)
var delegates = NyLocalization.instance.delegates;
पूर्ण API रेफरेंस
| मेथड / प्रॉपर्टी | रिटर्न | विवरण |
|---|---|---|
instance |
NyLocalization |
सिंगलटन इंस्टेंस |
translate(key, [arguments]) |
String |
वैकल्पिक आर्ग्युमेंट्स के साथ कुंजी ट्रांसलेट करें |
hasTranslation(key) |
bool |
जाँचें कि ट्रांसलेशन कुंजी मौजूद है |
getAllKeys() |
List<String> |
सभी लोडेड ट्रांसलेशन कीज़ प्राप्त करें |
setLanguage(context, {language, restart}) |
Future<void> |
भाषा बदलें, वैकल्पिक रूप से रीस्टार्ट करें |
setLocale({locale}) |
Future<void> |
बिना रीस्टार्ट के लोकेल बदलें |
setDebugMissingKeys(enabled) |
void |
मिसिंग कुंजी लॉगिंग सक्षम/अक्षम करें |
isDirectionRTL(context) |
bool |
जाँचें कि वर्तमान दिशा RTL है |
restart(context) |
void |
ऐप रीस्टार्ट करें |
languageCode |
String |
वर्तमान भाषा कोड |
locale |
Locale |
वर्तमान Locale ऑब्जेक्ट |
delegates |
Iterable<LocalizationsDelegate> |
Flutter लोकलाइज़ेशन डेलीगेट्स |
NyLocaleHelper
NyLocaleHelper लोकेल ऑपरेशन्स के लिए एक स्टैटिक यूटिलिटी क्लास है। यह वर्तमान लोकेल का पता लगाने, RTL सपोर्ट जाँचने और Locale ऑब्जेक्ट्स बनाने के मेथड्स प्रदान करता है।
// Get the current system locale
Locale locale = NyLocaleHelper.getCurrentLocale(context: context);
// Get language and country codes
String langCode = NyLocaleHelper.getLanguageCode(context: context); // 'en'
String? countryCode = NyLocaleHelper.getCountryCode(context: context); // 'US' or null
// Check if current locale matches
bool isEnglish = NyLocaleHelper.matchesLocale(context, 'en');
bool isUsEnglish = NyLocaleHelper.matchesLocale(context, 'en', 'US');
// RTL detection
bool isRtl = NyLocaleHelper.isRtlLanguage('ar'); // true
bool currentIsRtl = NyLocaleHelper.isCurrentLocaleRtl(context: context);
// Get text direction
TextDirection direction = NyLocaleHelper.getTextDirection('ar'); // TextDirection.rtl
TextDirection currentDir = NyLocaleHelper.getCurrentTextDirection(context: context);
// Create a Locale from strings
Locale newLocale = NyLocaleHelper.toLocale('en', 'US');
पूर्ण API रेफरेंस
| मेथड | रिटर्न | विवरण |
|---|---|---|
getCurrentLocale({context}) |
Locale |
वर्तमान सिस्टम लोकेल प्राप्त करें |
getLanguageCode({context}) |
String |
वर्तमान भाषा कोड प्राप्त करें |
getCountryCode({context}) |
String? |
वर्तमान देश कोड प्राप्त करें |
matchesLocale(context, languageCode, [countryCode]) |
bool |
जाँचें कि वर्तमान लोकेल मैच करता है |
isRtlLanguage(languageCode) |
bool |
जाँचें कि भाषा कोड RTL है |
isCurrentLocaleRtl({context}) |
bool |
जाँचें कि वर्तमान लोकेल RTL है |
getTextDirection(languageCode) |
TextDirection |
भाषा के लिए TextDirection प्राप्त करें |
getCurrentTextDirection({context}) |
TextDirection |
वर्तमान लोकेल के लिए TextDirection प्राप्त करें |
toLocale(languageCode, [countryCode]) |
Locale |
स्ट्रिंग्स से Locale बनाएँ |
rtlLanguages कॉन्स्टेंट में शामिल हैं: ar, he, fa, ur, yi, ps, ku, sd, dv।
कंट्रोलर से भाषा बदलना
यदि आप अपने पेजेज़ के साथ कंट्रोलर्स का उपयोग करते हैं, तो आप NyController से भाषा बदल सकते हैं:
class SettingsController extends NyController {
void switchToSpanish() {
changeLanguage('es');
}
void switchToEnglishNoRestart() {
changeLanguage('en', restartState: false);
}
}
restartState पैरामीटर यह नियंत्रित करता है कि भाषा बदलने के बाद ऐप रीस्टार्ट होता है या नहीं। यदि आप UI अपडेट स्वयं हैंडल करना चाहते हैं तो इसे false सेट करें।