在地化


  • 本地化
    • ##簡介
    • 區域設定
  • # 翻譯字串
  • #如何使用短鍵

如何使用翻譯字串作為鍵

######### 檢索翻譯字串############取代翻譯字串中的參數#############複數############### ###重寫擴充包的語言檔案############################

簡介

Laravel 本地化特性提供了從不同語言檔案中檢索字串的簡單方法,讓您的應用程式更能支援多語言開發。語言檔案預設都放在 resources/lang 目錄中。在此目錄中,對應的語言檔案存放在對應的子目錄下,例如:

/resources  
  /lang    
    /en
        messages.php      
     /es
         messages.php

所有的語言檔案都會傳回一個鍵值對數組,例如:

<?php
    return [  
      'welcome' => 'Welcome to our application' 
   ];

區域設定

應用程式的預設語言設定會儲存在config/app.php 設定檔中。你可以根據需要修改當前設置,也可以使用App Facade 的setLocale 方法動態地更改應用程式運行過程中使用的語言:

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

你也可以設定‘備用語言’,它會在當前語言不包含給定的翻譯字串時被使用。就像預設語言一樣,備用語言也可以在config/app.php 設定檔中設定:

'fallback_locale' => 'en',

確定目前語言環境

你可以使用App Facade 的getLocaleisLocale 方法來決定目前的區域設定或檢查語言環境是否為給定值:

$locale = App::getLocale();if (App::isLocale('en')) { 
   //
}

定義翻譯字串

#使用短鍵

通常,翻譯字串都存放在resources/lang 目錄下的檔案裡。在此目錄中,但凡應用支援的每種語言都應該有一個對應的子目錄:

/resources
  /lang     
   /en
        messages.php     
   /es
        messages.php

所有語言檔案都傳回鍵值對數組,例如:

<?php
  // resources/lang/en/messages.php
  return [  
    'welcome' => 'Welcome to our application'
   ];

使用翻譯字串作為鍵

對於有大量翻譯需求的應用,如果每個翻譯語句都要一一使用『短鍵』 來定義,那麼當你在視圖中嘗試去引用這些『短鍵』 的時候,很容易變得混亂。因此, Laravel 也支援使用字串 『預設』 翻譯作為關鍵字來定義翻譯字串。

使用翻譯字串作為鍵的翻譯檔案以 JSON 格式儲存在 resources/lang 目錄中。例如,如果你的應用程式中有西班牙文翻譯,你應該在該目錄下新建一個resources/lang/es.json 檔案:

{    
  "I love programming.": "Me encanta programar."
}

檢索翻譯字串

你可以使用輔助函數__ 從語言檔案檢索,__ 函數接受翻譯字串所在的檔案名稱加鍵名作為其第一個參數。例如,我們要檢索resources/lang/messages.php 語言檔案中的翻譯字串welcome

echo __('messages.welcome');
echo __('I love programming.');

如果你正在使用Blade 模板引擎,你可以在視圖文件中使用{{ }} 語法或使用@lang 指令來列印翻譯字串:

{{ __('messages.welcome') }}
@lang('messages.welcome')

如果指定的翻譯字串不存在,那麼__ 函數會直接傳回該翻譯字串的鍵名。所以,如果上述範例中的翻譯字串對應的鍵值對不存在, __ 函數將會直接傳回 messages.welcome

{note} @lang 指令不會對任何輸出進行轉義。當你使用這個指令時,你必須 完全由自己承擔 對輸出內容的轉義工作。

翻譯字串中的參數替換

如果需要,你可以在翻譯字串中定義佔位符。所有的佔位符都有一個 : 前綴。例如,你可以使用佔位符name 定義歡迎訊息:

'welcome' => 'Welcome, :name',

你可以在__ 函數中傳遞一個陣列作為第二個參數,它會將陣列中的值替換到翻譯字串的佔位符中:

echo __('messages.welcome', ['name' => 'dayle']);

如果你的佔位符中包含了首字母大寫或全部為大寫,翻譯過來的內容也會做相應的大寫處理:

'welcome' => 'Welcome, :NAME', 
// Welcome, DAYLE
'goodbye' => 'Goodbye, :Name', 
// Goodbye, Dayle

複數

複數是一個複雜的問題,因為不同的語言對複數有不同的規則, 使用『管道符號』 | ,可以區分字串的單複數形式:

'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 函數來檢索給定『數量』的內容。例如,設定 『總數』 為 10 ,符合數量範圍 1 至 19 ,所以會得到 There are some 這條複數語句:

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 佔位符:

'apples' => '{0} There are none|{1} There is one|[2,*] There are :count',

重寫擴充包的語言檔案

部分擴充包可能會附帶自己的語言檔案。你可以透過在 resources/lang/vendor/{package}/{locale} 目錄放置檔案來重寫它們,而不要直接修改擴充包的核心檔案。

例如,當你需要重寫 skyrim/hearthfire 擴充包的英文語言檔案messages.php ,則需要把檔案存放為resources/lang /vendor/hearthfire/en/messages.php 。在這個檔案中,你只需要定義你想要修改的翻譯字串。任何沒有被重寫的翻譯字串仍將從擴充包的原始語言檔案中載入。

本篇首刊在 LearnKu.com 網站上。