私は、英語とアラビア語をメイン言語とするバイリンガルのブログを持っています。現在私は投稿がアラビア語であることを示すために "Custom Field"という投稿を使用し、RTLへの方向とアラビア語へのテキスト翻訳を変更するために私の子供のテーマでそれを使用します。両方の言語の文字列を使用して、カスタムフィールド値に基づいて正しい文字列を選択し、投稿のタイトル、本文、およびコメントのHTMLタグの方向も設定します。それはうまくいっています、しかしテーマを後で変更することは私がすべてをやり直す必要があることを意味します。私はコメントプラグイン "wpDiscuz"を使用しようとしていますが、プラグイン自体を編集する以外に言語を制御する簡単な方法はありません。更新ごとに変わります。
WPはすでにアラビア語をサポートしており、正しいrtl cssを持つ.moファイルとして翻訳されています。また、新しいプラグインは.mo翻訳もサポートしています。私はそれを利用して、特定の投稿についてのみワードプレスの言語をアラビア語に変更する方法を見つけることを考えました。しかし、私はまだそれをするのがベールではありません。
私は単一のファイルfunctions.php
でプラグインを作成しました、そしてこれは内容です:
function my_reset_locale($locale) {
$locale = 'ar';
return $locale;
}
add_filter('locale','my_reset_locale',10);
これはすべて(フロントページとすべての単一の投稿)のためにそれを変更し、私は投稿IDを読んでみました
global $post;
$postId = isset($post) ? $post->ID : '';
しかし、私の関数への最初の4回の呼び出しは$ post-> IDが設定される前に行われ、それが設定されるまで待つと言語が既にロードされているので遅すぎます。
そのため、言語が読まれる前と早くその記事についての情報を得るために何ができますか(私はそれがロケールに基づいて翻訳を選択するために呼ばれるのは "load_textdomain"だと思います)
答えが見つからなかったので、解決策を提供しました。
私がwordpressやphpのエキスパートではないことを考えると、それは簡単ではありませんでしたが、Wordpressのドキュメントは素晴らしいので、ここに解決策があります。
// Set the post language when loading up the page based on the store meta
function ppl_set_post_language() {
$postID = url_to_postid( $_SERVER["REQUEST_URI"] );
if ($postID > 0) {
$postLanguage = esc_attr( get_post_meta( $postID, '_ppl_post_language', true ) );
if ( ! empty( $postLanguage ) ) {
global $locale;
$locale = $postLanguage;
}
}
}
// Any call to 'url_to_postid' earlier then 'setup_theme' will generate a fatal error.
add_action('setup_theme', 'ppl_set_post_language');
投稿またはページを編集するときは、言語コード(en_US
またはar
)を投稿meta
に保存します。この部分は簡単ですが、問題は、言語をチェックするコードを実行するときにページを表示するときです。早めに実行した場合は、まだワードプレスによってロードされていないので投稿IDを取得できません。また、待ってコードを遅く実行した場合は、ワードプレスがデフォルト言語をロードするので遅すぎます。私が見つけたスウィートスポットはアクションsetup_theme
です。そのステップでは翻訳がまだロードされていないので、url_to_postid
を呼び出して投稿メタを取得するために使用する投稿IDを取得できます。
こうした後、私はなぜ他の人が恩恵を受けることができるWordPressプラグインを作成しないのかと考えました、そしてそれがここにある: