Flutter 中的字符串 xml 文件

新手上路,请多包涵

在 flutter 中,字符串文本直接设置为 TextField 小部件,例如:

 new Text('Hello,  How are you?')

是正确的方法吗?或者我们可以将所有字符串保存在一个文件中并像这样使用它:

 <string name="name_hint">Hello, How are you?</string>

可能吗 ?

原文由 Magesh Pandian 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 619
2 个回答

Flutter 目前没有专门的字符串类资源系统。目前,最佳做法是将您的副本文本作为静态字段保存在类中并从那里访问它们。例如:

 class Strings {
  static const String welcomeMessage = "Welcome To Flutter";
}

然后在您的代码中,您可以这样访问您的字符串:

 Text(Strings.welcomeMessage)

资源


19 年 5 月编辑:

现在有 这个包 允许你用你的字符串创建 json 文件。它将允许您为复数、性别和语言等创建字符串

您可以像这样为每种语言创建一个单独的 json 文件:

_stringen.json

 {
"thanks": "Thanks."
}

_stringnl.json

 {
"thanks": "Dankjewel."
}

然后使用它来访问它

S.of(context).thanks;

它会根据您手机的默认语言知道选择哪种语言。

原文由 MSpeed 发布,翻译遵循 CC BY-SA 4.0 许可协议

截屏:

我会补充曼塔斯的回答


完整代码(空安全):

对于那些不想使用任何 3rd 方插件的人,这里是你如何做到的。

  1. 在 --- 中创建文件夹 strings assets 。将您的语言文件放入其中。
    assets
     strings
  - en.json // for english
  - ru.json  // for russian

  1. 例如,现在在 en.json 中,写入您的字符串。
    {
     "text1": "Hello",
     "text2": "World"
   }

同样,在 ru.json 中,

    {
     "text1": "Привет",
     "text2": "Мир"
   }

  1. 将此添加到 pubspec.yaml 文件(注意空格)
    flutter:
     uses-material-design: true

     assets:
    - assets/strings/en.json
    - assets/strings/ru.json

flutter_localizations:
  sdk: flutter

  1. 现在您已准备好在您的应用程序中使用这些字符串。这是示例代码, AppBar 显示翻译后的文本。
     void main() {
      runApp(
        MaterialApp(
          locale: Locale("ru"), // switch between en and ru to see effect
          localizationsDelegates: [const DemoLocalizationsDelegate()],
          supportedLocales: [const Locale('en', ''), const Locale('ru', '')],
          home: HomePage(),
        ),
      );
    }

    class HomePage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: Text(DemoLocalizations.of(context).getText("text2") ?? "Error")),
        );
      }
    }

    // this class is used for localizations
    class DemoLocalizations {
      static DemoLocalizations? of(BuildContext context) {
        return Localizations.of<DemoLocalizations>(context, DemoLocalizations);
      }

      String getText(String key) => language[key];
    }

    late Map<String, dynamic> language;

    class DemoLocalizationsDelegate extends LocalizationsDelegate<DemoLocalizations> {
      const DemoLocalizationsDelegate();

      @override
      bool isSupported(Locale locale) => ['en', 'ru'].contains(locale.languageCode);

      @override
      Future<DemoLocalizations> load(Locale locale) async {
        String string = await rootBundle.loadString("assets/strings/${locale.languageCode}.json");
        language = json.decode(string);
        return SynchronousFuture<DemoLocalizations>(DemoLocalizations());
      }

      @override
      bool shouldReload(DemoLocalizationsDelegate old) => false;
    }

原文由 CopsOnRoad 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题