web-dev-qa-db-ja.com

ボタンをクリックして言語を変更する

目標は、 パブリックインターフェイスを切り替えるためのボタン/選択ドロップダウンなどを提供することです。1) その場での言語。

私が探しているもの

  • プラグイン または テーマコード...
  • ... または アイデア
  • load_textdomain()を使用した回避策を使用すると、翻訳を.po/.moファイルに任せることができます。
  • Textdomain関数に頼らないときに、文字列をどのようにしてインタフェース(例えばajax/plain php/ini、json、xmlファイル)にパースするかのアイデア

注意:

1) 異なる言語で出版することではありません。

2) 実際のドロップダウン/ボタンを作成するコードは必要ありません。 UI用の文字列を提供するコード/システムに関するものだけです。

ありがとうございます。

21
kaiser

はるかに良い(最も簡単な)方法はロケールフィルタ( get_locale() の内側)を使うことです。

最初にlocaleフィルタで使用するために異なる言語を検索するためのクイック関数を設定します。

/**
 * A function returns with returns the user's selectd locale, if stored. 
 */
function wpse35622_get_new_locale($locale=false){
$new_locale = get_user_meta(get_current_user_id(), 'wpse_locale', true);
    if($new_locale)
        return $new_locale;

    return $locale;
}

私はこれをグローバル関数として残しました、便利かもしれません…?プラグインの残りの部分は、クラス内にラップしました。

選択可能な言語のドロップダウンが作成されます。

欠点

  • wp-content/languagesの形式のファイルをxx_xx.moで検索します。その形式ではない(すべての.moファイルがそうであるとは限らない)場合、プラグインはそれを認識しません。
  • ドロップダウンリストから選択可能なロケールの一覧が得られますが、これらはロケールの 'xx_xx`形式で表示され、人に優しい方法ではありません。
  • $localeは言語以外のことをしますか?もしそうなら、それでもロケールを同じにすることは可能ですが、代わりの翻訳を提供します。とても面倒ですが….

コード

class SH_Pick_Lang{
    /**
     * A unique name for this plug-in
     */
    static $name ='sh_pick_lang';

    /**
     * Hook the functions
     */
    public function __construct(){

        if( isset($_POST[self::$name]) ){
            add_action('locale',array($this,'update_user'));
        }
        add_filter( 'locale', 'wpse35622_get_new_locale',20 );
        add_action( 'wp_before_admin_bar_render', array( $this, 'admin_bar') );
    }

    /**
     * Update the user's option just in time! Only once mind...
     */
    function update_user($locale){
        $save_locale = $_POST[self::$name];
        update_user_meta(get_current_user_id(), 'wpse_locale', $save_locale);
        remove_filter(current_filter(),__FUNCTION__);
        return $locale;
    }

    /**
     * Add a really horrible looking dropdown menu that I'm sure Kaiser will make look fantastic.
     */
    function admin_bar(){
        global $wp_admin_bar;

        $wp_admin_bar->add_menu( array(
            'id'        => 'shlangpick',
            'title'     => $this->wpse_language_dropown(),
        ) );
    }

    /**
     * Generates a list of available locales.
     * Searches the wp-content/languages folder for files of the form xx_xx.mo
     * 
     * TODO Not all locales are of the form xx_xx.mo - we might miss some.
     * TODO Better way of gettin gthe wp-content/languages folder without a constant?
     */
    function wpse_language_dropown(){
         $name = self::$name;
         $locale = get_locale();
         $langs = get_available_languages();
         $langs[] = 'en_US';

         //For the labels (format_code_lang)
         require_once( ABSPATH . 'wp-admin/includes/ms.php');

         $html = "<form method='post'> ";
         $html .= "<select name='{$name}'>";
         foreach($langs as $lang){
              $label = format_code_lang( $lang );
              $html .= "<option ".selected( $lang, $locale, false)." value='{$lang}'>{$label}</option>";
        }
         $html .= "</select>";
         $html .= get_submit_button('Change Language','secondary', 'submit', true);
         $html .= "</form >";

         return $html;
    }

} // END Class

//Initiate...
$sh_pick_lang = new SH_Pick_Lang();
15
Stephen Harris

ページの更新を済ませることができるのであれば、WPLANG定数を再定義することが選択肢になるでしょう。私は多言語プラグインがUI翻訳を引き起こすことができない多言語コンテンツを持つ2つのサイトでそれをしています。

5
Johannes Pille

http://www.qianqin.de/qtranslate/ /

あなたが必要なのは….

コメントの後にI - を編集します。最初に - downvotes急流に貢献したすべての人に感謝します。 (これは、人があまり頻繁に訪れないときに起こることです: - ))

now - 切り替えを処理する機能はqtranslate-coreにあります。 (80行目以降で始まる - あなたが望むバージョンに依存する。)

NOT OOPコードを調べることはできず、他に何もすることはありません。合成には10分かかりました。言い換えれば、OOPを別のOOP以外のコードでコンパイルしてください。

(すみません、 - ここで原始的な古いスカル)

私は質問を理解していると仮定します。&&コードを管理者用にしたい、そして&&コードが最適ではないと理解していたらフロントエンドに移植する方法を知っていると仮定します。

<?php
/*
Plugin Name: k99 language switcher
Plugin URI: http://www.krembo99.com
Description: Admin Language switcher proof of concept only - do not use in production.
Version: 0.0.0.0.0.0.0.1
Author: Krembo99
Author URI: http://www.krembo99.com
*/ 
?>
<?php function k99_add_language_menu() {
    //  k99_load_ajax_display_functions();
?>  
    <div class="mgmb_help_setting">
    <?php _e('Language:','your_text_domain'); ?>
    <select name="mgmb_language_setting_help" id="mgmb_language_setting_help" onChange="mgmb_set_language_cookies(this.value);" >
        <option value="en_US" <?php if($_COOKIE['k99_userLang']=="en_US"){echo "selected";} ?>><?php _e('English','your_text_domain');?></option>
        <option value="de_DE" <?php if($_COOKIE['k99_userLang']=="de_DE"){echo "selected";} ?>><?php _e('German','your_text_domain');?></option>
        <option value="zh_CN" <?php if($_COOKIE['k99_userLang']=="zh_CN"){echo "selected";} ?>><?php _e('Chinese','your_text_domain');?></option>
    </select>
    </div>
<?php   
}
// Now we set that function up to execute when the help action is called
add_filter('contextual_help', 'k99_add_language_menu');

// I guess this is your mysterious "browser stuff"
function k99_language_change($lang){ 
 global $locale;
 // wp_cache_set( "language", $lang, 'options' );
    if ( isset($_COOKIE['k99_userLang'])) {
      $lang = $_COOKIE['k99_userLang'];
    }
    define( 'WPLANG', $lang );
 if($locale!= $lang) {
    $locale = $lang;
    load_plugin_textdomain('your_text_domain', false, dirname( plugin_basename(__FILE__) ) . '/lang'); // sample use for plugins textdomain
    load_plugin_textdomain('your_text_domain2', false, dirname( plugin_basename(__FILE__) ) . '/lang');
    load_plugin_textdomain('your_text_domain3', false, dirname( plugin_basename(__FILE__) ) . '/lang');
 }
  return $locale;
}
add_filter('locale', 'k99_language_change',99);

////////// +++++++++++++++  START COOKIES CREATION +++++++++++++++//////////////////
// Javascript function set the language cookies
// access external
// @param lang - language code
// @return NULL
// or maybe this is the OP´s mysterious "browser stuff" ??
    function mgmb_print_script() {
    ?>
    <script type="text/javascript" >
    function mgmb_set_language_cookies(lang){   
        var Then = new Date(); 
        Then.setTime(Then.getTime() + 10000*60*60*1000 ); //set cookie expire to 10000 hours cookies (hour*minute*seconds*1000)
        document.cookie = "k99_userLang="+lang+";expires="+ Then.toGMTString();
        window.location.reload();
        } 
        </script>
<?php
} 
add_action('admin_print_scripts', 'mgmb_print_script');  // this is not the right way to do .. but no time now.
?>

備考 :

1 - これは10分で構築されました。空港にいる間はローカルマシンで。私がこれを言う理由は、私がここで持っている唯一の準備ができて利用可能なwordpressインストールがかなり古いということです。 (2.9と思います)。

これは、新しいdiv構造が最近(タブ付きで)導入されたという事実のために、おそらく言語メニューがコンテキストヘルプdivの下に表示されることを意味しますが、それでも動作するはずです。 (時間があれば、後でまた戻ってくると約束します)

もっと時間があったら(そしてここで新しいワードプレスのコードを)私はおそらくこれを新しいadmin-barにadd_action( 'admin_bar_menu', 'k99_add_language_menu_2', 1000 );で統合するでしょう(私はすでにこれに戻ることを約束しました)

2 - あなたはwp-content(よりよい??)またはwp-includeの "languages"フォルダの中にリストされた言語ファイルを持つべきです。この点に関して - コードは概念の証明にすぎません - そしてもちろん、メニューが動的な方法で構築されるべきであり、ここで行われていないような時間がある場合はもちろんです。

3 - 設定内のWPLANGが空になっているはずです。言語がすでに設定されている場合、新しいバージョンのwpで動作するかどうかはわかりません。

4 - これはqtranslateコード(やはり古いバージョン)で見られたものに基づいて構築された単純な合成された言い換えられた概念の証明です - それでほとんどのことは「正しい」方法ではなく、専用のテキストドメインなどはありません。

編集II

今日誰かがラッキーです! (フライト遅延 )

あなたがアプローチのための「アイデア」を探していたので、これはもう一つの有名なものです。

それはプラグインや実際には他の非排他的な環境には収まりませんが、それはあなたに "ブラウザのもの"を処理する方法として別の方向性を与えるかもしれません。

これは、<a href="index.php?lang=de">German</a><a href="whatever.php?lang=ml">my Language</a>のようなGETで言語を取得することを可能にします。

使うために、あなたはコードを作成することができます(それをそれをwp-langswitch.phpと呼びましょう)。

 session_start();
 if ( isset( $_GET['lang'] ) ) {
    $_SESSION['WPLANG'] = $_GET['lang'];
    define ('WPLANG', $_SESSION[WPLANG]);
 } else {
    if(isset($_SESSION['WPLANG'])) {
        define ('WPLANG', $_SESSION['WPLANG']);
        $_GET['lang'] = $_SESSION['WPLANG'];
    } else {
        if ( isset( $_SERVER["HTTP_ACCEPT_LANGUAGE"] ) ) {
            $languages = strtolower( $_SERVER["HTTP_ACCEPT_LANGUAGE"] );
             $languages = explode( ",", $languages );
            $_SESSION['WPLANG'] = $languages[0];
            $_SESSION['WPLANG'] = str_replace("-", "_", $_SESSION['WPLANG']);
            $_GET['lang'] = substr($_SESSION['WPLANG'],0,2);
            define ('WPLANG', $_SESSION[WPLANG]);
        } else {
            define ('WPLANG', '');
        }
    }
 }

wp-configでは、WPLANG定数の直前に、コードを含める必要があります。

 require_once(dirname(__FILE__).'/wp-langswitch.php');
 define ('WPLANG', ''); 

今 - 明らかにそれは言語を格納するためにミックスにいくつかのクッキーを追加することがより良いでしょう。

編集III

私は後でこれに戻ることを約束しました - これが(context-help-menuの代わりに)admin-barの中に統合される方法です(非常に不正確で原始的な方法で)。

 function k99_add_language_menu_bar() {
    global $wp_admin_bar, $wpdb;
    if ( !is_super_admin() || !is_admin_bar_showing() )
        return;
// I am sure you can find a way alone to construct array from reading folder . If not , comment and I will update again.

if($_COOKIE['k99_userLang']=="en_US"){$sel==$_COOKIE['k99_userLang'];} 
if($_COOKIE['k99_userLang']=="de_DE"){$sel==$_COOKIE['k99_userLang'];}
if($_COOKIE['k99_userLang']=="zh_CN"){$sel==$_COOKIE['k99_userLang'];}

    $k99_lang = '';
    $k99_lang .= '<select name="mgmb_language_setting_help" id="mgmb_language_setting_help" onChange="mgmb_set_language_cookies(this.value);" >';
    $k99_lang .= '<option value="en_US" >English</option>';
    $k99_lang .= '<option value="de_DE" >German</option>';
    $k99_lang .= '<option value="zh_CN" >Chinese</option></select>';

    /* Add the main siteadmin menu item */
    $wp_admin_bar->add_menu( array( 'id' => 'Language', 'title' => __( 'language', 'your_text_domain3' ), 'href' => FALSE ) );
    $wp_admin_bar->add_menu( array( 'parent' => 'Language', 'title' => $k99_lang, 'href' => FALSE ) );
}
add_action( 'admin_bar_menu', 'k99_add_language_menu_bar', 999 );

この関数を古いコード(オリジナルのNON - OOP non-plugin)に置き換える(または追加する)だけです。

私が言ったように、私はローカルにadmin-barを特徴とする新しいwordpressインストールをここに持っていない - しかしそれはうまくいくはずである。

(そして、それはうまくいかないかもしれません…でも、本当に望むならそれを修正できると私は確信しています - たとえそれがOOPではないと思ったとしても):-)

今走らなきゃ。どういうわけかそれが役立つことを願っています。

編集IV - 管理メニューバーの編集IIIを作業バージョンに変更(少なくとも私のWp 3.4)

私は3.4の作業インストールがなかったので - そして今私は戻ってきた - 私はEdit IIIソリューションを編集しました - そしてそれは私のために働きます。

投票については、私はあまり気にすることはできませんでした。そして、私はどんな「報奨金」も必要ありません(それらがなんであっても..)それはあなたがおそらくそれをあなたがqTranslateの作者にそれを与えるべきである運動の目的のためでした。それがOOPではないという事実にもかかわらず:-) - それは多くの分野で学ぶことがたくさんある真面目なプラグインです。このプラグインリリースの「いつ」を考えると、それはすごいことです。たとえそうでなくても、NON OOPコードを読むということで説明できないほどの努力に値する - OOP。そしてそれが正しくインデントされていなくても(いい神だ!).

2
krembo99