Flutter配置多语⾔,国际化之后的优化
Flutter配置国际化,多语⾔步骤优化
请先参考中的intl章节完成国际化配置⾄能够使⽤
其中intl.sh⽂件的部分注释
# lib/i10n/localization_intl.dart 要进⾏翻译的(其中包含有Intl相关⽅法)⽂件
# i10n-arb/intl_*.arb 转换后的.arb⽂件 2
# i10n-arb 存放1转换后的相应.arb⽂件的⽬录 3
# lib/i10n 存放2再转换成相应dart⽂件的⽬录 4
# 转换成arb。传⼊3和1
flutter pub pub run intl_translation:extract_to_arb --output-dir=i10n-arb lib/i10n/localization_intl.dart
# 将arb转化成相关dart⽂件。传⼊4,1和2
flutter pub pub run intl_translation:generate_from_arb --output-dir=lib/i10n --no-use-deferred-loading lib/i10n/localization_intl.dart i10n-arb/intl_*.arb 1. 抽离要翻译字段
删除掉lib/i10n/localization_intl.dart中以下部分
String get title {
ssage(
'Flutter APP',
name: 'title',
desc: 'Title for the Demo application',
);
}
新建lib/i10n/mixins⽂件夹
mixins⽂件夹中新建commom.dart⽂件并写⼊
// ignore_for_file: non_constant_identifier_names
import 'package:intl/intl.dart';
mixin Commom {
// 加上前缀⽅便在.arb⽂件中区分
String get commom_title => ssage(
'Flutter APP',
name: 'commom_title', // 在.arb⽂件中显⽰的字段名
desc: 'Title for the Demo application');
}
在lib/i10n/localization_intl.dart引⽤
// ...
import './mixins/commom.dart';
// ...
class DemoLocalizations with Common {
// ...
修改intl.sh⽂件
只修改了1相应的路径
# lib/i10n/mixins/** 要进⾏翻译的(其中包含有Intl相关⽅法)⽂件 1
# i10n-arb/intl_*.arb 转换后的.arb⽂件 2
# i10n-arb 存放1转换后的相应.arb⽂件的⽬录 3
# lib/i10n 存放2再转换成相应dart⽂件的⽬录 4
# 转换成arb。传⼊3和1
flutter pub pub run intl_translation:extract_to_arb --output-dir=i10n-arb lib/i10n/mixins/**
# 将arb转化成相关dart⽂件。传⼊4,1和2
flutter pub pub run intl_translation:generate_from_arb --output-dir=lib/i10n --no-use-deferred-loading lib/i10n/mixins/** i10n-arb/intl_*.arb 完成
2. 简化翻译步骤(需要安装)
参考当前的翻译步骤为
lib/i10n/mixins/下相关⽂件添加要翻译的字段
执⾏./intl.sh
i10n-arb/下相关⽂件进⾏相应的翻译
执⾏./intl.sh
缺点
需要在多处相关⽂件进⾏相关改动
翻译时的.arb⽂件需要和i10n-arb/intl_messages.arb进⾏对⽐,并进⾏⼿动更改
若是修改之前的翻译字段,可能需要对部分.arb⽂件进⾏相关的⼿动修改
需要多次执⾏./intl.sh
优化思路
原步骤中第⼀次执⾏./intl.sh是为了执⾏其中第⼀条命令。
第⼆次执⾏./intl.sh是为了执⾏其中第⼆条命令。
因此只要将对.arb⽂件进⾏相关翻译通过命令⾏执⾏即可
优化后的步骤
lib/i10n/mixins/下相关⽂件添加要翻译的字段
执⾏./intl.sh
如何优化
根⽬录下添加node_intl.js⽂件
const fs =require("fs");
const path =require("path");
// 要转换的语⾔(默认语⾔不填)
const localeList =["en","ja"];
// 获取命令⾏参数
const params = process.argv.splice(2);
// 判断是否为Object-JSON格式
function canParse(str){
try{
try{
return(
str !==""&&
typeof str =="string"&&
String.call(JSON.parse(str))==="[object Object]" );
}catch(error){
return false;
}
}
// 对⽂件根据locale 进⾏修改
// locale = "en";
// 原来:
/
/ "commom_tab_home": "⾸页",
// "@commom_tab_home": {
//  "description": "{\"desc\":\"底部tab中的⾸页\",\"en\":\"Home\"}",
//  "type": "text",
//  "placeholders": {}
// },
// 修改后:
// "commom_tab_home": "Home",
// "@commom_tab_home": {
//  "description": "{\"desc\":\"底部tab中的⾸页\",\"en\":\"Home\"}",
//  "type": "text",
/
/  "placeholders": {}
// },
function translateAccordingToLocale(fileContent){
const newFileContentObj ={};
// 复制原⽂件内容,仅修改locale
localeList.forEach((locale)=>{
let data =JSON.parse(fileContent);
data["@@locale"]= locale;
newFileContentObj[locale]= data;
});
// 遍历原⽂件内容,根据description进⾏相应转换
const data =JSON.parse(fileContent);
for(const key in data){
if(data.hasOwnProperty(key)&&/^@[^@]/.test(key)){
const element = data[key]["description"];
if(canParse(element)){
const desc =JSON.parse(element);
// 根据description进⾏相应转换
localeList.forEach((locale)=>{
const translateToLocale = desc[locale];
translateToLocale &&
(newFileContentObj[locale][
]= translateToLocale);
});
}
}
}
solve(newFileContentObj);
}
// 写⼊arb⽂件
function writeArb(fileContentObj){
return new Promise((resolve, reject)=>{
for(const locale in fileContentObj){
if(fileContentObj.hasOwnProperty(locale)){
fs.writeFile(
path.join(__dirname,`${params[0]}/intl_${locale}.arb`), // 写⼊格式化后的⽂件内容
JSON.stringify(fileContentObj[locale],null,2),
JSON.stringify(fileContentObj[locale],null,2),
(err)=> err &&reject(err)
);
}
}
});
}
// 读取源arb⽂件
function readArb(){flutter开发app
return new Promise((resolve, reject)=>{
if(params.length ==0)return reject("请传⼊相关.arb⽂件所在⽬录");
path.join(__dirname,`${params[0]}/intl_messages.arb`),
(err, data)=>(err ?reject(err):resolve(data))
);
});
}
readArb()
.then(translateAccordingToLocale)
.then(writeArb)
.catch((e)=>{
<(`Node_Intl Error: ${e}`);
});
修改./intl.sh⽂件
原来两条命令中新增⼀条命令
# lib/i10n/mixins/** 要进⾏翻译的(其中包含有Intl相关⽅法)⽂件 1
# i10n-arb/intl_*.arb 转换后的.arb⽂件 2
# i10n-arb 存放1转换后的相应.arb⽂件的⽬录 3
# lib/i10n 存放2再转换成相应dart⽂件的⽬录 4
# 转换成arb。传⼊3和1
flutter pub pub run intl_translation:extract_to_arb --output-dir=i10n-arb lib/i10n/mixins/**
# 优化翻译步骤传⼊3
node node_intl.js i10n-arb
# 将arb转化成相关dart⽂件。传⼊4,1和2
flutter pub pub run intl_translation:generate_from_arb --output-dir=lib/i10n --no-use-deferred-loading lib/i10n/mixins/** i10n-arb/intl_*.arb
翻译格式
lib/i10n/mixins/commom.dart中
desc格式需要为Object-JSON格式
// ignore_for_file: non_constant_identifier_names
import 'package:intl/intl.dart';
mixin Commom {
// 加上前缀⽅便在.arb⽂件中区分
String get commom_title => ssage(
'Flutter APP',
name: 'commom_title', // 在.arb⽂件中显⽰的字段名
desc: '{"desc":"Title for the Demo application","en":"英⽂翻译在这","ja":"⽇语翻译在这"}');
}
完成

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。