web-dev-qa-db-ja.com

codeigniterウェブサイトを多言語にするための最良の方法。 lang配列からの呼び出しはlangセッションに依存しますか?

私は何時間も研究していますが、それを作るための明確で効率的な方法を見つけることができませんでした:/

英語のcodeigniterベースのWebサイトがあり、ポーランド語を追加する必要があります。訪問者の選択に応じて2言語でサイトを作成する最良の方法は何ですか?

言語ごとに配列ファイルを作成し、言語選択からのセッションに依存するビューファイルでそれらを呼び出す方法はありますか?私はデータベースを使いたくありません。

感謝します!締め切りが迫っています:/ありがとう!!

CodeIgniterの言語ライブラリ を見ましたか?

言語クラスは、国際化のために言語ファイルとテキスト行を取得する機能を提供します。

CodeIgniterシステムフォルダーには、言語ファイルのセットを含むlanguageという名前があります。エラーや他のメッセージを他の言語で表示するために、必要に応じて独自の言語ファイルを作成できます。

通常、言語ファイルはシステム/言語ディレクトリに保存されます。または、アプリケーションフォルダー内にlanguageというフォルダーを作成し、そこに保存することもできます。 CodeIgniterは、最初にアプリケーション/言語ディレクトリを探します。ディレクトリが存在しないか、指定された言語がそこにない場合、CIは代わりにグローバルシステム/言語フォルダーを検索します。

あなたの場合...

  • _polish_lang.php_の中に_english_lang.php_と_application/language/polish_を作成する必要があります
  • 次に、そのファイル内にキーを作成します(例:_$lang['hello'] = "Witaj";_
  • $this->lang->load('polish_lang', 'polish');のようにコントローラーにロードします
  • 次に$this->lang->line('hello');のような行をフェッチします。この関数の戻り値を変数に格納して、ビューで使用できるようにします。

英語と必要な他のすべての言語に対して手順を繰り返します。

92
Randell

また、セッションに言語を追加するには、各言語にいくつかの定数を定義し、config/autoload.phpにセッションライブラリを自動ロードするか、必要なときにいつでもロードするようにします。ユーザーの希望する言語をセッションに追加します。

$this->session->set_userdata('language', ENGLISH);

その後、次のようにいつでも取得できます。

$language = $this->session->userdata('language');
22
Matthew Rapati

コントローラーで、cunstructorを作成するときに次の行を追加します

すなわち、後

parent :: Controller();

以下の行を追加

    $this->load->helper('lang_translate');
    $this->lang->load('nl_site', 'nl'); // ('filename', 'directory')

ヘルパーファイルlang_translate_helper.phpを次の関数で作成し、ディレクトリsystem\application\helpersに配置します

function label($label, $obj)
{
    $return = $obj->lang->line($label);
    if($return)
        echo $return;
    else
        echo $label;
}

言語ごとに、system\application\languagesの下に、en、nl、frなどの言語略語のディレクトリを作成します。

上記の(それぞれの)ディレクトリに言語ファイルを作成します。このファイルには、以下に示すようにlabel => language_valueのペアを保持する$ lang配列が含まれます。

nl_site_lang.php

$lang['welcome'] = 'Welkom';
$lang['hello Word'] = 'worde Witaj';

en_site_lang.php

$lang['welcome'] = 'Welcome';
$lang['hello Word'] = 'Hello Word';

要件ごとに異なる方法で同じ言語の複数のファイルを保存できます。たとえば、バックエンド(管理者セクション)を管理するための個別の言語ファイルが必要な場合は、コントローラで$ this-> lang-> load( 'nl_admin'、 ' nl ');

nl_admin_lang.php

$lang['welcome'] = 'Welkom';
$lang['hello Word'] = 'worde Witaj';

そして最後に希望する言語でラベルを印刷するには、ビューで以下のようにラベルにアクセスします

label( 'welcome'、$ this);

OR

label( 'hello Word'、$ this);

hello&Wordのスペースに注意してください。このように使用することもできます:)

言語ファイルにラベルが定義されていない場合、関数ラベルに渡したものを単に出力します。

7
YoGo

ランデルの答えをもう一つ。

ただし、常に http://www.maxmind.com/app/php または http://www.ipinfodb.com/ などのGeoIPを統合できます。その後、codeigniterセッションクラスで結果を保存できます。

Ipinfodb.com APIを使用する場合は、ip2locationlite.class.phpファイルをcodeigniterアプリケーションライブラリフォルダーに追加し、モデル関数を作成して、アプリケーションに必要なgeoipロジックを実行できます。

function geolocate()
{
    $ipinfodb = new ipinfodb;
    $ipinfodb->setKey('API KEY');

    //Get errors and locations
    $locations = $ipinfodb->getGeoLocation($this->input->ip_address());
    $errors = $ipinfodb->getError();

   //Set geolocation cookie
   if(empty($errors))
   {
       foreach ($locations as $field => $val):
            if($field === 'CountryCode')
            {
                $place = $val;
            }
       endforeach;
   }
   return $place;
}
1
Ben Mullikin

WiredesignzのMY_Languageクラスを大成功で使用しました。

私はそれをgithubで公開しました。どこにもその痕跡が見つからないようです。

https://github.com/meigwilym/CI_Language

私の唯一の変更は、新しいv2の変更に応じて、クラスの名前をCI_Langに変更することです。

1
Mei Gwilym

使いやすくするために、CIはこれを更新しました。

$this->load->helper('language');

テキストを翻訳する

lang('language line');

ラベル内でワープする場合は、オプションのパラメーターを使用します

lang('language line', 'element id');

これは出力します

// becomes <label for="form_item_id">language_key</label>

よく読むために http://ellislab.com/codeigniter/user-guide/helpers/language_helper.html

1
Samy Massoud

実際のファイルを管理するとき、あなたが本当に用心していなければ、物事はかなり簡単に同期から外れます。そこで、Stringと呼ばれる(ベータ)無料サービスを開始しました。これにより、言語ファイルを簡単に追跡し、翻訳者と共同作業することができます。

既存の言語ファイルをインポートするか(PHP array、PHP Define、ini、poまたは.strings format)で)、または独自のセクションを最初から作成して追加することができますシステムを介して直接コンテンツ。

文字列は完全に無料ですので、チェックして、あなたの意見をお聞かせください。

実際にはCodeigniterにも構築されています! http://mygengo.com/string でベータ版をご覧ください

0
user151516

これに従ってください https://github.com/EllisLab/CodeIgniter/wiki/CodeIgniter-2.1-internationalization-i18n

そのシンプルで明確なドキュメントもチェックしてください@ http://ellislab.com/codeigniter/user-guide/libraries/language.html

より簡単な方法

0
Justis Matotoka

私はconfig.phpでそのようなコードを使用しています:

$lang = 'ru'; // this language will be used if there is no any lang information from useragent (for example, from command line, wget, etc...

if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);
$tmp_value = $_COOKIE['language'];
if (!empty($tmp_value)) $lang = $tmp_value;
switch ($lang)
{
    case 'ru':
        $config['language'] = 'russian';
        setlocale(LC_ALL,'ru_RU.UTF-8'); 
        break;
        case 'uk':
        $config['language'] = 'ukrainian';
        setlocale(LC_ALL,'uk_UA.UTF-8'); 
                break;
        case 'foo':
        $config['language'] = 'foo';
        setlocale(LC_ALL,'foo_FOO.UTF-8'); 
                break;
        default:
        $config['language'] = 'english';
        setlocale(LC_ALL,'en_US.UTF-8'); 
        break;
}

....そして、私は通常CIの内部メカニズムを使用しています

o、ほとんど忘れてしまいました!ビューでは、ボタンを使用します。ボタンは、ユーザーが好むCookieの言語を言語で設定します。

そのため、最初にこのコードは、ユーザーのユーザーエージェント(ブラウザー)に設定された「優先言語」を検出しようとします。次に、コードはCookie 'language'を読み取ろうとします。最後に、CIアプリケーションの言語を設定するスイッチ

0
Dmitry Khartsy