Flutter中支持常量字符串的多语言

8

我希望将所有常量字符串(例如标签等)放入可以在以后翻译的地方。

Flutter是如何处理这个问题的?


你所说的“翻译”是指什么?翻译成什么语言?你想达到什么目的? - OhMad
我猜他的意思是,对于同一个项目,它可以显示为法语/英语/西班牙语等。 - Alexi Coard
1
在Android框架中,所有字符串都存储在values/strings.xml文件中。这些字符串通过资源类引用,该类会自动更新。这使得翻译变得容易,因为可以将strings.xml翻译后放入一个名为values-es(西班牙语)的文件夹中。我想知道Flutter的机制是什么。 - juliusspencer
2个回答

15
创建一个 Localizations.dart 文件
将以下代码添加到该文件中:
import 'dart:async';
import 'package:flutter/material.dart';

import 'package:flutter/foundation.dart' show SynchronousFuture;
class DemoLocalizations {
  DemoLocalizations(this.locale);
  final Locale locale;
  static DemoLocalizations of(BuildContext context) {
    return Localizations.of<DemoLocalizations>(context, DemoLocalizations);
  }
  static Map<String, Map<String, String>> _localizedValues = {
    'en': {
      'title': 'App title',
      'googleLogin': 'Login with Google'
    },
    'es': {
      'title': 'Título de App',
      'googleLogin': 'Conectar con Google'
    },
  };
  String get title {
    return _localizedValues[locale.languageCode]['title'];
  }
  String get googleLogin {
    return _localizedValues[locale.languageCode]['googleLogin'];
  }
}
class DemoLocalizationsDelegate extends LocalizationsDelegate<DemoLocalizations> {
  const DemoLocalizationsDelegate();
  @override
  bool isSupported(Locale locale) => ['en', 'es'].contains(locale.languageCode);

  @override
  Future<DemoLocalizations> load(Locale locale) {
    // Returning a SynchronousFuture here because an async "load" operation
    // isn't needed to produce an instance of DemoLocalizations.
    return new SynchronousFuture<DemoLocalizations>(new DemoLocalizations(locale));
  }
  @override
  bool shouldReload(DemoLocalizationsDelegate old) => false;
}

  1. Localizations.dart导入到您使用字符串的文件中。

  2. MaterialApp中添加委托DemoLocalizationsDelegate

MaterialApp(
  localizationsDelegates: [
   MyLocalizationsDelegate(),
  ],
...
)
  1. new Text(DemoLocalizations.of(context).title),替换new Text("App Title"),

如果您想本地化每个新字符串,您需要将翻译后的文本添加到每种语言的映射中,然后添加String get...行。这有点麻烦,但它确实做到了您需要的。

这是一种实现方式的快速概述。您可以在Flutter文档中阅读更多信息:https://flutter.io/tutorials/internationalization/


3
对我来说,这似乎只有在main.dart文件中才有效(或者你所称的包含runApp的文件)。当我尝试从其他文件中使用DemoLocalizations.of(context).someFieldName时,它会返回一个空指针错误。我不太清楚为什么会发生这种情况。我在https://dev59.com/1xj8s4cB2Jgan1znGQdC上有一个开放性问题。 - SeaFuzz

8

我在 gitter 上提问,得到了以下回复:

翻译/国际化还不是我们认为“完成”的特性。 https://pub.dartlang.org/packages/intl 在 Flutter 中运作良好。我们有一个跟踪这个更广泛问题的 bug:flutter/flutter#393

更完整的国际化(i18n)和可访问性支持是 Flutter 未来几个月中需要努力的两项重大工作。我们计划完成的另一个 i18n 工作示例是为我们提供的小部件(例如教授 Material 库的 Scaffold 将 Drawer 放置在右侧,当语言环境为 RTL 时)完成从右到左(RTL)布局。RTL 文本支持目前可以使用,但没有小部件能够自动适应 RTL 布局。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接