
说明
Typecho 原生自带了翻译功能,但不支持随客户端语言自动切换。
我们可以通过获取客户端语言,替换原生翻译功能所调用的翻译文件,来实现自动切换翻译。
注意:需要先开启 Typecho 原生的多国语翻译功能。
官方文档 https://docs.typecho.org/translate/start
官方.po语言包 https://github.com/typecho/languages
大佬制作的.mo语言包https://github.com/ideshun/typecho-languages-mo
Typecho 并不支持.po 文件 所以要用.mo包
操作
把下载完解压得到.mo 文件,放到 Typecho 根目录下的 /usr/langs/ 文件夹下,如果没有langs文件夹,需要手动创建。
在控制台 -> 设置 -> 基本 设置页面就可以看到语言选项了。
配置自动切换语言
Typecho 根目录下 /var/Typecho/I18n.php 文件(注意是文件不是那个文件夹,在下面找同名PHP文件)。
找到如下内容:
/**
* 初始化语言文件
*
* @access private
*/
private static function init()
{
/** GetText支持 */
if (false === self::$_loaded && self::$_lang && file_exists(self::$_lang)) {
self::$_loaded = new Typecho_I18n_GetTextMulti(self::$_lang);
}
}在 “初始化语言文件”和 “GetText支持” 之间添加
/** 检查客户端语言 */
if(!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])){
$lang = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$langConfig = substr($lang,0,5);
if(preg_match("/zh-cn/i",$lang)){
$langConfig = "zh_CN";
}
elseif(preg_match("/zh/i",$lang)){
$lang = "zh_TW";
}
else{
$langConfig = "en_US";
}
}else{
$langConfig = 'en_US';
}
$dir = defined('__TYPECHO_LANG_DIR__') ? __TYPECHO_LANG_DIR__ : __TYPECHO_ROOT_DIR__ . '/usr/langs';
$langConfig = ($dir . '/' . $langConfig.".mo");
添加后的
/**
* 初始化语言文件
*
* @access private
*/
private static function init()
{
/** 检查客户端语言 */
if(!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])){
$lang = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$langConfig = substr($lang,0,5);
if(preg_match("/zh-cn/i",$lang)){
$langConfig = "zh_CN";
}
elseif(preg_match("/zh/i",$lang)){
$lang = "zh_TW";
}
else{
$langConfig = "en_US";
}
}else{
$langConfig = 'en_US';
}
$dir = defined('__TYPECHO_LANG_DIR__') ? __TYPECHO_LANG_DIR__ : __TYPECHO_ROOT_DIR__ . '/usr/langs';
$langConfig = ($dir . '/' . $langConfig.".mo");
/** GetText支持 */
if (false === self::$_loaded && $langConfig && file_exists($langConfig)) {
self::$_loaded = new Typecho_I18n_GetTextMulti($langConfig);
}
}