mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2024-12-22 19:49:22 +00:00
CAKE-272 | implemented localization generation script to the app (generate_localization.dart)
This commit is contained in:
parent
206e518e02
commit
a44cb07137
14 changed files with 7702 additions and 7305 deletions
14742
lib/generated/i18n.dart
14742
lib/generated/i18n.dart
File diff suppressed because it is too large
Load diff
|
@ -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"
|
||||
}
|
|
@ -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 don’t forget to specify the Memo ID while sending the XLM transaction for the exchange",
|
||||
"xrp_extra_info" : "Please don’t forget to specify the Destination Tag while sending the XRP transaction for the exchange"
|
||||
"xrp_extra_info" : "Please don’t 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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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" : "प्रदर्शन योग्य"
|
||||
}
|
|
@ -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" : "表示可能"
|
||||
}
|
|
@ -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" : "표시 가능"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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" : "Отображаемый"
|
||||
}
|
|
@ -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" : "Відображуваний"
|
||||
}
|
|
@ -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" : "可显示"
|
||||
}
|
175
tool/generate_localization.dart
Normal file
175
tool/generate_localization.dart
Normal 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;
|
||||
}
|
||||
|
Loading…
Reference in a new issue