在PHP项目里,把多语言文案放到JSON结构中是一种轻量且易维护的国际化方案。我们通常按语言代码作为键,把对应文本存成嵌套数组或对象,再序列化给前端或接口调用方。
用数组组织多语言文本
最简单的方式是定义一个以语言为键的关联数组,里面放具体文案。这样后续扩展语言只改这个数组即可。
<?php
// 多语言文本集中管理
$i18n = array(
'zh' => array(
'welcome' => '欢迎访问',
'logout' => '退出登录'
),
'en' => array(
'welcome' => 'Welcome',
'logout' => 'Logout'
)
);
// 根据参数取语言,默认中文
$lang = isset($_GET['lang']) ? $_GET['lang'] : 'zh';
if (!isset($i18n[$lang])) {
$lang = 'zh';
}
// 输出JSON,保留中文不转码
header('Content-Type: application/json; charset=utf-8');
echo json_encode($i18n[$lang], JSON_UNESCAPED_UNICODE);
?>
从外部JSON文件加载
当文案变多时,建议把每种语言存成独立JSON文件,PHP用file_get_contents读取并json_decode成数组。
<?php // 读取英文语言包 $json = file_get_contents(__DIR__ . '/lang/en.json'); $texts = json_decode($json, true); echo $texts['welcome']; ?>
请求时动态切换语言
实际接口常根据Accept-Language或token里的区域信息决定语言。下面示范用请求头判断并回退。
<?php
function getLang() {
$hdr = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : '';
if (strpos($hdr, 'zh') !== false) return 'zh';
if (strpos($hdr, 'en') !== false) return 'en';
return 'zh';
}
$lang = getLang();
$map = array(
'zh' => array('tip' => '操作成功'),
'en' => array('tip' => 'Success')
);
echo json_encode($map[$lang], JSON_UNESCAPED_UNICODE);
?>
注意事项
- 始终用
JSON_UNESCAPED_UNICODE避免中文被转成u形式。 - 语言键建议用ISO标准如zh-CN、en-US,便于扩展。
- 缺失翻译时应回退默认语言,不要直接报错。
把国际化文本放进JSON不是替代专业i18n库,但适合小型接口与快速开发。