获取特定区域设置的本地化字符串

时间:2013-09-16 18:53:19

标签: wordpress localization

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

背景:我有一个自定义主题,我使用locale'en_US'作为默认语言环境,并将PO文件翻译为语言环境'es_ES'(西班牙语)。

让我们说我使用构造

__('Introduction', 'my_domain');

在我的代码中,我已在我的PO文件中将“简介”翻译为西班牙语“Introducción”。这一切都很好。

现在问题:我想在我的数据库中插入n条记录,其中包含字符串'Introduction'的所有现有翻译 - 每种语言一个;所以,在我的例子中,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);
}

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

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

根据当前区域设置获取“简介”或“介绍”。

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

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

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


通过包含插件PolyLang扩展问题:是否可以使用Custom Strings来实现上述功能?例如。概念性地:

pll_('Introduction', $locale)

1 个答案:

答案 0 :(得分:1)

老问题我知道,但是这里 -

从一个简单的示例开始,您可以确切地知道要加载的语言环境以及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,但请注意,您需要为此安装核心语言包。除非您还安装了核心西班牙语文件,否则它不会在您的主题中选择西班牙语。