iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 28
1
Modern Web

30天成為Laravel萌新系列 第 28

30天成爲Laravel萌新(第27天) - 本地化、多語言支援(Localization)

  • 分享至 

  • xImage
  •  
@extends("base",['title'=>'哎呀,找不著頁面'])

@section('title', '哎呀,找不著頁面')

@section('body')
    <h1>{{__('404 error message')}}</h1>
    <b>哎呀,找不著頁面</b>
    <p>
        <ul>
            <li><a href="/">點擊我,回到首頁</a></li>
            <li><a href="{{route('blog/post.index')}}">我的網誌</a></li>
        </ul>
    </p>
@endsection

開始

在昨天簡單建立的錯誤頁面中,又再一次偷渡了一個東西。對,就是那個有點怪怪的{{__('404 error message')}},實際上這等價於@lang('404 error message')。透過lang()函式的方式,也可以在控制器做變換。lang()會根據給定的字串,以及設定(app/config.php)中的localefaker_locale轉換為對應的語言。預設會轉換為locale所設定的,而備用語言可由faker_locale設定。當兩者都不存在時,會直接輸出字串。還記得我們把app/config.php部份內容改成這樣嗎?

    'locale' => 'zh-TW',
    'fallback_locale' => 'en',

不過,不管是locale還是faker_locale,都還找不著{{__('404 error message')}}要轉換成的文字,所以現在會直接生成404 error message


加入語言檔

現在,建立resources/lang/zh-TW.json,並加入以下內容。如此就有了zh-TW的翻譯了:

{
  "404 error message":"404錯誤 - 找不著頁面"
}

動態變更語言

不過如果每個人都是使用同樣的語言,多語言支援就沒有意義了。所以可以透過App::setLocale('zh-TW');來改變語言。譬如可以這麼做:

Route::get('welcome/{locale}', function ($locale) {
    App::setLocale($locale);
});

與許多大網站一樣,在網路路徑中加入語系。或是像下面這樣,提供一個Endpoint來設定語言:

Route::get('/lang/set/{lang}', function ($locale) {
    App::setLocale($locale);
});

最後,還有App::getLocale();App::isLocale('en')等等方法。就函式名字上應該不難懂,但還是可以參考文件找範例。

json外的其他用法

除了使用JSON以外,還可以使用 PHP 去做設定,這麼做的好處是可以在語言檔使用PHP的函式。現在建立resources/lang/zh-TW/error.php

<?php

return [
    "404"=>[
        "error message" => "404錯誤 - 找不著頁面",
    ]
];

然後來把{{__('404 error message')}}改成{{__('error.404.error message')}}。此外,透過這種方式,還可以巢狀的設定文字。

其他資源

最後,分享一些公開的翻譯語言檔。以下兩個資源同樣採用 MIT 授權,可商用。有豐富常用的字詞翻譯:

laravel-nova也是Laravel提供的一個後台管理框架。


上一篇
30天成爲Laravel萌新(第26天) - 客製化404錯誤頁面
下一篇
30天成爲Laravel萌新(第28天) - 上傳檔案
系列文
30天成為Laravel萌新32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言