在Flutter中获取BuildContext进行本地化

时间:2018-08-11 21:06:30

标签: dart flutter

我尝试使用本地化包在Flutter中将字符串本地化。问题是需要翻译的位置。它与UI无关,而是在模型的深处,我无法访问BuildContext。还有其他可能性可以继续使用翻译功能吗?

// I don't have a context variable here
MyLocalizations.of(context).trans("foo")

4 个答案:

答案 0 :(得分:4)

是的。您不需要BuildContext来访问字符串。这是我的解决方案:

class Strings {
  Strings._(Locale locale) : _localeName = locale.toString() {
    current = this;
  }

  final String _localeName;

  static Strings current;

  static Future<Strings> load(Locale locale) async {
    await initializeMessages(locale.toString());
    final result = Strings._(locale);
    return result;
  }

  static Strings of(BuildContext context) {
    return Localizations.of<Strings>(context, Strings);
  }

  String get title {
    return Intl.message(
      'Hello World',
      name: 'title',
      desc: 'Title for the Demo application',
    );
  }
}

Future<Null> main() async {
  final Locale myLocale = Locale(window.locale);
  await Strings.load(myLocale);
  runApp(MyApplication());
}

现在,您可以按以下方式引用字符串:

final title = Strings.current.title;

答案 1 :(得分:3)

我知道这个问题可以追溯到很早以前。但是在实现我的应用程序时遇到了这个问题,而且我看不到任何“不错”的方式来处理它。 所以这是我的方法

class LanguageService {
  static String defaultLanguage = 'en';

  static Map<String, Map<String, String>> _localizedValues = {
    'en': {
      'title': 'Storefront',
      'language': 'Language',
      'googleLogin': 'Login with Google'
    },
    'vn': {
      'title': 'Cửa hàng',
      'language': 'Ngôn ngữ',
      'googleLogin': 'Đăng Nhập với Google'
    }
  };

  static set language(String lang) {
    defaultLanguage = lang;
  }

  static String get title {
    return _localizedValues[defaultLanguage]['title'];
  }

  static String get language {
    return _localizedValues[defaultLanguage]['language'];
  }

  static String get googleLogin {
    return _localizedValues[defaultLanguage]['googleLogin'];
  }

}

现在,您可以按以下方式引用字符串:

String title = LanguageService.title;

您可以找到详细的教程here

答案 2 :(得分:2)

否,没有其他方法,因为它是使用InheritedWidget存储的,{{3}}是构建树的一部分,因此只能通过引用(BuildContext)来访问。
您将需要将context传递到模型中的某个位置。

答案 3 :(得分:0)

我不确定我是否做对了(从性能的角度来看),也许有人可以对此发表评论,但是一旦加载了新的语言环境,我的AppLocalization和fire事件中就会出现rx BehaviorSubject。我正在main.dart中收听它,并在收到事件时执行setState。 我检查了性能选项卡,但是在比较我的方法与通过上下文(继承的小部件)访问翻译后,并没有注意到其中的任何大变化。