web-dev-qa-db-ja.com

実行時にロケールを手動で変更しますか?

WordPressを使って実行時にロケールを変更する方法はありますか?

つまり、他のWebアプリケーションと統合するためのデータを含むXMLファイルを作成するために、カスタムURLを作成しました。 URLには言語部分もあります。これが私のURLだと言うことができます

http://example.com/custom/url/ja

uRLの最後の部分は英語です。その場合私が好きなのは英語のXMLを生成するWordPressです。しかし、実行のその時点でロケールを変更するようにWordPressに指示するにはどうすればよいですか。

__()、_e()などの翻訳されたシステム変数も使用するため、ロケールを変更する必要があることに注意してください。

5
Merianos Nikos

私は似たようなことをやろうとしている、そしてwp-hackersメーリングリスト(Otto、Nacin)の専門家はこれを私に言った:

WPLANGを変更しようとしないでください、あなたは定義された定数を変更することはできません。代わりに、グローバルな$ localeを変更するか、 'locale'にフィルタをかけてください。

そのため、最善の解決策は、 'locale'グローバル変数にフィルタを適用することです。これを行う唯一の方法は、カスタムプラグインを作成することです。次のコードをあなたのfunctions.phpファイルに入れた場合、それはWPロードシーケンスの中で遅く実行されるため、正しく動作しません。

あなたのプラグインは次のようになります(私はOneTrickPonyのURIテスト部分を再利用しています。あなたはそれを別の条件付きテスト方法で置き換えることができます):

<?php
/*
Plugin Name: Change locale at runtime
Plugin URI: http://wordpress.stackexchange.com/questions/49451/change-locale-at-runtime
*/

function wpsx_redefine_locale($locale) {
    // run your tests on the URI
        $lang = explode('/', $_SERVER['REQUEST_URI']);
        // here change to english if requested
        if(array_pop($lang) === 'en'){
          $locale = 'en_US';
        // otherwise stick to your default language
        }else{
          $locale = 'gr_GR';
        }
    return $locale;
}
add_filter('locale','wpsx_redefine_locale',10);  
?>

これが誰にでも役立つことを願っています!

ロケールを切り替える際のパフォーマンスの観点から見たコストに関するもう少し警告(Andrew Nacinを引用):

デフォルトのロケールがロードされた後にロケールを「切り替える」ことは可能ですが、デフォルトの言語が英語でない限りそれはそれほど悪くない限り、非効率的なので私はそれに対してお勧めします。

デフォルトのテキストドメインファイルはplugins_loadedsetup_themeの後、ただしテーマがロードされる前とafter_setup_themeが起動する前にロードされます。英語をロードしてからinitフックでテキストドメインをドイツ語に再ロードするのは、パフォーマンス上、問題ありません。英語にはmoファイルがないためです。しかし、デフォルトでスペイン語をロードしてからドイツ語に切り替えてもそうではありません。

ロードシーケンスについての有用な情報は http://codex.wordpress.org/Plugin_API/Action_Reference を参照してください。

12
Manu

WP requireは特定の時点より前に定義されているため、プラグイン内でこれが可能かどうかはわかりませんが、要求された言語をwp-config.phpで確認し、必要な定数を定義します。 :

// split URI
$lang = explode('/', $_SERVER['REQUEST_URI']);

// here change to english if requested
if(array_pop($lang) === 'en'){
  define('WPLANG', 'en_US');

// otherwise stick to your default language
}else{
  define('WPLANG', 'gr_GR');
}
3
onetrickpony

最初に、あなたの希望するロケールが リスト内 であることを確認してください( " 言語パックを持っています "の下)。確認したら、そのようなコードを使用します。

//set desired locale
add_filter( 'locale', function($locale) {
    if ( !is_admin() ) 
        $locale = "zh_TW";
    return $locale;
});

WPダッシュボードでその言語を選択していない場合は、プログラムでインストーラフックを使用する必要があります。

//check if it's not install, then install
add_action('wp', 'my_locale_implemention');
function my_locale_implemention()
{
    $my_locale = get_locale();  //get_user_locale
    if ( !empty($my_locale) && !in_array( $my_locale, get_available_languages() ) ) {
        require_once( ABSPATH . 'wp-admin/includes/file.php' );
        require_once( ABSPATH . 'wp-admin/includes/translation-install.php' );
        $language = wp_download_language_pack( $my_locale );
        if ( $language ) {
            if(empty($_POST)) header("location: ".$_SERVER['REQUEST_URI']); exit; //reload page
        }
    }
}
1
T.Todua