31661

[code]

    <p>
        <?php
            echo sprintf( esc_attr__( 'Hello %s%s%s (not %2$s? %sSign out%s)', 'woocommerce' ), '<strong>', esc_html( $current_user->display_name ), '</strong>', '<a href="' . esc_url( wc_get_endpoint_url( 'customer-logout', '', wc_get_page_permalink( 'myaccount' ) ) ) . '">', '</a>' );
    ?>
    </p>
    <p>
        <?php
            echo sprintf( esc_attr__( 'From your account dashboard you can view your %1$srecent orders%2$s, manage your %3$sshipping and billing addresses%2$s and %4$sedit your password and account details%2$s.', 'woocommerce' ), '<a href="' . esc_url( wc_get_endpoint_url( 'orders' ) ) . '">', '</a>', '<a href="' . esc_url( wc_get_endpoint_url( 'edit-address' ) ) . '">', '<a href="' . esc_url( wc_get_endpoint_url( 'edit-account' ) ) . '">' );
    ?>
    </p>
    
[/code]

現在wordpressでマルチ言語対応のECサイトを作成しているのですが、dashboard画面に表示されるはずのセカンダリ言語が、上記のようにデフォルト言語で表示されてしまっています。（サイト内でこの文言だけ）

正しくセカンダリ言語を表示させるため、このphpコードに命令文を加え、上記コード内に2言語記述するという方法でどうにか実装出来ないかと考えていますが当方phpの知識がありません。  
get_locale(); 等のようにif/elseでの出し分けが出来れば嬉しいです。

説明が分かりにくかったらすみません。  
どうぞよろしくお願いします。

*** 追記 ***

[code]

    <?php
        if ($locale == "ja") {
            echo sprintf( esc_attr__( 'こんにちは %s%s%s (%2$s でない場合は %sサインアウト %s)', 'woocommerce' ), '<strong>', esc_html( $current_user->display_name ), '</strong>', '<a href="' . esc_url( wc_get_endpoint_url( 'customer-logout', '', wc_get_page_permalink( 'myaccount' ) ) ) . '">', '</a>' );
        } else {
            echo sprintf( esc_attr__( 'Hello %s%s%s (not %2$s? %sSign out%s)', 'woocommerce' ), '<strong>', esc_html( $current_user->display_name ), '</strong>', '<a href="' . esc_url( wc_get_endpoint_url( 'customer-logout', '', wc_get_page_permalink( 'myaccount' ) ) ) . '">', '</a>' );
        }
    ?>
    
[/code]

上記のように2言語仕様に変更してみましたが、やはりデフォルトしか表示されず、でした。サイト大改造中でアップデート出来ていなかったのですがこのために、一時的にプラグイン更新しました。  
お時間のある方、よろしければ上記コードのどこが実装に足りないのか教えて頂けたら幸いです。

[code]

    <?php $locale = get_locale(); ?>
    <?php if ('ja' == $locale  ) : ?>
        //デフォルト
    <?php else: ?>
        //セカンダリ
    <?php endif; ?>
    
[/code]

ちなみに、header.phpでも近い方法を取っているんですが、そちらは上記の記述で適用出来ています。  
ですが、当該箇所はこの記述では反映してくれませんでした。  
よろしくお願いいたします。


CC BY-SA 3.0
2016-12-27T20:16:39.040
31478
2017-01-06T07:57:38.153
2016-12-28T07:50:06.677
20039
20039
question
php wordpress
WordPressでマルチ言語を出し分けるphpコード


phpは専門外ですが、国際化対応のライブラリとして有名なgettextが[phpにも標準で実装されているようです](http://php.net/manual/ja/book.gettext.php)。独自実装よりも確実と思いますので、直接の回答ではありませんが参考までに。


CC BY-SA 3.0
2016-12-27T23:09:04.253
31479
2016-12-27T23:09:04.253
31478
answer


多言語対応とのことなので多言語プラグインを既に利用されているのでしょうか。

> デフォルト言語で表示されてしまっています。（サイト内でこの文言だけ）

当該の部分の文言を変えているけど対応している翻訳ファイルがない、ということですかね。

ならば、テキストドメイン(woocommerceになっている部分)を変え、独自の翻訳ファイル(po/mo)をPoEdit等で作り、`load_plugin_textdomain`でそれを読み込みます。

* * *

## 仮説：テーマ内にWooCommerceプラグインからコピペされた部分がある

WooCommerce自体は最新だけれども当該コピペが古い場合、この問題が発生しうるはずです。  
当該部分を最新の

[code]

    <p><?php
        /* translators: 1: user display name 2: logout url */
        printf(
            __( 'Hello %1$s (not %1$s? <a href="%2$s">Sign out</a>)', 'woocommerce' ),
            '<strong>' . esc_html( $current_user->display_name ) . '</strong>',
            esc_url( wc_logout_url( wc_get_page_permalink( 'myaccount' ) ) )
        );
    ?></p>
    
    <p><?php
        printf(
            __( 'From your account dashboard you can view your <a href="%1$s">recent orders</a>, manage your <a href="%2$s">shipping and billing addresses</a> and <a href="%3$s">edit your password and account details</a>.', 'woocommerce' ),
            esc_url( wc_get_endpoint_url( 'orders' ) ),
            esc_url( wc_get_endpoint_url( 'edit-address' ) ),
            esc_url( wc_get_endpoint_url( 'edit-account' ) )
        );
    ?></p>
    
[/code]

で置き換えればただしく表示されるでしょうか。

ただし、この事例のようにプラグインの翻訳文字列はそのうち変わるかもしれないので、テキストドメインを流用することは推奨されていません。(テーマの翻訳として持つべき、となります。テーマチェックにも引っかかりますね。)

* * *

## `gettext`フィルタを利用する

特定の翻訳だけ変えたい場合はフィルタを用いてコードで書くことも可能です。

<https://codex.wordpress.org/Plugin_API/Filter_Reference/gettext>

[code]

    add_filter( 'gettext', function ( $translated_text, $text, $domain ) {
        if ( 'woocommerce' === $domain && 'Hello %s%s%s (not %2$s? %sSign out%s)' === $text && 'ja' === get_user_locale() ) {
            $translated_text = 'こんにちは、%1$s%2$sさん%3$s (%2$sさんではない場合は%4$sログアウト 　%5$s)';
        }
    
        return $translated_text;
    }, 20, 3 );
    
[/code]


CC BY-SA 3.0
2016-12-28T01:34:04.670
31481
2016-12-28T09:49:35.270
2016-12-28T09:49:35.270
2376
2376
31478
answer


おそらく該当するコードは[こちら](https://github.com/woocommerce/woocommerce/blob/07932b443284edaefaecada9c2519a15a7ea5314/templates/myaccount/dashboard.php#L26-L42)だと思うので、その前提で回答させていただきます。また、直接プラグインを書き換えることはないと思いますが、テンプレートをオーバーライドできるので念のため。

> This template can be overridden by copying it to
> yourtheme/woocommerce/myaccount/dashboard.php.

~~まず、セカンダリ言語が表示されない理由として、[_e関数](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/_e)が使われてないからだと考えます。~~  
コメントで指摘の通り翻訳用の関数は呼ばれていました。

### 解決の提案1

テンプレートをオーバーライドしその中で_eを使い翻訳対応する。別途翻訳作業が必要になりますが、汎用性が高く対応言語が増えた場合でも楽だと思います。またコミュニティ還元したら喜ばれるかもしれません。

### 解決の提案2

テンプレートをオーバーライドしその中で言語ごとにテンプレートを分岐させる。具体的には

[code]

    $locale = get_locale();
    if ( $locale === 'ja' ) {
        //日本語のテンプレート
    } else {
        //元のテンプレート
    }
    
[/code]

などとしてはいかがでしょう。単純に楽だと思います。

### おまけ

今回は適用できませんが、Wordpressには[Action/Filter
フック](https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API#.E3.83.95.E3.83.83.E3.82.AF.E3.80.81.E3.82.A2.E3.82.AF.E3.82.B7.E3.83.A7.E3.83.B3.E3.81.A8.E3.83.95.E3.82.A3.E3.83.AB.E3.82.BF)があり、Woocommerceでもいくつか用意されています。場合によってはそこに処理を書くこともできるので参照してみてください。  
[woocommerce/wc-template-hooks.php at c980817f6df900e3f13095930b0bd445fff01faa
·
woocommerce/woocommerce](https://github.com/woocommerce/woocommerce/blob/c980817f6df900e3f13095930b0bd445fff01faa/includes/wc-
template-hooks.php)


CC BY-SA 3.0
2016-12-28T01:45:46.230
31482
2016-12-28T09:32:52.310
2016-12-28T09:32:52.310
186
186
31478
answer


ざっくりと気になる部分と  
お急ぎっぽいので発想をかえて力技を（後で修正必須ですが汗汗汗）

適用できていないのは  
$localeのスコープが関係していそうな気もしますが  
前述回答でご提示のあった下記ソースはお試しいただけましたでしょうか。

[code]

    $locale = get_locale();
    if ( $locale === 'ja' ) {
        //日本語のテンプレート
    } else {
        //元のテンプレート
    }
    
[/code]

呼び出す直前でもget_localeで  
呼び出している点を確認してみてください。  
$localeの中身などももし確認していないようでしたらvar_dump()などで  
ちゃんと値が表示されるか確認するといいかもしれません。

* * *

javascript等使える方がいればという前提で  
かなり力技ですがヘッダでは分岐ができているとのことなので  
ヘッダの分岐プラスログインページのみ分岐を分けるという方法はどうでしょうか。

[code]

    <?php $locale = get_locale(); ?>
    <?php if ('ja' == $locale ) : ?>
        <?php $slug_name = $post->post_name;
    　　　　　　　　if ($slug_name === 'loginpage' ) : ?>
                  <!--dom等で日本語の記述をねじ込むjavascript-->
        <?php else: ?>
                  //デフォルト
        <?php endif; ?>
    <?php else: ?>
        <?php $slug_name = $post->post_name;
    　　　　　　　　if ($slug_name === 'loginpage' ) : ?>
                  <!--dom等で英語の記述をねじ込むjavascript-->
        <?php else: ?>
        //セカンダリ
        <?php endif; ?>
    <?php endif; ?>
    
[/code]

もしほかのプラグインなどの干渉が原因でしたら  
他のプラグインの停止で動くかどうか、  
ソースの部分のみをデバックするなら  
単純にphpファイルのみを作ってテストできる環境などがあれば  
デバックしやすいかと思います。


CC BY-SA 3.0
2017-01-06T07:57:38.153
31661
2017-01-06T07:57:38.153
19992
31478
answer