flutter easy_localization在其他语言上具有键的回退值

o7jaxewo  于 2023-01-31  发布在  Flutter
关注(0)|答案(2)|浏览(120)

当使用this package进行本地化时,基本翻译在EN中完成,我希望我的第二语言显示键,如果它们存在于第二语言json文件中,但如果它们不存在,则使用en.json等效值。问题是,默认情况下,此包显示JSON文件中不存在的键,而不是回退翻译文件值。有办法覆盖此问题吗?
main.dart文件中插件的用法

runApp(
  EasyLocalization(
    child: MyApp(),
    useOnlyLangCode: true,
    fallbackLocale: Locale('en'),
    supportedLocales: [
      Locale('en'),
      Locale('es'),
    ],
    path: 'lang',
  ),
);

当我想翻译一个存在于en.json中,但不存在于es.json文件中的密钥时,它看起来像这样:

tr('appTitle');

预期结果将是“Hello world”,但我在屏幕上得到“appTitle”。

juud5qan

juud5qan1#

老问题了,不过我刚碰到同样的问题:
现在有(?)个参数“useFallbackTranslations”需要设置为true。这确实有点违反直觉,因为人们会假设设置fallbackLocale就足够了。

EasyLocalization(
fallbackLocale: const Locale('en'),
supportedLocales: const [
  Locale('en'),
  Locale('es'),
  Locale('de'),
],
useOnlyLangCode: true,
useFallbackTranslations: true, // <------
path: 'assets/i18n',
child: const MyApp(),
))
bpsygsoo

bpsygsoo2#

这是runApp中的EasyLocalization设置:

runApp(
    EasyLocalization(
        useOnlyLangCode: true,
        useFallbackTranslations: true,
        path: LanguageManager.langAssetPath,
        supportedLocales: LanguageManager.instance.supportedLocales,
        startLocale: LanguageManager.instance.dlLocale,
        fallbackLocale: LanguageManager.instance.dlLocale,
        child: const App(),
    ), 
);

分离的LanguageManager

class LanguageManager {
    LanguageManager._init();
    static LanguageManager get instance => _instance ??= LanguageManager._init();

    static LanguageManager? _instance;

    static const langAssetPath = 'assets/translations';
    final dlLocale = const Locale('en', 'US'); // necessary
    final enLocale = const Locale('en');
    final trLocale = const Locale('tr');

    List<Locale> get supportedLocales => [dlLocale, enLocale, trLocale];

    // constants
    static const supportedLanguages = ['en', 'tr'];

    Locale getCurrentLocale() {
    return supportedLanguages.contains(getCurrentLang)
        ? Locale(getCurrentLang)
        : const Locale('en');
  }

    String get getCurrentLang => Platform.localeName.substring(0, 2);
}

最后,assets/translations文件夹必须为en-US.jsonen.jsontr.json
别忘了生成
PS:这个解决方案来自土耳其的Veli Bacik

相关问题