丹凤千字科普:法语dir什么意思(详细资料介绍)


丹凤千字科普:法语dir什么意思(详细资料介绍)  

Flutter应用的国际化

您将学习如何:

1. 获取设备的语言环境(用户首选的语言)。

2. 管理特定语言环境下的app值。

3. 定义app支持的语言环境。

当您的app要面向使用其他语言的用户时,国际化就变得至关重要。这意味着您在编写app时,需要采用一种易于本地化的开发方式,这种方式能让您为每一种语言或app所支持的语言环境下的文本和布局等进行本地化。Flutter提供了widgets和类来帮助开发者进行国际化,而Flutter库本身也是国际化的。

和大多数应用一样,下面的教程主要使用Flutter的MaterialApp类进行编写。使用更底层的WidgetsApp类编写的应用也能通过使用相同的类和逻辑进行国际化。

国际化的app实例

如果您想通过已经国际化的Flutter app代码开始学习,这里有两个小例子。第一个例子是一个尽可能简单的实现。第二个例子使用了intl package提供的API和工具。如果您还不熟悉Dart的intl包,请查看Dart intl工具的使用。

最简单的国际化实现示例

基于flutter_localizations包的国际化实现示例

1. 配置国际化的app:flutter_localizations包

默认情况下,Flutter只提供美式英语的本地化。要添加其他语言,您的应用必须指定额外的MaterialApp属性并添加一个单独的包,叫做flutter_localizations。截至到最近的更新,这个包已经支持大约52种语言。如果您希望在iOS上顺利运行,您还需要额外加入flutter_cupertino_localizations这个包。

要使用flutter_localizations的话,您需要在pubspec.yaml文件中将它添加为依赖:

dependencies:

flutter:

sdk: flutter

flutter_localizations:

sdk: flutter

flutter_cupertino_localizations: ^最新版本号

接下来,引入flutter_localizations库,为MaterialApp指定localizationsDelegates和supportedLocales:

import 'package:flutter_localizations/flutter_localizations.dart';

import 'package:flutter_cupertino_localizations/flutter_cupertino_localizations.dart';

MaterialApp(

localizationsDelegates: [

// ... app-specific localization delegate[s] here

GlobalMaterialLocalizations.delegate,

GlobalWidgetsLocalizations.delegate,

GlobalCupertinoLocalizations.delegate,

],

supportedLocales: [

const Locale('en'), // 英语

const Locale('he'), // 希伯来语

const Locale.fromSubtags(languageCode: 'zh'), // 中文(具体请看高级语言环境定义)

// ... 其他app支持的语言环境

],

// ...

基于WidgetsApp构建的app在添加语言环境时,除了GlobalMaterialLocalizations.delegate不需要之外,其他操作是类似的。

虽然Locale的构造函数完全可以工作,但建议使用Locale.fromSubtags的构造函数,因为它支持设置脚本代码。

localizationDelegates数组用于生成本地化值集合的工厂。GlobalMaterialLocalizations.delegate为Material组件库提供本地化的字符串和一些其他的值。GlobalWidgetsLocalizations.delegate为widgets库定义了默认的文本排列方向,可以是从左到右或者从右到左。

想知道更多关于这些app属性、它们依赖的类型以及那些国际化的Flutter app通常是如何的,可以继续阅读下面内容。

2. 高级语言环境定义

一些具有多个变种的语言仅用语言代码是无法合适地区分的。例如,为了完全区分具有多个变种的中文,需要指定语言代码、脚本代码和代码。这是因为存在简体和繁体的文字系统,以及使用相同文字系统写的字符的地域性差异。为了让CN、和HK这三个不同的/地区代码能够完整地表达每个变种的中文,你应该包括以下支持的语言环境:

// 完整的中文支持,包括CN、和HK

supportedLocales: [const Locale.fromSubtags(languageCode: 'zh'), // 通用中文 'zh'const Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hans'), // 通用简体中文 'zh_Hans'const Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hant'), // 通用繁体中文 'zh_Hant'const Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hans', countryCode: 'CN'), // 'zh_Hans_CN'const Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hant', countryCode: ''), // 'zh_Hant_'const Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hant', countryCode: 'HK'), // 'zh_Hant_HK']这种明确的完整定义可以确保您的app能够区分并为这些/地区代码的所有组合的用户提供完全地道的本地内容。如果用户没有指定首选的语言环境,那么我们就会使用最接近的匹配,在这个版本的DemoApp中,存在一个名为DemoLocalizations的类,这个类管理着应用程序的本地化内容。它包含了所有语言的翻译映射,直接关联到每个特定的语言代码。

以下是DemoLocalizations类的定义:

dart

class DemoLocalizations {

DemoLocalizations(this.locale);

final Locale locale;

static DemoLocalizations of(BuildContext context) {

return Localizations.of(context, DemoLocalizations);

}

static Map> _localizedValues = {

'en': { // English translations

'title': 'Hello World',

},

'es': { // Spanish translations

'title': 'Hola Mundo',

},

};

String get title { // Get translated title based on the current locale

return _localizedValues[locale.languageCode]['title'];

}

接下来,是负责加载本地化资源的DemoLocalizationsDelegate类。在最小实现的应用中,它与常规的LocalizationsDelegate有些不同。它的load方法返回了一个SynchronousFuture,因为不需要异步加载资源。以下是该类的主要代码:

dart

class DemoLocalizationsDelegate extends LocalizationsDelegate {

const DemoLocalizationsDelegate(); // Constructor

@override // Checks if the locale is supported by the app

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

@override // Load localizations based on the provided locale

Future load(Locale locale) { // Load localizations synchronously in this case

return SynchronousFuture(DemoLocalizations(locale)); // Return a DemoLocalizations instance for the provided locale

}

@override // Determines if the localizations should be reloaded when the app state changes (false in this case)

bool shouldReload(DemoLocalizationsDelegate old) => false; // Reload localizations only when necessary (e.g., when language changes)

对于需要支持新语言的app开发,如果所需的语言不在GlobalMaterialLocalizations中,开发者需要进行额外的本地化工作。这涉及到为该语言提供大约70个字和词的翻译。下面是一个示例,展示了如何添加对白俄罗斯语的支持。我们需要创建一个新的GlobalMaterialLocalizations子类(命名为BeMaterialLocalizations)和一个新的LocalizationDelegate子类(命名为_BeMaterialLocalizationsDelegate)。然后,通过实例化BeMaterialLocalizations的delegate并将其添加到app的localizationsDelegates列表中,app就可以使用该本地化资源了。这是一个大致的例子:使用提供的工具完成这个过程可能会更有效率且方便一些。这样的操作可能需要涉及到Xcode项目的设置更改等复杂操作,例如在iOS项目中更新Info.plist文件以支持新的语言环境等步骤可能也是必需的。具体来说,包括运行一些命令来生成和更新相关的本地化文件等。有关更多关于如何使用Dart intl包和这些步骤的详细信息,建议查阅相关的官方文档或教程以获取更详细的指导。

  丹凤千字科普:法语dir什么意思(详细资料介绍)