web-dev-qa-db-ja.com

子テーマで親テーマの翻訳を上書きする

私は多くの言語ですべての翻訳された文字列をロードするために正しくload_theme_textdomain()を使う親テーマを持っています。

それから、load_child_theme_textdomain()を使ってその文字列に対して同じことを実現する子テーマを作成しました。

親テーマには特定の言語用の翻訳された文字列がいくつかありますが、それを子テーマで置き換えたり上書きしたりしたいのです。

それらがテンプレートファイル上にあったかどうか私はファイルを置き換えて単にそれらの文字列のためにtextdomainを変更することができました、しかし残念なことに私が話しているものは多くの場所とダッシュボードで使われます。 ).

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

私は知りませんが、子テーマのlanguagesフォルダの中に parent-theme.mo ファイルを追加して、それらの文字列だけを翻訳したものか、それともそのようなものを追加するのかもしれません。

12
d79

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

前提

load_theme_textdomain()load_child_theme_textdomain()は基本的に等しく、唯一の違いは使用するデフォルトのパスです。

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

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

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

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

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


溶液

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

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

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ファイルは親のテーマの前に読み込まれるため、この文字列のセットは親テーマの変換よりも優先されます(またはadd_action関数の3番目のパラメーターを使用して優先度を設定することもできます)。


注:前提で同じように言ったように、load_child_theme_textdomainの代わりにload_theme_textdomainを使用することもできます。

10
d79

あなたはあなたの子供のテーマフォルダにある言語ファイルを使うことができます。最初に、親テーマがどのテキストドメインを使用しているかを知る必要があります。次に、自分の言語だけをファイル名として.poファイルと.moファイルを作成し(例:de_DE.po/de_DE.moまたはnl_NL.po/nl_NL.mo)、それらをあなたの子テーマディレクトリ内のフォルダ "languages"に入れます例えば。

その後、テキストドメインをload_child_theme_textdomain()で初期化できます。

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

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

4
redelschaap

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()の最初のパラメータは、PARENTテーマのスラッグであり、子のものではありません。
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' );
0
Cesar