PHP-在PHP项目中如何简易、高效的实现网站多语言

发布于 2017-01-19 14:28:35 字数 80 浏览 1224 评论 7

请大家谈谈在项目中如何实现多语化,要求对语言包维护方便、智能识别用户语种等,另外方法需简易,高效,便于管理,特别是面对语言种类较多(10种以上)。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

夜无邪 2017-10-02 18:47:22

我喜欢使用数组的方式来实现...

有点: 我觉得很好修改,也能使用左右值的表结果将其存储到数据库中,然后实现个数据字典 管理
功能来 维护这种东西 加上缓存 应该能实现大部分的需要.

与 gettext 相比 可以做到 按需加载的目的,能多层次嵌套

<?php
/**
* 国际化多语言组件
* // 获取翻译 xser::translate('ui/admin/title')
*/
class xser_languages {

const g_conf_key = '__xser#i18n_multi_languages' ;
protected $_dict_files ;

public function __construct(){
xser::replaceIni(g_conf_key,array());
$this->_dict_files = array();
}
public function load($dict_name,$language='',$fdict_extname='.php'){
$language = $this->get_language($language);
$abs_fpath = "{$language}/{$dict_name}{$fdict_extname}" ;
$fdict = xser::ini('application_dir') . "/language/{$abs_fpath}";
// 预防重复加载
if (in_array($abs_fpath,$this->_dict_files)) return ;
if (file_exists($fdict) && is_readable($fdict)){
$dict = include($fdict) ;
if (!is_array($dict)) $dict = array();

// 定义数据结构
xser::changeIni(g_conf_key,array(
$language => array(
$dict_name => $dict
)
));

// 将已经加载的字典文件储存
$this->_dict_files[] = $abs_fpath ;
return ;
}
throw new Exception("cannot read language dict file:{$abs_fpath}");
}

protected function get_language($language = ''){
if (!xser::varify_provider()->not_null_string($language))
$language = xser::ini('i18n_default_language') ;
return strtolower($language) ;
}

// 只接受字符串格式的key,对于层次化的key,可以在 $key 中使用/符号来指定
public function get($key, $language=''){
if (!xser::varify_provider()->not_null_string($key))
return null ;
$language = $this->get_language($language);
$_key = g_conf_key . "/{$language}/{$key}" ;
$value = xser::ini($_key,'__xser#null');
if ($value === '__xser#null')
return htmlspecialchars("{{$key}}");
return $value ;
}
}

language/utf8-zh/ui.php
<?php
/**
* 中文版 国际化资源文件
*/

// xser::translate('ui/admin/title');
return array(
'admin' => array(
'title' => 'Time In China 后台管理系统' ,
'welmsg' => ' 您好,感谢登陆使用!',
'logout' => '您已经成功退出了登录。',

'invalid' => array(
'imgcode' => '您输入的验证码无效,或者验证码已经过期。请重新登录。',
'username' => '您输入的用户名不存在,请检查后重新登录。',
'password' => '您输入的密码不正确,请检查后重新登录。',
)
) ,
'site' => 'http://www.timeinchina.com' ,
'version' => 'Copyright © 2009-2011 www.timeinchina.com' ,
'username' => '管理员:',
'password' => '密码:',
'imgcode' => '验证码:',
'submit' => ' 登 陆 ',
'cancel' => ' 取 消 ',

'languages' => '界面语言:',
);

可参见我博客

瑾兮 2017-09-30 07:05:40

我在我的项目中是这样子做的:
1、建立多个语言包,放于language文件夹;
比如:
language/zh_cn.php
language/zh_hk.php
language/en.php

2、网站中访问的地址为:
http://domain.com/zh_cn/
http://domain.com/zh_hk/
http://domain.com/en/
用urlrewrite把这些访问地址解析成为
http://domain.com/index.php?lang=zh_cn
http://domain.com/index.php?lang=zh_hk
http://domain.com/index.php?lang=en

3、在index.php引入:require('language/'.$lang.'.php');
即可以引入相应的语言包。
当然这个 $lang 需要过滤下,因为安全问题。

泛泛之交 2017-09-10 01:26:49

php中最常见的就是gettext了,效率高(二进制mo,有缓存),语言包易于管理(poedit工具)。如果需要根据用户浏览器语言动态判断输出的语言的话,需要根据浏览器传递的值来判断下语言包的选择:$_SERVER['HTTP_ACCEPT_LANGUAGE']

但是使用中有一点需要注意,运行过程中更新了语言包的话,需要重启web服务,否则会随机出现未翻译的内容,似乎是缓存造成的。
之前发现wordpress更新语言包后不需要重启web即时生效,查看了下它的源代码,发现他是用php直接解析的mo二进制串,这种方法效率应该不如gettext扩展。

归属感 2017-08-22 14:00:49

如果是我做话我的思路大概是这样的,先分析一下问题,要求多语言可能就是页面的功能导航与提示等实现多语言,如果说是内容也多语言那只能是在数据库存多份内容了,如果只是导航与提示多语言的话可以把这些内容写成配置文件,程序里用变量代替,至于判断用户的语言环境可以根据http请求头$_SERVER['HTTP_ACCEPT_LANGUAGE']判断,或是ip就进地区判断,也可以让用记自行选择记cookie,是注册用户的话可以按用户注册时候选择的语言进行显示。

偏爱自由 2017-07-19 01:03:36

用zend的translate组件, 把翻译的原文和译文放在数据库里。自己写个方法生成CSV,PHP有现成的函数。然后用zend_translate读取CSV文件

夜无邪 2017-07-09 13:28:26

判断方面愚见
优先级如下
1 已经登录用户所设置语种
2 用js 判断浏览器语种
3 客户端IPwhois记录。

请补充!

甜柠檬 2017-03-03 12:00:05

说下我们项目现在使用的基本流程。

1.创建各个语种语言包,放在i18n目录下:
i18n/en.inc.php
i18n/fr.inc.php
i18n/zh.inc.php
i18n/tw.inc.php

2.创建个配置文件config.inc.php,对这些语言包的管理。
$language = array(
'en' => 'en.inc.php', // English (en)
'en-gb' => 'en.inc.php', // English (en)
'fr' => 'fr.inc.php', // French (fr)
);

3.对获取语种的优先级:
用户选择(会写cookie)> cookie > $_SERVER['HTTP_ACCEPT_LANGUAGE'] > 默认语种

4.根据获取到的语种在config.inc.php查找到对应的语言包。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文