4

如何使用 WordPress 中的本地化机制来访问现有但不是当前的语言字符串?

背景:我有一个自定义主题,我使用区域设置“en_US”作为默认区域设置,并通过 PO 文件转换为区域设置“es_ES”(西班牙语)。

假设我使用构造

__('Introduction', 'my_domain');

在我的代码中,并且我已经在我的 PO 文件中将“Introduction”翻译成西班牙语“Introducción”。这一切都很好。

现在解决问题:我想在我的数据库中插入 n 条记录,其中包含字符串“简介”的所有现有翻译——每种语言一个;所以,在我的例子中,n = 2。

理想情况下,我会写这样的东西:

$site_id = 123;
// Get an array of all defined locales: ['en_US', 'es_ES']
$locales = util::get_all_locales();
// Add one new record in table details for each locale with the translated target string
foreach ($locales as $locale) {
    db::insert_details($site_id, 'intro',
        __('Introduction', 'my_domain', $locale), $locale);
}

只是,上面 __() 中的第三个参数是我的纯粹幻想。你只能有效地写

__('简介', 'my_domain');

根据当前语言环境获取“介绍”或“介绍”。

理想情况下,上面代码的结果是我的表中有两条记录:

SITE_ID  CAT    TEXT             LOCALE
123      intro  Introduction     en_US
123      intro  Introducción     es_ES

我知道我想要一些需要加载所有 MO 文件的东西,通常只需要当前语言的 MO 文件。也许使用 WordPress 函数 load_textdomain 是必要的——我只是希望已经存在一个解决方案。


通过包含插件 PolyLang 来扩展问题:是否可以使用自定义字符串来实现上述功能?例如在概念上:

pll_('Introduction', $locale)
4

1 回答 1

2

我知道的老问题,但这里有 -

从一个简单的示例开始,您可以确切地知道要加载哪些语言环境以及 MO 文件的确切位置,您可以直接使用 MO 加载器:

<?php
$locales = array( 'en_US', 'es_ES' );
foreach( $locales as $tmp_locale ){
    $mo = new MO;
    $mofile = get_template_directory().'/languages/'.$tmp_locale.'.mo';
    $mo->import_from_file( $mofile );
    // get what you need directly
    $translation = $mo->translate('Introduction');
}

这假设您的 MO 文件都在主题下。如果您想在 WordPress 环境中加入更多这种逻辑,您可以这样做,但这有点讨厌。例子:

<?php
global $locale;
// pull list of installed language codes
$locales = get_available_languages();
$locales[] = 'en_US';
// we need to know the Text Domain and path of what we're translating
$domain = 'my_domain';
$mopath = get_template_directory() . '/languages';
// iterate over locales, finally restoring the original en_US
foreach( $locales as $switch_locale ){
    // hack the global locale variable (better to use a filter though)
    $locale = $switch_locale;
    // critical to unload domain before loading another
    unload_textdomain( $domain );
    // call the domain loader - here using the specific theme utility
    load_theme_textdomain( $domain, $mopath );
    // Use translation functions as normal
    $translation = __('Introduction', $domain );
}

这种方法更糟糕,因为它会破解全局变量并且需要在之后恢复原始语言环境,但它的优点是使用 WordPress 的内部逻辑来加载主题的翻译。如果它们位于不同的位置,或者它们的位置受到过滤器的影响,这将很有用。

在这个示例中我还使用了 get_available_languages,但请注意,您需要为此安装核心语言包。除非您还安装了核心西班牙语文件,否则它不会在您的主题中选择西班牙语。

于 2015-02-19T10:44:54.367 回答