# 在地化 (多國語言)

## 概念

所謂的在地化，就是讓網站中的文字以當地的語言來表示。在 Laravel 中製作多國語言的方法，是在 app/lang 目錄下，建立以各國的名稱命名的目錄，雖然這些目錄的命名並沒有特別規定，但是你可以使用 [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)\[1] 的標準來命名，例如：

```
app/lang/en
app/lang/tw
app/lang/jp
app/lang/fr
```

各個語言目錄中會使用 php 檔來儲存相對應的語言文字，這個檔案的只做一件事，回傳陣列型態的語言文字。

當你的多國語言資料都設定好後，Laravel 提供 Lang 類別在程式中取用指定的語言的字串。

## 建立語系檔

我們先在預設的 app/lang/en 中新增一個 default.php：

```
<?php

return array(
    'title' => 'My Blog'
);
```

回傳一個陣列，該陣列只有一筆資料。接著建立第 2 個語言的目錄 app/lang/tw，直接把 en 目錄中的 default.php 複製到 tw 目錄中，編輯：

```
<?php

return array(
    'title' => '我的部落格'
);
```

現在我們有兩種語言的文字了，兩個檔案裡的陣列 key 必須是一樣的，value 就換成該語系的內容。

## 預設語系

每個 Laravel 網站都有一個預設語系，在 app/config/app.php 中可以修改預設的語系：

```
'locale' => 'en',
'fallback_locale' => 'en',
```

將 'en' 改成你要的語系，例如 'tw'，如此網站就會載入 tw 目錄中的語言文字。

## 指定語系

你也可以在每個 Controller 中指定目前要顯示哪個語系的內容。假設要指定以 tw 來顯示：

```
App::setLocale('tw');
```

這行必須寫在最前面，這樣之後要取語言文字時才知道要取哪一個，所以 HomeController@index 可以改成：

```
public function index()
{
    App::setLocale('tw');
    $title = Lang::get('default.title');

    $posts = Post::all();

    return View::make('site.home')
            ->with('title', $title)
            ->with('posts', $posts);
}
```

使用 Lang::get('檔案名稱.key'); 就能取得某一語言檔案內某 key 的值。所以，記得語言檔案在任何語言目錄中都必須是同樣的名稱，key 也必須是同一名稱。

如果要在 View 裡面使用語言文字：

```
@lang('default.title')
```

它會依預設語系或在 Controller 中指定的語系來取得文字。

* \[1] [https://en.wikipedia.org/wiki/List\_of\_ISO\_639-1\_codes](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)
