---
tags: laravel
---
# Localized 本地化

Laravel的本地化功能提供一個便利的方式來取得各種語系的字串,讓你能夠輕易的讓應用支持多語系。語系字串被存在 resources/lang資料夾內的檔案裡頭。在這個資料夾內應該有各種所要支持語系的子資料夾:
//資料夾結構
/resources
/lang
/en
messages.php
/es
messages.php
所有的語言檔案都回傳對應key的字串,例如:
<?php
return [
'welcome' => 'Welcome to our application'
];
### 設定語系
可透過app.php檔案來設定語系
```
//config/app.php
設定預設語系
'locale' => 'zh_TW',
設定替代語系,作為當預設語系本地化內容不存在時的替代語系
'fallback_locale' => 'en',
```
如需動態設定,可透過以下程式來加以設定
`App::setLocale('zh_TW');`
### 取得與確認語系
```
取得預設語系
App::getLocale();
確認預設語系是否為某個語系
if(App::isLocale('zh_TW')){
//確實預設語系為zh_TW
}
```
### 定義本地化內容
#### 短字串
副檔名為.php,存放在resources/lang/語系資料夾(如zh_TW),每個語系可有多個檔案
```
//resources/lang/zh_TW/generic.php
return [
"welcome" => "歡迎使用我們的網頁服務";
];
```
#### 翻譯字串
檔名為 語系.json(如zh_TW.json),存放在resources/lang,每個語系只有一個檔案
```
//resources/lang/zh_TW.json
{
"welcome to our webiste" : "歡迎使用我們的網頁服務"
}
```
### 取用本地化內容
取用短字串本地化內容,需要在.符號前說明檔案名稱,取用翻譯字串則不需要
==如果找不到本地化內容,將會顯示key值做為內容==
#### 透過幫助函式__()
```
//resources/views/auth/login.blade.php
取用短字串本地化內容
{{ __('generic.username') }}
取用翻譯字串本地化內容
{{ __('Login From Facebook') }}
```
#### 透過Blade標籤@lang
```
//resources/views/auth/login.blade.php
取用短字串本地化內容
@lang('generic.username')
取用翻譯字串本地化內容
@lang('Login From Facebook')
```
### 帶參數的本地化內容
可建立包含佔位參數的本地化內容,於取用本地化內容時傳入。佔位參數與傳入時的Key只需字母相同,大小寫視為相同
```
//resources/lang/zh_TW/generic.php
return [
'remember' => '記得:name'
];
//resources/views/auth/login.blade.php
{{ __('generic.remember',['name' => '我']) }}
```
==佔位參數如取名全大寫,則顯示時的內容將為全大寫,否則一般顯示為首字母大寫。==
### Pluralization 複數型
複數型是一個比較複雜的問題,因為不同的語言有眾多複雜的複數型規則。透過使用 | 字元,你能夠區別單數和複數的字串:
'apples' => 'There is one apple|There are many apples',
你甚至能夠創造更多更複雜的複數型規則,以支應多種數字範圍的翻譯字串:
'apples' => '{0} There are none|[1,19] There are some|[20,*] There are many',
在定義好擁有多個複數選項的翻譯字串,你能夠使用 trans_choice() 來取得所給定count(數量)的翻譯字串。在這個例子中,因為該count(數量)比1大,該翻譯字串的指定複數型會被回傳:
echo trans_choice('messages.apples', 10);
你同樣能夠為複數型翻譯字串定義佔位子字串。這些佔位子字串將會被所傳入的陣列作為 trans_choice() 的第三個參數所取代:
'minutes_ago' => '{1} :value minute ago|[2,*] :value minutes ago',
echo trans_choice('time.minutes_ago', 5, ['value' => 5]);
假如你也想要將 trans_choice() 所傳入的count數量顯示在翻譯字串內,你可使用 :count 這個預定佔位子字串:
'apples' => '{0} There are none|{1} There is one|[2,*] There are :count',