2

我对加载我的主题 .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 设置并正确加载的。我在主题文件夹中有一个 nl_NL.mo 和一个 en_UK.mo 文件lang

所以,这一切看起来都不错。

但是,在我的 header.php 中,我有一个登录锚点:

<a href="<?php echo $login_url; ?>" target="_self"><?php _e( 'Inloggen', 'beauty' ); ?></a>

在我的理解中应该加载上下文'beauty'和关键'Inloggen'。

因此,当我在我的语言环境 nl_UK 中时,它不起作用,我看到的是标准荷兰语文本“Inloggen”而不是“登录”。

奇怪的是,当我msgctxt "beauty"从 PO 文件中删除上下文并将其保存以创建新的 MO 文件时,它确实有效。

我之前在我的插件中使用过上下文,load_textdomain用于加载 MO 文件并且效果很好。

我想使用上下文的原因是因为一个文件包含 Roots 和 Beauty 相关的文本,而我只对 Beauty 文本感兴趣。我不想删除_eRoots 主题的所有条目,所以当我加载源时它不会出现。

所以这是一个问题。

问题 2 不那么重要,但也让我感到困惑:当我查看主题为 205 的示例时,它们的 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

但是,当我在 wp-content/languages/themes 中有我的 MO/PO 文件时,它不起作用,但它可能与我在上下文中遇到的相同问题有关(问题 1)。

干杯

4

1 回答 1

0

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

所以我做了@Václav Slavík 推荐的事情,并将 _e 和 __ 函数包装到我自己的函数中,这样 POEdit 就可以搜索那些我不会在我的文件中获得 Roots 语言标签的结尾。问题解决了。它还从 Wordpress 的默认语言文件夹加载,这都与上下文/域混淆有关。

于 2015-11-10T11:25:57.483 回答