子テーマで親テーマの翻訳をオーバーライドする


11

load_theme_textdomain()多くの言語で翻訳されたすべての文字列を正しく読み込むために使用する親テーマがあります。

次にload_child_theme_textdomain()、文字列に対して同じことを実現するために使用する子テーマを作成しました。

親テーマには特定の言語の特定の翻訳された文字列がありますが、これは子テーマで置き換え/オーバーライドしたいものです。

それらがテンプレートファイルにある場合、ファイルを置き換えてそれらの文字列のテキストドメインを変更することができますが、残念ながら私が話しているものは多くの場所とダッシュボードで使用されています)。

だから私の質問は次のとおりです:親テンプレートファイルまたは関数を置き換えることなく、子テーマ内のこれらの翻訳された文字列を置き換える方法はありますか?

多分、子テーマの言語フォルダー内にparent-theme.moファイルを追加し、それらの文字列のみを翻訳したものなどを追加します。

回答:


9

私は解決策を見つけたと思うが、少し前に

前提

load_theme_textdomain()そして、load_child_theme_textdomain()基本的に同じである、唯一の違いは、彼らが使用するデフォルトのパスは次のとおりです。

  • 現在の言語を取得し(を使用get_locale())、相対.moファイルを引数として渡されたパスに追加します。
  • その後load_textdomain()、textdomainと.moファイルへの結果パスの両方を引数として渡すことを呼び出します。

次にload_textdomain、.moファイルをグローバルtextdomain変数にロードしますが、ソースから読み取ることができます。

ドメインが既に存在する場合、翻訳はマージされます。

両方のセットに同じ文字列が含まれている場合、元の値からの変換が行われます。

したがって、必要なテーマの親の文字列のみをオーバーライド/置換するには、親テーマがその.moファイルを読み込む前に、翻訳された文字列のみを含む親textdomainのカスタム.moファイルを読み込む必要があります。


解決

最後に、単に親テーマの名前を持つフォルダーを(便宜上)子テーマの言語フォルダーに作成し、その中に親textdomainのカスタム.moファイル(言語用、xx_XX.moフォーム内の1つ、どこxx_XX)言語コードです。

そしてfunctions.phpafter_setup_themeアクション中に、子テーマtextdomainの.moファイルをロードする行の近くに、子テーマファイルに行を追加しました。

add_action( 'after_setup_theme', function () {
    // load custom translation file for the parent theme
    load_theme_textdomain( 'parent-textdomain', get_stylesheet_directory() . '/languages/parent-theme' );
    // load translation file for the child theme
    load_child_theme_textdomain( 'my-child-theme', get_stylesheet_directory() . '/languages' );
} );

のでfunctions.php、子テーマのファイルは親の1の前にロードされ、文字列のこのセットは、親テーマの翻訳よりも優先されます(または私はちょうどの三番目のパラメータ使用して優先順位を設定していたかもしれないadd_action機能を)。


注:前提の中で述べたload_child_theme_textdomainようにload_theme_textdomain、の代わりにを使用することもできます。


4

子テーマフォルダーにある言語ファイルを使用できます。まず、親テーマが使用しているテキストドメインを知る必要があります。次に、ファイル名としてご使用の言語のみ(.de_DE.po / de_DE.moまたはnl_NL.po / nl_NL.mo)で.poおよび.moファイルを作成し、それらを子テーマディレクトリ内のフォルダー「languages」に配置します。例えば。

次に、次を使用してテキストドメインを初期化できますload_child_theme_textdomain()

load_child_theme_textdomain( 'the_text_domain', get_stylesheet_directory() . '/languages/' );

あなたのような関数呼び出しを探してテキストドメインを見つけることができることに注意してください__()または_e()親テーマのPHPファイル内。2番目のパラメーターはテキストドメインです。__( 'Translated text string', 'text_domain' );


@redelschaapに感謝します。子テキストドメインに使用するフォルダーとは別のフォルダーを親テキストドメインに使用する限り、最終的にソリューションは機能します。:)
d79

子テーマ内から複数のテキストドメインをロードできます。ただし、すべての翻訳に親テーマテキストドメインを使用することもできます。同じテキストドメインのファイルを読み込むと翻訳がマージされるためです。
redelschaap

0

Wordpress 5.0.1の2019更新プログラム。

  1. ファイルには、親または子スラッグが含まれていてはなりません。たとえば、スペイン語のメキシコ語翻訳を提供するには、child-theme-name / languages / es_MX.poおよび/child-theme-name/languages/es_MX.moのファイルが必要です。
  2. 子テーマfunctions.phpには次のコードが含まれている必要があります。関数load_child_theme_textdomain()の最初のパラメーターは、子のテーマではなく、親テーマのスラッグであることに注意してください。
function child_theme_slug_setup() {
    load_child_theme_textdomain( 'parent-theme-slug', get_stylesheet_directory() . '/languages' );
}
add_action( 'after_setup_theme', 'child_theme_slug_setup' );
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.