手写简单的多语言包代码,随便跑跑

/**
 * 多语言
 */
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 协议》,转载必须注明作者和本文链接
reading
白小二
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 7
陈先生

有几个建议,我觉得你可以考虑一下,只是建议。。

  • 语言一般是分模块的,类似 shop/goods/properties shop/order/pay_methods
  • 可以考虑根据国际语言标识来创建对应的文件或者目录来包含你的语言文件。
  • 一般模板都会使用大家公认的模板用法,例如 %contents% | {contents} | :contents
11个月前 评论
白小二 (楼主) 11个月前
白小二 (楼主) 11个月前
sanders 11个月前
白小二 (楼主) 11个月前
白小二 (楼主) 11个月前
sanders

单开一个回复来说吧。从业多年我也干了几票外包,也用过一些外包。所以你对外包工作定性的“杂乱”,从我的经验上看并非全部如此。或者换个说法,即便不是外包,项目发展也会随着对代码控制力的下降变得“杂乱”,而这些失控的代码也是从一次次微小的改动积累的。

也是从我的经验来说,如果是做外包业务,最好能用透一两个框架,并严格按照项目的范式去使用。像多语言这种功能基本上都有考虑过,也都用的是成熟的项目来实现的。

分不分模块,如何分模块,因项目和团队的技术栈而异。但少量定制,多复用,可传承,是健壮外包团队的生存之道。我认为我们做的比较彻底了,直接用 composer 做模块的安装和编排。

如果外包团队只是不断地重复自己,对自己来说就没有技术资产的积累;对工程师来说也没有太多技术上的提升,不如早点规划自己的下一步。

11个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!