CAKE-272 | implemented localization generation script to the app (generate_localization.dart)

This commit is contained in:
OleksandrSobol 2021-03-19 20:19:14 +02:00
parent 206e518e02
commit a44cb07137
14 changed files with 7702 additions and 7305 deletions

File diff suppressed because it is too large Load diff

View file

@ -89,7 +89,7 @@
"trade_is_powered_by" : "Dieser Handel wird betrieben von ${provider}",
"copy_address" : "Adresse kopieren",
"exchange_result_confirm" : "Durch Drücken von Bestätigen wird gesendet ${fetchingLabel} ${from} von Ihrer Brieftasche aus angerufen ${walletName} an die unten angegebene Adresse. Oder Sie können von Ihrem externen Portemonnaie an die unten angegebene Adresse / QR-Code senden.\n\nBitte bestätigen Sie, um fortzufahren, oder gehen Sie zurück, um die Beträge zu änderns.",
"exchange_result_description" : "Bitte senden ${fetchingLabel} ${from} an die auf der nächsten Seite angegebene Adresse.'",
"exchange_result_description" : "Bitte senden ${fetchingLabel} ${from} an die auf der nächsten Seite angegebene Adresse.",
"exchange_result_write_down_ID" : "*Bitte kopieren oder notieren Sie Ihren oben gezeigten Ausweis.",
"confirm" : "Bestätigen",
"confirm_sending" : "Bestätigen Sie das Senden",
@ -462,5 +462,10 @@
"fixed_rate_alert" : "Sie können den Empfangsbetrag eingeben, wenn der Festpreismodus aktiviert ist. Möchten Sie in den Festpreismodus wechseln?",
"xlm_extra_info" : "Bitte vergessen Sie nicht, die Memo-ID anzugeben, während Sie die XLM-Transaktion für den Austausch senden",
"xrp_extra_info" : "Bitte vergessen Sie nicht, das Ziel-Tag anzugeben, während Sie die XRP-Transaktion für den Austausch senden"
"xrp_extra_info" : "Bitte vergessen Sie nicht, das Ziel-Tag anzugeben, während Sie die XRP-Transaktion für den Austausch senden",
"exchange_incorrect_current_wallet_for_xmr" : "Wenn Sie XMR von Ihrem Cake Wallet Monero-Guthaben austauschen möchten, wechseln Sie bitte zuerst zu Ihrem Monero Wallet.",
"confirmed" : "Bestätigt",
"unconfirmed" : "Unbestätigt",
"displayable" : "Anzeigebar"
}

View file

@ -462,5 +462,10 @@
"fixed_rate_alert" : "You will be able to enter receive amount when fixed rate mode is checked. Do you want to switch to fixed rate mode?",
"xlm_extra_info" : "Please dont forget to specify the Memo ID while sending the XLM transaction for the exchange",
"xrp_extra_info" : "Please dont forget to specify the Destination Tag while sending the XRP transaction for the exchange"
"xrp_extra_info" : "Please dont forget to specify the Destination Tag while sending the XRP transaction for the exchange",
"exchange_incorrect_current_wallet_for_xmr" : "If you want to exchange XMR from your Cake Wallet Monero balance, please switch to your Monero wallet first.",
"confirmed" : "Confirmed",
"unconfirmed" : "Unconfirmed",
"displayable" : "Displayable"
}

View file

@ -462,5 +462,10 @@
"fixed_rate_alert" : "Podrá ingresar la cantidad recibida cuando el modo de tarifa fija esté marcado. ¿Quieres cambiar al modo de tarifa fija?",
"xlm_extra_info" : "No olvide especificar el ID de nota al enviar la transacción XLM para el intercambio",
"xrp_extra_info" : "No olvide especificar la etiqueta de destino al enviar la transacción XRP para el intercambio"
"xrp_extra_info" : "No olvide especificar la etiqueta de destino al enviar la transacción XRP para el intercambio",
"exchange_incorrect_current_wallet_for_xmr" : "Si desea intercambiar XMR de su saldo de Cake Wallet Monero, primero cambie a su billetera Monero.",
"confirmed" : "Confirmada",
"unconfirmed" : "Inconfirmado",
"displayable" : "Visualizable"
}

View file

@ -462,5 +462,10 @@
"fixed_rate_alert" : "फिक्स्ड रेट मोड की जांच करने पर आप प्राप्त राशि दर्ज कर पाएंगे। क्या आप निश्चित दर मोड पर स्विच करना चाहते हैं?",
"xlm_extra_info" : "एक्सचेंज के लिए XLM ट्रांजेक्शन भेजते समय मेमो आईडी निर्दिष्ट करना न भूलें",
"xrp_extra_info" : "एक्सचेंज के लिए एक्सआरपी लेनदेन भेजते समय कृपया गंतव्य टैग निर्दिष्ट करना न भूलें"
"xrp_extra_info" : "एक्सचेंज के लिए एक्सआरपी लेनदेन भेजते समय कृपया गंतव्य टैग निर्दिष्ट करना न भूलें",
"exchange_incorrect_current_wallet_for_xmr" : "यदि आप अपने केक वॉलेट मोनेरो बैलेंस से एक्सएमआर का आदान-प्रदान करना चाहते हैं, तो कृपया अपने मोनेरो वॉलेट में जाएं।",
"confirmed" : "की पुष्टि की",
"unconfirmed" : "अपुष्ट",
"displayable" : "प्रदर्शन योग्य"
}

View file

@ -462,5 +462,10 @@
"fixed_rate_alert" : "固定金利モードにチェックを入れると、受取額を入力できるようになります。 固定金利モードに切り替えますか?",
"xlm_extra_info" : "交換用のXLMトランザクションを送信するときに、メモIDを指定することを忘れないでください",
"xrp_extra_info" : "取引所のXRPトランザクションを送信するときに、宛先タグを指定することを忘れないでください"
"xrp_extra_info" : "取引所のXRPトランザクションを送信するときに、宛先タグを指定することを忘れないでください",
"exchange_incorrect_current_wallet_for_xmr" : "Cake Wallet Moneroの残高からXMRを交換する場合は、最初にMoneroウォレットに切り替えてください。",
"confirmed" : "確認済み",
"unconfirmed" : "未確認",
"displayable" : "表示可能"
}

View file

@ -462,5 +462,10 @@
"fixed_rate_alert" : "고정 금리 모드 체크시 수취 금액 입력이 가능합니다. 고정 속도 모드로 전환 하시겠습니까?",
"xlm_extra_info" : "교환을 위해 XLM 거래를 보낼 때 메모 ID를 지정하는 것을 잊지 마십시오",
"xrp_extra_info" : "교환을 위해 XRP 트랜잭션을 보내는 동안 대상 태그를 지정하는 것을 잊지 마십시오"
"xrp_extra_info" : "교환을 위해 XRP 트랜잭션을 보내는 동안 대상 태그를 지정하는 것을 잊지 마십시오",
"exchange_incorrect_current_wallet_for_xmr" : "Cake Wallet Monero 잔액에서 XMR을 교환하려면 먼저 Monero 지갑으로 전환하십시오.",
"confirmed" : "확인",
"unconfirmed" : "미확인",
"displayable" : "표시 가능"
}

View file

@ -462,5 +462,10 @@
"fixed_rate_alert" : "U kunt het ontvangen bedrag invoeren wanneer de modus voor vaste tarieven is aangevinkt. Wilt u overschakelen naar de vaste-tariefmodus?",
"xlm_extra_info" : "Vergeet niet om de Memo-ID op te geven tijdens het verzenden van de XLM-transactie voor de uitwisseling",
"xrp_extra_info" : "Vergeet niet om de Destination Tag op te geven tijdens het verzenden van de XRP-transactie voor de uitwisseling"
"xrp_extra_info" : "Vergeet niet om de Destination Tag op te geven tijdens het verzenden van de XRP-transactie voor de uitwisseling",
"exchange_incorrect_current_wallet_for_xmr" : "Als u XMR wilt omwisselen van uw Cake Wallet Monero-saldo, moet u eerst overschakelen naar uw Monero-portemonnee.",
"confirmed" : "Bevestigd",
"unconfirmed" : "Niet bevestigd",
"displayable" : "Weer te geven"
}

View file

@ -462,5 +462,10 @@
"fixed_rate_alert" : "Będziesz mógł wprowadzić kwotę otrzymaną, gdy zaznaczony jest tryb stałej stawki. Czy chcesz przejść do trybu stałej stawki?",
"xlm_extra_info" : "Nie zapomnij podać identyfikatora notatki podczas wysyłania transakcji XLM do wymiany",
"xrp_extra_info" : "Nie zapomnij podać tagu docelowego podczas wysyłania transakcji XRP do wymiany"
"xrp_extra_info" : "Nie zapomnij podać tagu docelowego podczas wysyłania transakcji XRP do wymiany",
"exchange_incorrect_current_wallet_for_xmr" : "Jeśli chcesz wymienić XMR z salda Cake Wallet Monero, najpierw przełącz się na portfel Monero.",
"confirmed" : "Potwierdzony",
"unconfirmed" : "Niepotwierdzony",
"displayable" : "Wyświetlane"
}

View file

@ -462,5 +462,10 @@
"fixed_rate_alert" : "Você poderá inserir a quantia recebida quando o modo de taxa fixa estiver marcado. Quer mudar para o modo de taxa fixa?",
"xlm_extra_info" : "Não se esqueça de especificar o Memo ID ao enviar a transação XLM para a troca",
"xrp_extra_info" : "Não se esqueça de especificar a etiqueta de destino ao enviar a transação XRP para a troca"
"xrp_extra_info" : "Não se esqueça de especificar a etiqueta de destino ao enviar a transação XRP para a troca",
"exchange_incorrect_current_wallet_for_xmr" : "Se você deseja trocar o XMR de seu saldo da Carteira Monero Cake, troque primeiro para sua carteira Monero.",
"confirmed" : "Confirmada",
"unconfirmed" : "Não confirmado",
"displayable" : "Exibível"
}

View file

@ -462,5 +462,10 @@
"fixed_rate_alert" : "Вы сможете ввести сумму получения тогда, когда будет установлен режим фиксированной ставки. Вы хотите перейти в режим фиксированной ставки?",
"xlm_extra_info" : "Не забудьте указать Memo ID (памятка) при отправке транзакции XLM для обмена",
"xrp_extra_info" : "Не забудьте указать целевой тег при отправке транзакции XRP для обмена"
"xrp_extra_info" : "Не забудьте указать целевой тег при отправке транзакции XRP для обмена",
"exchange_incorrect_current_wallet_for_xmr" : "Если вы хотите обменять XMR со своего баланса Monero в Cake Wallet, сначала переключитесь на свой кошелек Monero.",
"confirmed" : "Подтверждено",
"unconfirmed" : "Неподтвержденный",
"displayable" : "Отображаемый"
}

View file

@ -462,5 +462,10 @@
"fixed_rate_alert" : "Ви зможете ввести суму отримання тоді, коли буде встановлений режим фіксованої ставки. Ви хочете перейти в режим фіксованої ставки?",
"xlm_extra_info" : "Будь ласка, не забудьте вказати ідентифікатор пам'ятки під час надсилання транзакції XLM для обміну",
"xrp_extra_info" : "Будь ласка, не забудьте вказати тег призначення під час надсилання XRP-транзакції для обміну"
"xrp_extra_info" : "Будь ласка, не забудьте вказати тег призначення під час надсилання XRP-транзакції для обміну",
"exchange_incorrect_current_wallet_for_xmr" : "Якщо ви хочете обміняти XMR із вашого балансу Cake Wallet Monero, спочатку перейдіть на свій гаманець Monero.",
"confirmed" : "Підтверджено",
"unconfirmed" : "Непідтверджений",
"displayable" : "Відображуваний"
}

View file

@ -462,5 +462,10 @@
"fixed_rate_alert" : "選中固定費率模式後,您將可以輸入接收金額。 您要切換到固定速率模式嗎?",
"xlm_extra_info" : "發送用於交換的XLM交易時請不要忘記指定備忘錄ID",
"xrp_extra_info" : "發送用於交換的XRP交易時請不要忘記指定目標標記"
"xrp_extra_info" : "發送用於交換的XRP交易時請不要忘記指定目標標記",
"exchange_incorrect_current_wallet_for_xmr" : "如果要从Cake Wallet Monero余额中兑换XMR请先切换到Monero钱包。",
"confirmed" : "已确认",
"unconfirmed" : "未经证实",
"displayable" : "可显示"
}

View file

@ -0,0 +1,175 @@
import 'dart:io';
import 'dart:convert';
const inputPath = 'res/values/';
const outputPath = 'lib/generated/i18n.dart';
const locales = ['en', 'de', 'es', 'hi',
'ja', 'ko', 'nl', 'pl',
'pt', 'ru', 'uk', 'zh'];
Future<void> main() async {
var inputContent = File(inputPath + 'strings_en.arb').readAsStringSync();
var config = json.decode(inputContent) as Map<String, dynamic>;
var output = '';
output += 'import \'dart:async\';' + '\n';
output += 'import \'package:flutter/foundation.dart\';' + '\n';
output += 'import \'package:flutter/material.dart\';' + '\n\n';
output += 'class S implements WidgetsLocalizations {' + '\n';
output += ' const S();' + '\n\n';
output += ' static S current;' + '\n\n';
output += ' static const GeneratedLocalizationsDelegate delegate =' + '\n';
output += ' GeneratedLocalizationsDelegate();' + '\n\n';
output += ' static S of(BuildContext context) => Localizations.of<S>(context, S);' + '\n\n';
output += ' @override' + '\n';
output += ' TextDirection get textDirection => TextDirection.ltr;' + '\n\n';
output += localizedStrings(config: config, hasOverride: false);
output += '}' + '\n\n';
for (var locale in locales) {
output += 'class \$$locale extends S {' + '\n';
output += ' const \$$locale();' + '\n';
if (locale != locales.first) {
output += '\n' + ' @override' + '\n';
output +=
' TextDirection get textDirection => TextDirection.ltr;' + '\n\n';
inputContent = File(inputPath + 'strings_$locale.arb').readAsStringSync();
config = json.decode(inputContent) as Map<String, dynamic>;
output += localizedStrings(config: config, hasOverride: true);
}
output += '}' + '\n\n';
}
output += 'class GeneratedLocalizationsDelegate extends LocalizationsDelegate<S> {' + '\n';
output += ' const GeneratedLocalizationsDelegate();' + '\n\n';
output += ' List<Locale> get supportedLocales {' + '\n';
output += ' return const <Locale>[' + '\n';
for (var locale in locales) {
output += ' Locale("$locale", ""),' + '\n';
}
output += ' ];' + '\n';
output += ' }' + '\n\n';
output += ' LocaleListResolutionCallback listResolution({Locale fallback, bool withCountry = true}) {' + '\n';
output += ' return (List<Locale> locales, Iterable<Locale> supported) {' + '\n';
output += ' if (locales == null || locales.isEmpty) {' + '\n';
output += ' return fallback ?? supported.first;' + '\n';
output += ' } else {' + '\n';
output += ' return _resolve(locales.first, fallback, supported, withCountry);' + '\n';
output += ' }' + '\n';
output += ' };' + '\n';
output += ' }' + '\n\n';
output += ' LocaleResolutionCallback resolution({Locale fallback, bool withCountry = true}) {' + '\n';
output += ' return (Locale locale, Iterable<Locale> supported) {' + '\n';
output += ' return _resolve(locale, fallback, supported, withCountry);' + '\n';
output += ' };' + '\n';
output += ' }' + '\n\n';
output += ' @override' + '\n';
output += ' Future<S> load(Locale locale) {' + '\n';
output += ' final String lang = getLang(locale);' + '\n';
output += ' if (lang != null) {' + '\n';
output += ' switch (lang) {' + '\n';
for (var locale in locales) {
output += ' case "$locale":' + '\n';
output += ' S.current = const \$$locale();' + '\n';
output += ' return SynchronousFuture<S>(S.current);' + '\n';
}
output += ' default:' + '\n';
output += ' }' + '\n';
output += ' }' + '\n';
output += ' S.current = const S();' + '\n';
output += ' return SynchronousFuture<S>(S.current);' + '\n';
output += ' }' + '\n\n';
output += ' @override' + '\n';
output += ' bool isSupported(Locale locale) => _isSupported(locale, true);' + '\n\n';
output += ' @override' + '\n';
output += ' bool shouldReload(GeneratedLocalizationsDelegate old) => false;' + '\n\n';
output += ' Locale _resolve(Locale locale, Locale fallback, Iterable<Locale> supported, bool withCountry) {' + '\n';
output += ' if (locale == null || !_isSupported(locale, withCountry)) {' + '\n';
output += ' return fallback ?? supported.first;' + '\n';
output += ' }' + '\n\n';
output += ' final Locale languageLocale = Locale(locale.languageCode, "");' + '\n';
output += ' if (supported.contains(locale)) {' + '\n';
output += ' return locale;' + '\n';
output += ' } else if (supported.contains(languageLocale)) {' + '\n';
output += ' return languageLocale;' + '\n';
output += ' } else {' + '\n';
output += ' final Locale fallbackLocale = fallback ?? supported.first;' + '\n';
output += ' return fallbackLocale;' + '\n';
output += ' }' + '\n';
output += ' }' + '\n\n';
output += ' bool _isSupported(Locale locale, bool withCountry) {' + '\n';
output += ' if (locale != null) {' + '\n';
output += ' for (Locale supportedLocale in supportedLocales) {' + '\n';
output += ' if (supportedLocale.languageCode != locale.languageCode) {' + '\n';
output += ' continue;' + '\n';
output += ' }' + '\n';
output += ' if (supportedLocale.countryCode == locale.countryCode) {' + '\n';
output += ' return true;' + '\n';
output += ' }' + '\n';
output += ' if (true != withCountry && (supportedLocale.countryCode == null || supportedLocale.countryCode.isEmpty)) {' + '\n';
output += ' return true;' + '\n';
output += ' }' + '\n';
output += ' }' + '\n';
output += ' }' + '\n';
output += ' return false;' + '\n';
output += ' }' + '\n';
output += '}' + '\n\n';
output += 'String getLang(Locale l) => l == null' + '\n';
output += ' ? null' + '\n';
output += ' : l.countryCode != null && l.countryCode.isEmpty' + '\n';
output += ' ? l.languageCode' + '\n';
output += ' : l.toString();';
await File(outputPath).writeAsString(output);
}
String localizedStrings({Map<String, dynamic> config, bool hasOverride}) {
var output = '';
final pattern = RegExp('[\$]{(.*?)}');
for (int i = 0; i < config.length; i++) {
final key = config.keys.elementAt(i);
final value = config.values.elementAt(i) as String;
final matches = pattern.allMatches(value);
if (hasOverride) {
output += ' @override' + '\n';
}
if (matches.length == 0) {
output += ' String get ${key} => \'\'\'${value}\'\'\';' + '\n';
} else {
output += ' String ${key}(';
for (var match in matches) {
if (match.group(1) == matches.last.group(1)) {
output += 'String ${match.group(1)}';
} else {
output += 'String ${match.group(1)}, ';
}
}
output += ') => \'\'\'${value}\'\'\';' + '\n';
}
}
return output;
}