Sakurairo 主题多语言完美方案

发布于 2024-06-23  13 次阅读


Sakurairo 主题内置了简/繁体中文、日语、英语等多种语言,但是在不使用一些小手段的情况下是看不到的。在折腾了数日后,我终于摸索出完美的适用于 Sakurairo 主题的多语言解决方案,其他主题也可以,也适配移动端。


经检查,WP Multilang 插件与 Markdown 不兼容,代码块中的尖括号 < > 会被解析为 HTML,使用 HTML 转义也无法避免。现已卸载该插件,并以此警示后人。本文中涉及多语言功能的部分现已失效,仅当本文是 Sakurairo 主题的简单优化教程即可。后续会删除相关内容。

0. 事前准备

在我的方案中,你需要做如下的准备:

  • Sakurairo 主题
  • Code Snippets 插件
  • Loco Translate 插件
  • WP Multilang 插件

如果使用的不是 Sakurairo 插件,也可以用本文中类似的方式实现,但需要一点变通。

接下来我们会一步一步实现一个支持简体中文、日语、英语的多语言系统。

叠甲:我并 **不懂** php ,有些东西都是分析 Sakurairo 的源码加上 Bing 搜索学习到的,还有的 php 代码是用 AI 生成的,轻喷+独立思考。

1. 基本多语言功能

安装好 WP Multilang 插件。这是一个很小众的插件,但是我个人体感觉得比 PolyLang 这些知名度高的插件好用(限定免费版),尤其是在我和 WordPress 固定链接斗智斗勇的时候。进入其设置中,在默认的 General 选项卡中,设置默认语言为简体中文。往下有个 Use prefix 选项,建议不勾选,这样默认语言就不需要在链接中写出来,例如 https://keqing.moe/timeline/ ,否则就要写 https://keqing.moe/zh/timeline/ 了。进入 Languages 选项卡,依次添加日语和英语。其他设置酌情勾选。

现在,在你的站点链接的域名和路径中间加上语言代码,如ja、en,检查一下网页内容是否变成了对应的语言。

当你设置页面或者撰写文章时,也可以看到上方有一个可以切换语言的选项卡,你可以用它设置多语言页面或者为你撰写的文章补充翻译。


2. 添加语言切换小工具

在 Sakurairo 主题中,右下角有个小工具面板,我们将要在这个面板中添加一个用于切换语言的下拉选择框。

在默认情况下,只有在页面滚动条不在最顶端的情况下才会(和回到顶部按钮一起)显示,对于一些较短的页面,或者是在移动端访问网页时,该面板无法被调出。所以我们要先让这个面板按钮永久存在。

2.1. 使移动端能够调出小工具面板

主题中默认是通过使用响应式布局,检测到窗口宽度小于 860 像素,则设置小工具面板的 displaynone 。我的解决方式是也用响应式布局对冲一下,在 WordPress 后台的 iro 主题设置 > 其他设置 > 低使用设置中,自定义 CSS 样式处添加一段 CSS :

@media (max-width:860px) {
  .widget-area {
    display: flex;
  }
}

2.2. 使面板按钮一直显示

通过审查元素,我们可以发现,面板按钮的显示与否是使用 JavaScript 控制的:当滑到顶部时,设置 style 属性的值为 transform: scale(0); ;当滑到下方时,设置为 transform: scale(1); 。所以我们只要添加一段有 !important 强调的 CSS 把这个内联样式覆盖掉就行了,方法同上:

#changskin {
    transform: scale(1)!important;
}

2.3. 制作用于切换语言的下拉选择框

在 Code Snippets 插件中添加一段 php 代码,用于注册一个简码 [language_selector] :

add_shortcode( 'language_selector', 'language_selector_handler_function' );

function language_selector_handler_function(){
    $langs = [
        'zh' => '简体中文',
        'ja' => '日本語',
        'en' => 'English(US)'
    ];
    $currentUri = $_SERVER['REQUEST_URI'];
    $currentPathname = parse_url($currentUri, PHP_URL_PATH);
    $currentLangCode = 'zh';
    foreach (['zh', 'ja', 'en'] as $langCode) {
        if (strpos($currentPathname, "/{$langCode}/") === 0) {
            $currentLangCode = $langCode;
            break;
        }
    }
    $result = '<select title="language" name="language-selector" onchange="changeLang(location.pathname,this.value);">';
    foreach ($langs as $langCode => $langName) {
        $selected = ($langCode == $currentLangCode) ? ' selected' : '';
        $result .= '<option selected="selected" value="' . $langCode . '">' . $langName . '</option>';
    }
    $result .= '</select>';
    return $result;
}

这个简码的作用就是,生成一个下拉选择框,选项是三种语言,在网页加载时,会自动选中当前语言,在选项改变时调用函数 changeLang 切换语言。接下来实现这个函数,在 iro 主题设置的页尾附加代码中添加一段 JS 代码:

const langRegex = /(?<=^\/)[a-z]+/;
const langs = new Map([
    ['zh', '简体中文'],
    ['ja', '日本語'],
    ['en', 'English(US)'],
]);
const defaultLangCode = 'zh';
const getRawLang = path => {
    let result = path.match(langRegex)?.[0];
    if (langs.has(result)) {
        return result;
    } else {
        return '';
    }
}
const getLangCode = path => {
    let lang = getRawLang(path);
    if (lang) {
        return lang;
    } else {
        return defaultLangCode;
    }
};
const getLangPrefixLength = path => {
    let lang = getRawLang(path);
    if (lang) {
        return ('/' + lang).length;
    } else {
        return 0;
    }
};
const getRawPath = path => {
    return path.substring(getLangPrefixLength(path));
};
const changeLang = (path, langCode) => {
    let prefix = '';
    if (langCode != defaultLangCode) {
        prefix = '/' + langCode;
    }
    location.pathname = prefix + getRawPath(path);
};

做出来效果就是这样的:

2.4. 在 WordPress 小工具中添加下拉选择框

在 WordPress 后台左边侧边栏进入外观 > 小工具,以你喜欢的方式添加我们上面的那个简码。保存后打开一个页面,点击右下面板按钮,就能看到我们的成果了。

3. 添加翻译文本

接下来演示如何使用 Loco Translate 插件进行翻译工作。我们先试着在上一小节添加的下拉选择框左侧放置一段提示文本,它会根据当前语言,选择对应的翻译版本:

语言 文本内容
简体中文 语言设置
日本語 言語を変更する
English(US) Change the language

在 WordPress 后台左边侧边栏点击 Loco Translate ,点击当前主题,见到如下界面:

点击编辑模板,然后点添加,修改源文为 "Change the language" 。注意,这里的源文对应的是英语。保存后返回上一页。在上方的语言处,选择你要翻译的语言(简体中文或日语),鼠标放上去,点编辑。在新的界面找到你刚加的源文,然后输入翻译,然后保存。

接下来我们要在 WordPress 小工具界面调用这段翻译文本。调用翻译文本要在 php 中操作,所以我们再添加一个简码 [tr] :

add_shortcode( 'tr', 'tr_handler_function' );

function tr_handler_function( $atts, $content){
    return esc_html__($content,'sakurairo');
}

接下来,回到 WordPress 小工具编辑页面处,在 &lsqb;language_selector&rsqb; 的前面添加 &lsqb;tr&rsqb;Change the language&lsqb;/tr&rsqb;

演示效果:语言设置(切换语言时,我文章中的演示文本也会变化哦)

留一个小挑战:为 Sakurairo 的时间轴页面添加翻译吧。

4. 一点小小补救方案

然而 WP Multilang 插件有其局限性,例如在 Sakurairo 主题提供的说说功能(WordPress 后台左边有对应选项),是没有办法被这个插件翻译的,我已经给官方发了邮件,但他们不理我。不过好在咱们有一个补救方案:使用 &lsqb;:zh&rsqb;中文&lsqb;:ja&rsqb;日本語&lsqb;:en&rsqb;English(US)&lsqb;:&rsqb;。但是这个好像有 bug ,会吞掉前后的文本,所以最好还是只用在标题中。

我们也可以再注册一个自定义简码,仿照上面的样例即可,此处就不赘述了。


至此,我们已经完美实现了多语言化,享受语言吧!