天気雨

All things bright and beautiful.

Theme Refrain made by Eiko

Proudly powered by WordPress

给 WordPress 主题添加多语言支持

写主题写得头都大了,结果翻译那部分还一堆屁问题,顶不住了就查了下文档,顺便记录一下。

插件也可以这么玩,步骤都差不多。

参考文章:WordPress – Poedit: Translation Secrets

20200405 Update:我屌,发现一个 WordPress 插件(Loco Translate)也能整翻译,跪了。

翻译前准备

首先给主题 加入多语言支持,就是往 functions.php 里面塞一段:

add_action('after_setup_theme', 'wpdocs_theme_setup');
 
/**
 * Load translations for wpdocs_theme
 */
function wpdocs_theme_setup(){
    load_theme_textdomain('你的主题标识', get_template_directory() . '/languages');
}

可以把函数名 wpdocs_theme_setup 改成你自己想要的且不冲突的,你的主题标识 则必须要独一无二不冲突,一般可以用主题名字啥的。而后面的 /languages 啥的那串是指把翻译文件放在那个文件夹里面,如果你喜欢的话也可以改,不填那个参数就是放在主题根目录。

然后下载个 PoEdit,用来提取主题内的需要翻译的部分。这软件有收费版,收费版虽然可以一键快捷提取 WordPress 相关翻译部分,但是我们又不会用几次。

开始折腾代码

然而基本上自己写的主题都是写死的,那么就需要改动主题内的文字了。以下先介绍有哪部分:

  • __()
  • _e()
  • __ngettext()
  • _n()
  • __ngettext_noop()
  • _n_noop()
  • _x()
  • _nx()
  • _nx_noop()
  • _ex()
  • esc_attr__()
  • esc_attr_e()
  • esc_attr_x()
  • esc_html__()
  • esc_html_e()
  • esc_html_x()

是的还挺多的,简单介绍几种常用的。

__

是的没错,两个下划线,这就是最基础的用法。举个栗子:

register_sidebar( [
    'name'          => __('Sidebar - Index and Archives', 'refrain'),
    'id'            => 'sidebar-index',
    'description'   => __('You can put your widgets here, and it will display in index pages and archives pages.', 'refrain'),
    'before_widget' => '<section id="%1$s" class="widget %2$s">',
    'after_widget'  => '</section>',
    'before_title'  => '<h2 class="widget-title"><span>',
    'after_title'   => '</span></h2>',
] );

这是注册边栏那部分的,就很简单的把要翻译的部分圈起来就行了。

_e

不多说,举例:

<h3><?php _e('This is a h3.', 'eiko'); ?></h3>

没想到吧,其实就相当于 echo __('This is a h3.', 'eiko');,把 echo 的部分全部无脑改成 _e() 就好了。

_n

这个主题用得少一点,举个官方栗子

printf( _n( '%s person', '%s people', $count, 'text-domain' ), number_format_i18n( $count ) );

如果 $count=1 的话,则会输出 1 person,大于等于 2 的话就会输出 2 people,后面的 number_format_i18n 是把数字本地化的函数,不需要可以不用,直接写 $count

_x

栗子:

_x('Next', 'Page navigator', 'eiko');
_x('Next', 'Post navigator', 'eiko');

就是加个额外注释,每个 Next 的用途不一定一样嘛,所以就可以给上面那个翻译为 下一页,下面那个翻译为 下一篇

esc_attr__、esc_html__

其实就是做个处理,详情看文档到底转义了啥。esc_attresc_html

再其他的比如 _nx 就是 _n_x 的组合了,自己可以查查文档。

开始翻译

20200405:立即使用 Loco Translate,以获得更少的折腾体验,虽然 PoEdit 也很好用,但是不知道为啥我用的时候 PoEdit 不认识 _x_nx,很迷惑。

总之用 Loco Translate 的话就简单多了,不值得是不是 PoEdit 的故意限制,反正有些东西它不认。插件用起来还更简单,装好就会用。


全部代码改好之后就可以打开 PoEdit 惹,步骤如下:

直接点新建(Ctrl+N)

是的没错,然后选择语言,这里我就不重复 zh_CN 了,弄个不一样的举例子,反正都是创建翻译。

然后选择从源代码提取:

然后还没能选主题位置,先写一下信息:

然后点保存,如果上面代码的保存位置没改的话就是保存在你主题目录的 langusges 文件夹内。然后再点击从源码提取,这时候就可以设置主题目录了。设置如下:

我偏不买,哼

记得排除 .gitnode_modules,不然直接报错,因为文件太鸡儿多了(指 NodeJS 那一大坨)。源关键字也加一个,比如 __,没啥原因只是为了等下好操作。按确定之后保存一下,点 从代码更新,然后就可以看到提取到的内容了。

然后保存,暂时关掉,去文件夹找你的 .po 文件,用 VS Code 打开,装个扩展看高亮。

.po 文件的内容

这里主要是改 X-Poedit-KeywordsList 的内容,上面写了一大坨函数一个个加很烦是吧,那就复制粘贴下面这坨就行了:

"X-Poedit-KeywordsList: __;_e;_x:1,2c;_ex:1,2c;_n:1,2;__ngettext:1,2;"
"__ngettext_noop:1,2;_nx:4c,1,2;esc_attr__;esc_attr_e;esc_attr_x:1,2c;"
"esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop;_nx_noop:4c,1,2;"
"translate_nooped_plural\n"

保存,重新打开 PoEdit,重新更新一下,这不就全都出来了嘛,然后翻译完保存即可,你的主题就支持多语言辣。

WordPress 会读取编译好的 .mo 文件,需要别人帮忙翻译但是又不像给源码的话就把 .po 文件给别人就好了,然后翻译好了再发回来,用 PoEdit 打开保存一下就行了。

翻译 style.css 部分

主题不可能还留着主题名跟介绍不翻译吧,那么就在 style.css 加这个到主题信息部分:

Text Domain: eiko
Domain Path: /languages

然后随便找个地方比如 functions.php 里面随便找个地方写:

__('主题名字', 'eiko');
__('主题介绍那一大段或者几个字', 'eiko');

然后 PoEdit 提取一下翻译就行,或者跟官方主题一样直接写在 .po 里面:

官方的 2016 主题的 .po

然后整个主题就翻译好辣。

给 WordPress 主题添加多语言支持有 2 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

© 2020 天気雨 All rights reserved.