web-dev-qa-db-ja.com

異なるドメインで "load_theme_textdomain"を複数回ロードできますか?

テーマに「basic」と「advance」という2つのドメインがあるとします。

テーマに2つの異なるドメインをロードすることは可能ですか?

load_theme_textdomain( 'basic', TEMPLATEPATH.'/languages' );
load_theme_textdomain( 'advance', TEMPLATEPATH.'/languages' );
5

あなたのmo-ファイルをあなたのテーマのディレクトリの中に置くならば、 同じmo-ファイルがすべてのテーマtextdomain のためにロードされることに注意してください。テーマmoファイルはロケールのみに基づいているからです。例えば:

load_theme_textdomain( 'basic', get_template_directory() . '/languages' );
load_theme_textdomain( 'advance', get_template_directory() . '/languages' );
load_theme_textdomain( 'whatever', get_template_directory() . '/languages' );

“ en_US”があなたのWPLANGロケールであるとすると、上のコードはwp-content/themes/your-theme/languages/en_US.moを3回ロードします。同じmoファイルを複数回インポートしても、余分な作業しか行われないため、問題があります。その場合は、単一のテーマドメインを使用することをお勧めします。

しかし、wp-content/themes/your-theme/languages/en_US.monotを存在しない場合、WordPressはデフォルトの言語ディレクトリのサブディレクトリ "themes"を調べます。その場合、ドメインはファイル名の一部として考慮されます。 load_theme_textdomain() functionをちょっと見てみると、そのすべてを学ぶことができます。

function load_theme_textdomain( $domain, $path = false ) {
    $locale = apply_filters( 'theme_locale', get_locale(), $domain );

    if ( ! $path )
        $path = get_template_directory();

    // Load the textdomain from the Theme provided location, or theme directory first
    $mofile = "{$path}/{$locale}.mo";
    if ( $loaded = load_textdomain($domain, $mofile) )
        return $loaded;

    // Else, load textdomain from the Language directory
    $mofile = WP_LANG_DIR . "/themes/{$domain}-{$locale}.mo";
    return load_textdomain($domain, $mofile);
}
2
Geert

WordPress.orgの公式プラグインまたはテーマディレクトリに含めるためにこのテーマまたはプラグインを作成する場合は、テキストドメインとしてプラグインまたはテーマのスラッグを使用する必要があります。複数のテキストドメインを持つことはできません。また、テキストドメインはプラグインやテーマのスラッグ以外にはできません。

これは、3.7で新たに追加された言語パックのサポートによるものです。言語パックシステムはテキストドメインにスラッグを使用しますが、それ以外のものでは動作しません。

7
Otto

確かに可能です。しかし、1つのテキスト文字列に2つの別々の言語翻訳を使用することはできません。

たとえば、このテキスト文字列がページのどこかにあるとしましょう。

Hello World!

それでは、それを言語のローカライズ用に設定したい場合は、次のようにします。

<?php _e('Hello World!', 'my_language_localization'); ?>

あなたの場合は、次のいずれかです。

<?php _e('Hello World!', 'basic'); ?>

または、

<?php _e('Hello World!', 'advance'); ?>

しかし、単一の文字列を2つのローカライズに翻訳することは不可能です。

ローカライゼーション名を使用する場合も同様です。他のプラグインやテーマと衝突しないように、それを何かユニークなものにしてください。

3
josh

Wordpress 4以降、単純なプラグインを作成し、必要なテキストドメインを「のみ」ロードすることをお勧めします。あなたのテーマフォルダやテンプレート、あるいは至る所にあるすべての文字列が翻訳されます。例:

<?php

/*
Plugin Name: UA Translation UA Tiny select
Description: Translation for Theme templates outside the main text domain
Version: 1.0
Author: Jonas Lundman
Author URI: http://lundman.info
Text Domain: ua-tiny-select
Domain Path: /languages/
*/

// Updated 2015 04 22 (21:00) 

function ua_load_plugin_textdomain_tiny_select() {
    load_plugin_textdomain( 'ua-tiny-select', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
}
add_action( 'plugins_loaded', 'ua_load_plugin_textdomain_tiny_select');

?>

メインドメインのテーマのwoocommerceテンプレートファイルまたはBuddypressテンプレートファイルのカスタム変更に最適です。

上記の私の場合は、moファイルとpoファイルにスラッグを付けることを忘れないでください。

languages/ua-tiny-select-sv_SE.mo

そしてフォルダLanguagesはあなたのプラグインフォルダの中に入ります

0
Jonas Lundman