Typecho多语言自动切换翻译

Typecho多语言自动切换翻译

说明

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);
    }
}

标签: 多语言 自动切换 翻译