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


81

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

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

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

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


1
ここに投稿されたすべての回答は素晴らしいですが、それらを使用すると、ページのキャッシュオプションが失われます。これは、1つのコントローラーがキャッシュされ、設定した最後の言語になるためです。これに対する解決策はありますか。別のコントローラーを使用します。すべての言語で。

回答:


93

CodeIgniterの言語ライブラリを見たことがありますか?

言語クラスは、国際化の目的で言語ファイルとテキスト行を取得する関数を提供します。

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

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

あなたの場合...

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

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


迅速な回答をありがとう、はい私はこれを見ました。しかし、実際には明確ではありません:/必要なものを作成する方法、langファイルを作成する場所、形式、構造の種類、呼び出し方法などについて...私はcodeigniterにかなり慣れていません。だから私は明確なチュートリアルやsthを探していました。:/
Designer-trying-coding

1
heyoooそれは素晴らしいです、うまく機能しています:D助けてくれてありがとう!あなたは命の恩人です!:)ありがとう
Designer-trying-coding

2
これは編集不可能なテキストの解決策ですが、データベースに保存および取得された多言語コンテンツには対応していません。CIで作られたカスタムコンテンツ管理システムを備えた多言語サイトには、これ以上のものが必要になります。URLの言語セグメントや、唯一の言語で唯一のコンテンツを識別する一意のエイリアスセグメントを使用して、独自に作成しました。私はまだこれをよりよく管理する方法を理解していません。だから私はこのスレッドにぶつかりました。
ルイスマーティン

@Randellは機能していますが、onclickで他の言語に翻訳する方法の詳細を説明できますか?つまり、セッションに保存するということですか?方法

@Nadh、新しいスレッドに質問を投稿することをお勧めします。そうすれば、議論を簡潔に保つことができます。
ランデル2018年

22

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

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

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

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

はい、これは私の別の問題でした。あなたはすでに私を助けてくれました:D素晴らしいthganks!また、訪問者の言語選択を記憶するためにCookieを使用することも考えていました。
Designer-trying-coding

1
これらのセッションはどこで定義すればよいですか?各ページのコントローラーでこれらを定義するのは良くないと思います。グローバルファイルで定義する方法である必要があり、それはすべてのサイトに影響します。ありがとう!
Designer-trying-coding

どういうわけか、これを行うためのより良い方法があります。しかし、それはまったく新しい質問です。しかし、これはあなたが始めるためだけに行うこともできます。
ランデル

7

コントローラーで、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);

または

label( 'ハローワード'、$ this);

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

言語ファイルに定義されたラベルがない場合は、関数ラベルに渡したものを出力するだけです。


1

私はランデルの答えを2番目にしています。

ただし、http://www.maxmind.com/app/phphttp://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;
}

3
IPに基づいて言語を検出することはあまりうまく機能しません。VPN、旅行者、移民、またはカナダや中国のような複数の言語を持つ国について考えてみてください。ブラウザ言語を使用することをお勧めします。
PiTheNumber 2011年

1

使いやすくするために、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

私はWiredesignzのMY_Languageクラスを使用して大成功を収めました。

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

https://github.com/meigwilym/CI_Language

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


なぜ人々はグローバルを使用する必要性を感じるのですか?簡単ですが、大きな問題を引き起こす可能性があります。
スターレイズ2017

0

実際のファイルを管理する場合、本当に警戒しない限り、物事は非常に簡単に同期しなくなる可能性があります。そこで、Stringという(ベータ版の)無料サービスを開始しました。これにより、言語ファイルを簡単に追跡し、翻訳者と協力することができます。

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

文字列は完全に無料ですので、ぜひチェックして、感想をお聞かせください。

実際にはCodeigniter上に構築されています!http://mygengo.com/stringでベータ版をチェックしてください


これは実際には良い点です。CIの言語ファイルは、長期間にわたって維持するのは簡単ではありません。
sourcejedi 2012年


0

私は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の「言語」を読み取ろうとします。そして最後に-スイッチはCIアプリケーションの言語を設定します


-1

あなたはこのような機能を作ることができます

function translateTo($language, $word) {  
   define('defaultLang','english');  
   if (isset($lang[$language][$word]) == FALSE)  
      return $lang[$language][$word];  
   else  
      return $lang[defaultLang][$word];  
}

6
これは悪いプログラミングの例であり、不快感はありません。関数に定数を定義しないでください。そのため、定数と呼ばれ、値は変更されないため、一度だけ定義されます。次に、issetはtrueとfalseのみを返すため、コードisset($lang[$language][$word]) == FALSEはこのように十分です。そして第三に、何かが間違っているかどうかを評価するときは、常にタイプを確認するために使用してください。isset($lang[$language][$word])===
machineaddict 2013年

-1

友だち、心配しないでください。codeigniterに組み込まれているアプリケーションがインストールされていて、言語パックを追加したい場合は、次の手順に従ってください。

1.フォルダーapplication / language / arabicに言語ファイルを追加します(ciに組み込まれているsma2にアラビア語の言語を追加します)

2. application / modules / settings / views /setting.phpで指定さsetting.phpれたファイルに移動します。ここに配列があります

<?php /*

 $lang = array (
  'english' => 'English',

  'arabic' => 'Arabic',  // i add this here

  'spanish' => 'Español'

次に、アプリケーションを保存して実行します。それはうまくいきました。


setting.phpライブラリまたはヘルパーを使用したことがある場合は、名前の付いたファイルはありません。最初に共有してください。
Ali Qorbani 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.