在Debian系統下,為Flutter應用處理國際化(i18n)主要涉及以下幾個步驟:
確保你已經在Debian系統上安裝了Flutter和Dart SDK。如果沒有安裝,可以參考Flutter官方文檔進行安裝。
如果你還沒有創建Flutter項目,可以使用以下命令創建一個新的項目:
flutter create my_flutter_app
cd my_flutter_app
使用Flutter的intl
包來處理國際化。首先,在pubspec.yaml
文件中添加intl
依賴:
dependencies:
flutter:
sdk: flutter
intl: ^0.17.0 # 請使用最新版本
然后運行以下命令來獲取依賴:
flutter pub get
在lib
目錄下創建一個名為l10n
的文件夾,并在其中創建一個名為app_en.arb
的文件(用于英文)和一個名為app_zh.arb
的文件(用于中文)。例如:
app_en.arb
{
"helloWorld": "Hello, World!"
}
app_zh.arb
{
"helloWorld": "你好,世界!"
}
使用flutter pub run intl_translation:generate_from_arb
命令生成本地化文件:
flutter pub run intl_translation:generate_from_arb --output-dir=lib/l10n --no-use-deferred-loading app_en.arb app_zh.arb
在pubspec.yaml
文件中添加本地化配置:
flutter:
generate: true
localizations-delegates:
- AppLocalizations.delegate
- GlobalMaterialLocalizations.delegate
- GlobalWidgetsLocalizations.delegate
supportedLocales:
- en
- zh
在你的Flutter應用中使用本地化字符串。首先,導入intl
包并創建一個Localizations
對象:
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:my_flutter_app/l10n/app_localizations.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: [
Locale('en', ''), // 英文
Locale('zh', ''), // 中文
],
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(AppLocalizations.of(context).helloWorld),
),
body: Center(
child: Text(AppLocalizations.of(context).helloWorld),
),
);
}
}
你可以通過創建一個LocaleSwitcher
Widget來允許用戶切換語言:
import 'package:flutter/material.dart';
import 'package:my_flutter_app/l10n/app_localizations.dart';
class LocaleSwitcher extends StatelessWidget {
final Locale currentLocale;
final Function(Locale) onLocaleChanged;
LocaleSwitcher({required this.currentLocale, required this.onLocaleChanged});
@override
Widget build(BuildContext context) {
return DropdownButton<Locale>(
value: currentLocale,
onChanged: (Locale? locale) {
if (locale != null) {
onLocaleChanged(locale);
}
},
items: <Locale>[
Locale('en', ''), // 英文
Locale('zh', ''), // 中文
].map<DropdownMenuItem<Locale>>((locale) {
return DropdownMenuItem<Locale>(
value: locale,
child: Text(AppLocalizations.of(context, locale).localeDisplayName),
);
}).toList(),
);
}
}
然后在MyApp
中使用這個LocaleSwitcher
:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: [
Locale('en', ''), // 英文
Locale('zh', ''), // 中文
],
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(AppLocalizations.of(context).helloWorld),
),
body: Center(
child: Text(AppLocalizations.of(context).helloWorld),
),
floatingActionButton: LocaleSwitcher(
currentLocale: Localizations.localeOf(context),
onLocaleChanged: (locale) {
Localizations.override(
context,
AppLocalizations.delegate,
locale,
);
// 重新加載應用以應用新的語言設置
Navigator.of(context).popAndPushNamed('/');
},
),
);
}
}
通過以上步驟,你就可以在Debian系統下為Flutter應用處理國際化了。