手写简单的多语言包代码,随便跑跑
/**
* 多语言
*/
function trans($text, $vars = [], $lang = ''){
$lang = strtolower(trim($lang));
if(!$lang){
// 从header里面获取语言, header里的lang参数
$lang = $_SERVER['HTTP_LANG'] ?? 'cn'; // 'zh-cn
}
// 获取翻译语言包
$dist = get_trans($lang);
// 翻译没有则直接返回
if(!isset($dist[$text])){
return $text;
}
// 直接翻译, 不带参数
if(empty($vars)){
return isset($dist[$text]) ? $dist[$text] : $text;
}
// 翻译里面带参数
foreach($vars as $key => $val){
$text = str_replace('{@' . $key . '@}', $val, $dist[$text]);
}
return $text;
}
function get_trans($lang){
// 已翻译语言
if(!in_array($lang, [
'cn',
'en',
'vi',
])){
// 默认翻译语言
$lang = 'cn';
}
// 引入语言包,语言包代码 <?php return array(["成功" => "成功"]);
// $lang = require_once __DIR__ . '/trans/' . $lang . '.php';
// return $lang;
// cli 测试
$cn = [
"成功" => "成功",
"失败" => "失败",
"验证码发送失败" => "验证码发送失败",
"最低付款金额为元" => "最低付款金额为{@amount@}元",
];
$en = [
"成功" => "success",
"失败" => "fail",
"验证码发送失败" => "Verification code sending failed",
"最低付款金额为元" => "The minimum payment amount is {@amount@} yuan",
];
$vi = [
"成功" => "thành công",
"失败" => "thất bại",
"验证码发送失败" => "Gửi mã xác minh thất bại",
"最低付款金额为元" => "Số tiền thanh toán tối thiểu là {@amount@} đồng",
];
return $$lang;
}
// 测试多语言
$success = "成功";
echo '中文: ' . trans($success, [], 'cn').PHP_EOL;
echo '英文: ' . trans($success, [], 'en').PHP_EOL;
echo '越南语: ' . trans($success, [], 'vi').PHP_EOL;
$limitPay = "最低付款金额为元";
$amount = ['amount'=>100];
echo '中文: ' . trans($limitPay, $amount, 'cn').PHP_EOL;
echo '英文: ' . trans($limitPay, $amount, 'en').PHP_EOL;
echo '越南语: ' . trans($limitPay, $amount, 'vi').PHP_EOL;
运行结果
中文: 成功
英文: success
越南语: thành công
中文: 最低付款金额为100元
英文: The minimum payment amount is 100 yuan
越南语: Số tiền thanh toán tối thiểu là 100 đồng
为什么我要手写这个翻译,而不是使用多语言包呢?在外包呆过的估计都懂,外包的项目都是比较杂乱的,我接手的这个项目原本是存在 多语言包
的,并且代码是使用 英文
作为翻译的 key
值,这是很标准的翻译,但是代码经历了二开,三开,n开。里面出现了 中文key
,出现了3,4个自定义返回入口。所以只能手写一个中文翻译功能了,把系统原本返回的中文内容做二次加工,不过这都不是难受的,最难受的是其它零散,直接 return,或者 echo json_encode([]);exit; 的接口
本作品采用《CC 协议》,转载必须注明作者和本文链接
有几个建议,我觉得你可以考虑一下,只是建议。。
%contents%
|{contents}
|:contents
单开一个回复来说吧。从业多年我也干了几票外包,也用过一些外包。所以你对外包工作定性的“杂乱”,从我的经验上看并非全部如此。或者换个说法,即便不是外包,项目发展也会随着对代码控制力的下降变得“杂乱”,而这些失控的代码也是从一次次微小的改动积累的。
也是从我的经验来说,如果是做外包业务,最好能用透一两个框架,并严格按照项目的范式去使用。像多语言这种功能基本上都有考虑过,也都用的是成熟的项目来实现的。
分不分模块,如何分模块,因项目和团队的技术栈而异。但少量定制,多复用,可传承,是健壮外包团队的生存之道。我认为我们做的比较彻底了,直接用 composer 做模块的安装和编排。
如果外包团队只是不断地重复自己,对自己来说就没有技术资产的积累;对工程师来说也没有太多技术上的提升,不如早点规划自己的下一步。