30

私はLaravelローカリゼーションを使用して2つの異なる言語を提供しています。すべてのパスを設定しました。mydomain.com/en/ blaは英語を配信して「en」セッション変数を格納し、mydomain.com / he/blaはヘブライ語を配信して「he」セッション変数を格納します。しかし、言語切り替えリンクを提供するための適切な方法を理解することはできません。これはどのように機能しますか?

4

8 に答える 8

15

これをroutes.phpのbeforeフィルターに追加することで問題を解決しました:

// Default language ($lang) & current uri language ($lang_uri)
$lang = 'he';
$lang_uri = URI::segment(1);

// Set default session language if none is set
if(!Session::has('language'))
{
    Session::put('language', $lang);
}

// Route language path if needed
if($lang_uri !== 'en' && $lang_uri !== 'he')
{
    return Redirect::to($lang.'/'.($lang_uri ? URI::current() : ''));
}
// Set session language to uri
elseif($lang_uri !== Session::get('language'))
{
    Session::put('language', $lang_uri);
}

// Store the language switch links to the session
$he2en = preg_replace('/he\//', 'en/', URI::full(), 1);
$en2he = preg_replace('/en\//', 'he/', URI::full(), 1);
Session::put('he2en', $he2en);
Session::put('en2he', $en2he);
于 2012-10-10T19:40:22.737 に答える
12

これは私がlaravelフォーラムに最初に投稿した投稿ですが、他の誰かに役立つかもしれないので、ここにも投稿します。

アプリ用の簡単な言語スイッチャーを作成するのに問題があり、フォーラムの情報が少し古い(いくつかの投稿)ので、このシンプルなコードを作成して、アプリの言語を簡単に変更できるようにしました。飛ぶ。

私の見解には、次のような言語文字列があります。

{{ __('languagefile.the_language_string'); }}

そして、私はURLで言語を取得します。これが最良の方法であり、seoや人々が共有するリンクにも適していると思います。例:

www.myapp.com/fi/support (Finnish)
www.myapp.com/en/support (English)
www.myapp.com/sv/support (Swedish)

さて、問題は、セッションやCookieをいじることなく、その場で言語を変更する簡単な方法が必要だったことです。これが私がそれを作った方法です:

ライブラリフォルダにchooselang.phpという名前のライブラリを作成します

次のコードを中に挿入します。

class Chooselang extends HTML {
    /**
     * Generate a Language changer link.
     *
     * <code>
     *      // Generate a link to the current location,
     *      // but still change the site langauge on the fly
     *      // Change $langcode to desired language, also change the Config::set('application.language', 'YOUR-LANG-HERE')); to desired language
     *      // Example
     *      echo Chooselang::langslug(URI::current() , $langcode = 'Finnish' . Config::set('application.language', 'fi'));
     * </code>
     *
     * @param  string  $url
     * @param  string  $langcode
     * @param  array   $attributes
     * @param  bool    $https
     * @return string
     */

    public static function langslug($url, $langcode = null, $attributes = array(), $https = null)
    {
        $url = URL::to($url, $https);

        if (is_null($langcode)) $langcode = $url;

        return '<a href="'.$url.'"'.static::attributes($attributes).'>'.static::entities($langcode).'</a>';
    }

}

この後、URLスイッチャーのURLを生成する準備が整います。他のブレードリンクと同じように追加するだけです。

フィンランド語、スウェーデン語、英語のリンクを生成する方法の例(Bladeを使用)

  {{ Chooselang::langslug(URI::current() , $langcode = 'Fin' . Config::set('application.language', 'fi')); }}
  {{ Chooselang::langslug(URI::current() , $langcode = 'Swe' . Config::set('application.language', 'sv')); }}
  {{ Chooselang::langslug(URI::current() , $langcode = 'Eng' . Config::set('application.language', 'en')); }}

上記は常に現在のページにあるURLを生成し、langスラグを必要なものに変更します。このようにして、言語が希望の言語に変更され、ユーザーは自然に同じページに留まります。デフォルトの言語スラッグがURLに追加されることはありません。

生成されたURLは次のようになります。

<a href="http://localhost/laravel/public/support">Fin</a>
<a href="http://localhost/laravel/public/sv/support">Swe</a>
<a href="http://localhost/laravel/public/en/support">Eng</a>

PS。リンクをマスターテンプレートファイルに追加すると、リンクは特に便利です。

于 2012-11-20T08:05:36.310 に答える
5

たとえば、言語を変更するためのルートを設定できます。

Route::get('translate/(:any)', 'translator@set');

次にset、コントローラーのアクションでtranslator、URLを介して渡される言語コードに応じてセッションを変更できます。

を使用して構成設定を変更することもできます

Config::set('application.language', $url_variable');

コントローラの例-translate.php

public function action_set($url_variable)
{
     /* Your code Here */
}
于 2012-10-03T14:27:32.587 に答える
3

ローカリゼーションにパッケージを使用したい場合に備えて、将来のユーザーのためにhttps://github.com/mcamara/laravel-localizationにすばらしいパッケージがあります。インストールが簡単で、多くのヘルパーがあります。

于 2014-03-17T15:42:06.893 に答える
2

この質問はまだGoogle検索に含まれているため、Laravel 4または5、およびmcamara/laravellocalizationを使用している場合の回答は次のとおりです。

<ul>
    <li class="h5"><strong><span class="ee-text-dark">{{ trans('common.chooselanguage') }}:</span></strong> </li>
        @foreach(LaravelLocalization::getSupportedLocales() as $localeCode => $properties)
            <li>
               <a rel="alternate" hreflang="{{$localeCode}}" href="{{LaravelLocalization::getLocalizedURL($localeCode) }}">
                   <img src="/img/flags/{{$localeCode}}.gif" /> {{{ $properties['native'] }}}
               </a>
           </li>
        @endforeach
</ul>

この例はフラグ(public / img / flags / {{locale}}。gif)を示しており、これを使用するには少し.cssが必要ですが、必要に応じてテキストを表示するように変更できます。 。

ご参考までに。mcamara / laravellocalizationのドキュメントには、例と多くのヘルパーが含まれているため、githubのドキュメントを確認してください。(https://github.com/mcamara/laravel-localization

于 2015-09-03T08:21:36.653 に答える
1

セッションを使用してみてください。このようなもの:

コントローラ:

 class Language_Controller extends Base_Controller {

        function __construct(){
            $this->action_set();
            parent::__construct();
        }

       private function checkLang($lang = null){
         if(isset($lang)){
           foreach($this->_Langs as $k => $v){
             if(strcmp($lang, $k) == 0) $Check = true;
           }
       }
        return isset($Check) ? $Check : false;
       }

       public function action_set($lang = null){
        if(isset($lang) && $this->checkLang($lang)){
            Session::put('lang', $lang);
            $this->_Langs['current'] = $lang;
            Config::set('application.language', $lang);
        } else {
            if(Session::has('lang')){
                Config::set('application.language', Session::get('lang'));
                $this->_Langs['current'] = Session::get('lang');
            } else {
                $this->_Langs['current'] = $this->_Default;
            }
        }
        return Redirect::to('/');
    }
}

Route.phpの場合:

Route::get('lang/(:any)', 'language@set');
于 2012-10-10T18:56:16.890 に答える
1

私はこのようにやっています:

$languages = Config::get('lang.languages'); //returns array('hrv', 'eng')

$locale = Request::segment(1); //fetches first URI segment

//for default language ('hrv') set $locale prefix to "", otherwise set it to lang prefix
if (in_array($locale, $languages) && $locale != 'hrv') {
    App::setLocale($locale);
} else {
    App::setLocale('hrv');
    $locale = null;
}

// "/" routes will be default language routes, and "/$prefix" routes will be routes for all other languages
Route::group(array('prefix' => $locale), function() {

    //my routes here

});

ソース: http: //forumsarchive.laravel.io/viewtopic.php?pid = 35185#p35185

于 2014-05-01T10:38:01.740 に答える
0

私が行っていることは、2つのステップで構成されています。次のフィールドで構成される言語テーブルを作成しています。

id | 名前| ナメクジ

たとえば、言語に必要なデータを保持します

1 | ギリシャ語| gr

2 | 英語| en

3 | deutch | de

以下のコードで使用する言語モデルは、そのテーブルを参照しています。

したがって、routes.phpには次のようなものがあります。

//get the first segment of the url
$slug = Request::segment(1);   
$requested_slug = "";

//I retrieve the recordset from the languages table that has as a slug the first url segment of request
$lang = Language::where('slug', '=', $slug)->first();

//if it's null, the language I will retrieve a new recordset with my default language
$lang ? $requested_slug = $slug :  $lang = Language::where('slug', '=', **mydefaultlanguage**')->first();

//I'm preparing the $routePrefix variable, which will help me with my forms
$requested_slug == ""? $routePrefix = "" : $routePrefix = $requested_slug.".";

//and I'm putting the data in the in the session
Session::put('lang_id', $lang->id);
Session::put('slug', $requested_slug);
Session::put('routePrefix', $routePrefix );
Session::put('lang', $lang->name);

そして、要求されたスラッグをプレフィックスとして使用してルートを書き込むことができます...

Route::group(array('prefix' =>  $requested_slug), function()
{
    Route::get('/', function () {
        return "the language here is gonna be: ".Session::get('lang');
    });

    Route::resource('posts', 'PostsController');
    Route::resource('albums', 'AlbumsController');
});

これは機能しますが、このコードは、アプリでルートが変更されるたびにデータベースに言語を要求します。どうすればよいかわかりません。もしそうなら、ルートが別の言語に変更されたかどうかを検出するメカニズムを理解する必要があります。

お役に立てば幸いです。

于 2013-09-24T02:11:28.133 に答える