基本文字列
最も一般的に使用される関数は ()
です。これは引数の翻訳を返します:
__( 'Blog Options', 'my-theme' );
もう一つのシンプルなものは _e()
で、これは引数の翻訳を出力します。次のように書く代わりに:
echo __( 'WordPress is the best!', 'my-theme' );
短い形式を使用できます:
_e( 'WordPress is the best!', 'my-theme' );
()
は JavaScript 用にも利用可能です。
変数
文字列に変数を使用している場合、以下の例のように、プレースホルダーを使用する必要があります。
echo 'Your city is $city.'
printf
ファミリーの関数を使用してください。特に役立つのは printf
と sprintf
です。例えば:
printf(
/* translators: %s: Name of a city */
__( 'Your city is %s.', 'my-theme' ),
$city
);
翻訳用の文字列はテンプレート "Your city is %s."
であり、ソースと実行時の両方で同じです。
文字列にプレースホルダーが複数ある場合は、引数の入れ替えを使用することをお勧めします。この場合、シングルクォート (')
は必須です: ダブルクォート (")
は PHP に $s
を s
変数として解釈させるため、これは望ましくありません。
printf(
/* translators: 1: Name of a city 2: ZIP code */
__( 'Your city is %1$s, and your zip code is %2$s.', 'my-theme' ),
$city,
$zipcode
);
ここでは、郵便番号が都市名の後に表示されます。一部の言語では、郵便番号と都市を逆の順序で表示する方が適切です。上記の例のように %s プレフィックスを使用することで、これが可能になります。翻訳は次のように書くことができます:
printf(
/* translators: 1:ZIP code 2:Name of a city */
__( 'Your zip code is %2$s, and your city is %1$s.', 'my-theme' ),
$city,
$zipcode
);
sprintf
は JavaScript の翻訳にも利用可能です:
const zipCodeMessage = sprintf(
/* translators: 1:ZIP code 2:Name of a city */
__( 'Your zip code is %2$s, and your city is %1$s.', 'my-theme'),
city,
zipcode
);
次の例は、何をしてはいけないかを示しています。
これは不正です。
// This is incorrect do not use.
_e( "Your city is $city.", 'my-theme' );
翻訳用の文字列は、関連する PHP を実行せずにソースから抽出されます。例えば: 変数 $city
はバンクーバーである可能性があるため、テンプレートが実行されると "Your city is Vancouver"
になりますが、gettext は事前に PHP 変数の中身を知ることはできません。
文字列が翻訳されるとき、変数の値は不明であるため、翻訳者は変数 $country
のすべてのケースを知っている必要があります。これは理想的ではなく、動的コンテンツを削除し、翻訳者が静的コンテンツに集中できるようにするのが最善です。
複数形
基本的な複数形の処理
アイテムの数が変わると文字列が変わる場合があります。英語では "One comment"
と "Two comments"
があります。他の言語では、複数の複数形が存在することがあります。WordPress でこれを処理するには、_n()
関数を使用できます。
printf(
_n(
'%s comment',
'%s comments',
get_comments_number(),
'my-theme'
),
number_format_i18n( get_comments_number() )
);
_n()
は 4 つの引数を受け取ります:
- 単数形 – 文字列の単数形(注意: 一部の言語では 1 以外の数字にも使用できるため、
'%s item'
を'One item'
の代わりに使用する必要があります) - 複数形 – 文字列の複数形
- カウント – オブジェクトの数で、単数形または複数形のどちらを返すかを決定します(2 つ以上の形がある言語もあります)
- テキストドメイン – テーマのテキストドメイン
関数の返り値は、指定されたカウントに対応する正しい翻訳形です。
`_n() は JavaScript 用にも利用可能です。
後での複数形処理
最初に _n_noop()
または _nx_noop()
で複数形の文字列を設定します。
$comments_plural = _n_noop(
'%s comment.',
'%s comments.'
);
コードの後の段階で、translate_nooped_plural()
を使用して文字列をロードできます。
printf(
translate_nooped_plural(
$comments_plural,
get_comments_number(),
'my-theme'
),
number_format_i18n( get_comments_number() )
);
文脈による曖昧さの解消
時には、用語が複数の文脈で使用され、他の言語では別々に翻訳する必要がありますが、英語では同じ単語が各文脈で使用されます。例えば、Post
という単語は、動詞 "Click here to post your comment"
と名詞 "Edit this Post"
の両方として使用されることがあります。このような場合は、_x()
または _ex()
関数を使用する必要があります。これは ()
と _e()
に似ていますが、追加の引数 — 文脈があります:
_x( 'Post', 'noun', 'my-theme' );
_x( 'post', 'verb', 'my-theme' );
この方法を両方のケースで使用すると、元のバージョンの文字列「Comment」が得られます。しかし、翻訳者は異なる文脈でそれぞれ異なる「Comment」文字列を翻訳することになります。
WordPress のドイツ語版からの例を挙げると: Post は Beiträge です。ドイツ語の対応する動詞形は beitragen です。
()
に似ていることに注意してください。_x()
には echo
バージョンがあります: _ex()
。前の例は次のように書くことができます:
_ex( 'Post', 'noun', 'my-theme' );
_ex( 'post', 'verb', 'my-theme' );
可読性とコーディングの容易さを高めると感じるものを使用してください。
_x() and _nx()
は JavaScript 用にも利用可能です。
説明
ソースコードに明確なコメントを追加して、翻訳者が ( 'g:i:s a' )
のような文字列をどのように翻訳するかを知ることができます。これは translators:
という単語で始まり、すべて小文字で、gettext 呼び出しの前の最後の PHP コメントでなければなりません。以下はその例です:
/* translators: draft saved date format, see http://php.net/date */
$saved_date_format = __( 'g:i:s a' );
複数行の例:
/*
* translators: Replace with a city related to your locale.
* Test that it matches the expected location and has upcoming
* events before including it. If no cities related to your
* locale have events, then use a city related to your locale
* that would be recognizable to most users.
*/
?>
<input placeholder="<?php esc_attr_e( 'Cincinnati' ); ?>" id="location" type="text" name="location" />
改行文字
Gettext は翻訳可能な文字列内の r
(ASCII コード: 13) を好まないため、これを避けて n
を使用してください。
空の文字列
空の文字列は内部 Gettext 用に予約されており、空の文字列を国際化しようとしないでください。また、翻訳者は文脈を持たないため、意味がありません。
空の文字列を国際化する正当な使用例がある場合は、翻訳者を助け、Gettext システムと平和でいるために文脈を追加してください。
文字列のエスケープ
すべての文字列をエスケープすることは良いことであり、翻訳者が悪意のあるコードを実行するのを防ぎます。国際化関数と統合されたエスケープ関数がいくつかあります。
<a title="<?php esc_attr_e( 'Skip to content', 'my-theme' ); ?>" class="screen-reader-text skip-link" href="#content" >
<?php _e( 'Skip to content', 'my-theme' ); ?>
</a>
<label for="nav-menu">
<?php esc_html_e( 'Select Menu:', 'my-theme' ); ?>
</label>
文字列を書くためのベストプラクティス
文字列を書くためのベストプラクティスは次のとおりです。
- 適切な英語スタイルを使用する – スラングや略語を最小限に抑える。
- 完全な文を使用する – ほとんどの言語では、語順が英語とは異なります。
- 段落で分割する – 関連する文を統合しますが、1 つの文字列に全ページのテキストを含めないでください。
- 翻訳可能なフレーズに先頭または末尾の空白を残さないでください。
- 翻訳時に文字列が2倍の長さになる可能性があると仮定してください。
- 異常なマークアップや異常な制御文字を避ける – テキストを囲むタグを含めないでください。
- 翻訳された文字列に不必要な HTML マークアップを入れないでください。
- 他の言語のバージョンがある場合を除き、URL を翻訳のために残さないでください。
- 一部の言語ではプレースホルダーの位置が変わるため、文字列に変数をプレースホルダーとして追加してください。
printf(
__( 'Search results for: %s', 'my-theme' ),
get_search_query()
);
- 文字列の連結の代わりにフォーマット文字列を使用する – フレーズを翻訳し、単語ではなく –
printf(
__( 'Your city is %1$s, and your zip code is %2$s.', 'my-theme' ),
$city,
$zipcode
);
は常に次のより良いものです:
__( 'Your city is ', 'my-theme' ) . $city . __( ', and your zip code is ', 'my-theme' ) . $zipcode;
- 複数の類似した文字列を翻訳しないように、同じ単語や記号を使用するようにしてください(例: 次のことをしないでください)
bash
__( 'Posts:', 'my-theme' ); and __( 'Posts', 'my-theme' );
@