【发布时间】:2016-02-11 00:40:24
【问题描述】:
我对加载我的主题 .MO 文件感到有些困惑。 我在谷歌上做了很多搜索,我得到了一个可以运行的版本,但我不明白为什么。
首先,我在主题 CSS 文件中设置了我的文本域:
Text Domain: beauty
我从 Roots 主题开始,它执行 after_setup_theme 并在那里加载 MO 文件:
load_theme_textdomain('beauty', get_template_directory() . '/lang');
这个 MO 文件有一个 'beauty' 上下文和一个 'roots' 上下文。
MO 文件正在加载,因为当我转储 $l10n[$domain] 时,我看到我的 3 个值具有美丽的上下文。
为了篇幅,我只展示一个条目:
array (size=3)
'beautyInloggen' =>
object(Translation_Entry)[218]
public 'is_plural' => boolean false
public 'context' => string 'beauty' (length=6)
public 'singular' => string 'Inloggen' (length=8)
public 'plural' => null
public 'translations' =>
array (size=1)
0 => string 'Login' (length=5)
public 'translator_comments' => string '' (length=0)
public 'extracted_comments' => string '' (length=0)
public 'references' =>
array (size=0)
empty
public 'flags' =>
array (size=0)
empty
我的站点中有 2 个本地人,nl_NL 和 en_UK。这是使用 WPML 设置并正确加载的。
我在主题的lang 文件夹中有一个 nl_NL.mo 和一个 en_UK.mo 文件。
所以,这一切看起来都不错。
但是,在我的 header.php 中,我有一个登录锚:
<a href="<?php echo $login_url; ?>" target="_self"><?php _e( 'Inloggen', 'beauty' ); ?></a>
在我的理解中应该加载上下文'beauty'和键'Inloggen'。
所以,当我在我的语言环境 nl_UK 中时,它不起作用,我看到的是标准荷兰语文本“Inloggen”而不是“Login”。
奇怪的是,当我从 PO 文件中删除 msgctxt "beauty" 上下文并将其保存以创建新的 MO 文件时,它确实有效。
我之前在我的插件中使用过上下文,我使用load_textdomain 来加载 MO 文件并且效果很好。
我想使用上下文的原因是因为一个文件包含与 Roots 和 Beauty 相关的文本,而我只对 Beauty 文本感兴趣。我不想删除 Roots 主题的所有 _e 条目,所以当我加载源时它不会出现。
所以这是一个问题。
问题 2 不那么重要,但也让我感到困惑:当我查看主题 twentyfiftheen 的示例时,它们的 PO 和 MO 文件在 wp-content/languages/themes/ 文件夹中为 twentyfiftheen-nl_NL.mo。 我阅读了这篇很棒的文章 (https://localise.biz/help/wordpress/loading-translations) 和这篇文章 (https://wordpress.stackexchange.com/questions/137427/themes-text-domain-language-po-file-not-working) 并了解到您应该始终为 MO 文件提供语言环境的名称,而不是上下文名称 + 语言环境的名称。
在这个不错的文档 (https://localise.biz/help/wordpress/loading-translations) 我发现
So in short, WordPress will look in only two places for a theme's MO file:
{absolute_path}/{locale}.mo
wp-content/languages/themes/{domain}-{locale}.mo
e.g. for twentyfourteen's French translations:
wp-content/themes/twentyfourteen/languages/fr_FR.mo
wp-content/languages/themes/twentyfourteen-fr_FR.mo
但是,当我将 MO/PO 文件放在 wp-content/languages/themes 中时,它无法正常工作,但这可能与我在上下文中遇到的相同问题有关(问题 1)。
干杯
【问题讨论】:
-
如果我没记错的话,你的 lang 文件夹中应该有一个默认的 po/mo 文件(英文),并且翻译应该只有 nl.po/.mo(所以不是 nl_NL.po/ .mo)。有了它,您应该已经加载了已翻译的字符串,但即使如此,您也可以在 WPML 本身中进行字符串翻译,不是吗?
-
是的,我可以在 WPML 中进行字符串翻译,但与获取翻译的 DB 调用相比,我喜欢 MO 文件的速度。在我阅读的所有文档中,明确指出的文件应命名为语言环境、nl_NL 或 uk_GB、uk_IRL 等。
-
我知道当我尝试将主题翻译为克罗地亚语 (hr_HR) 时,当我尝试
hr_HR.po/.mo时,主题没有接收到我的翻译。但是当我将其重命名为hr.po/.mo时,它确实如此。 -
我想我已经知道它为什么不起作用了,因为我将 CONTEXT 与 DOMAIN 混淆了。我会查看我的情况并对其进行重构,然后再发回
标签: wordpress internationalization poedit mo