【问题标题】:i18N Wordpress using mo files not accepting contexti18N Wordpress 使用 mo 文件不接受上下文
【发布时间】: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


【解决方案1】:

好的,我发现我在 POEdit 中滥用了 Context 属性,就好像它是一个域一样。 我对另一篇帖子感到困惑,认为它会像那样工作。 好吧,它没有。

所以我按照@Václav Slavík 的建议进行操作,并将 _e 和 __ 函数包装到我自己的函数中,以便 POEdit 可以搜索那些我不会在我的文件中获得 Roots 语言标签的结尾。 问题解决了。 它也从 Wordpress 的默认语言文件夹加载,这都与上下文/域混淆有关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-17
    • 2015-09-17
    • 1970-01-01
    • 2011-05-28
    • 2015-08-08
    • 1970-01-01
    • 2019-01-23
    • 2012-10-02
    相关资源
    最近更新 更多