Laravel - Digging Deeper - Localization (官方文件原子化翻譯筆記)

# Introduction

學習一個框架, Ray 的想法是, 在深入理解底層實作的原理之前, 應該先知道這個框架的 使用方法; 先學習怎麼使用這個前人造的輪子, 再學習怎麼樣一個輪子。
所以本篇文章重點在於細讀官方文件, 並將內容理解後以 Q&A 的方式記錄下來, 加速學習以及查詢。

以下的 Laravel example directory structure 的意思是?
  • Example1:
    /resources
    /lang
    /en
    messages.php
    /es
    messages.php
  • Example2:
    /resources
    /lang
    en.json
    es.json

  • Answer:
    為 localization 的翻譯檔案置放規則
    1 為 Laravel 預設的方式, 2 適合當有大量的翻譯檔案時
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    use Illuminate\Support\Facades\App;

    Route::get('/greeting/{locale}', function ($locale) {
    if (! in_array($locale, ['en', 'es', 'fr'])) {
    abort(400);
    }

    App::setLocale($locale);

    //
    });
  • Answer:
    使用 API 來調整 locale, 如果沒有指定的語言則報錯
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    'fallback_locale' => 'en',
  • Answer:
    當 default locale file 沒有相對應的 transaction string 時, 使用 fallback locale

# Determining The Current Locale

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    use Illuminate\Support\Facades\App;

    $locale = App::currentLocale();

    if (App::isLocale('en')) {
    //
    }
  • Answer:
    取得 current locale 以及判斷 current locale

# Defining Translation Strings

# Using Short Keys

以下的 Laravel example locale code 的意思是?
  • Example:
    <?php
    {
    "I love programming.": "Me encanta programar."
    }
  • Answer:
    use translation string as key
以下的 Laravel example code 中, 如果 nl.json 檔案中沒有 ‘Action’ string, 但有 nl/action 這個檔案, 那會使用哪一個?
  • Example:
    <?php
    __('Action')
  • Answer:
    會使用 nl/action 這個檔案, 所以務必要避免衝突

# Retrieving Translation Strings

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    echo __('messages.welcome');
  • Answer:
    取得 default locale directory 中的 messages file 中的 welcome string key 的 value
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    echo __('I love programming.');
  • Answer:
    取得 default locale json file 中的 translation string key 的 value
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    {{ __('messages.welcome') }}
  • Answer:
    在 blade method 中使用 __() 取得 default locale directory 中, message file 中的 welcome string key 的 value

# Replacing Parameters In Translation Strings

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    // 在 localization 檔案中
    'welcome' => 'Welcome, :NAME',
    'goodbye' => 'Goodbye, :Name',

    // controller 內
    echo __('messages.welcome', ['name' => 'dayle']);
  • Answer:
    // Welcome, DAYLE
    // Goodbye, Dayle
    可在 localization 檔案中定義 placeholder, 並如果 placeholder 是大寫開頭, 帶進去的值也會自動地被 capitalised

# Pluralization

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    // in localization file
    'minutes_ago' => '{1} :value minute ago|[2,*] :value minutes ago',

    // in controller
    echo trans_choice('time.minutes_ago', 5, ['value' => 5]);
  • Answer:
    Localization file 內, 可使用 | 定義 singular 以及 plural transaction string, 然後透過 trans_choice() arg2 帶入的參數來決定 singular 或 plural, 也可在 arg3 帶入 placeholder 的 value
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    {
    "There is one apple|There are many apples": "Hay una manzana|Hay muchas manzanas"
    }

    // 或
    'apples' => 'There is one apple|There are many apples',

    // in controller
    trans_choice('message.apples', 5)
  • Answer:
    // There are many apples
    使用 | 來定義單複數, trans_choice arg2 可判斷單複數, 並取得定義好的 string
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    // in localization file
    'apples' => '{0} There are none|{1} There is one|[2,*] There are :count',

    // in controller
    return trans_choice('message.apples', 10)
  • Answer:
    // There are 10
    若要 display arg2 integer value, 可使用 default 的 :count

# Overriding Package Language Files

Laravel 中, 假如有個 package 有自己的 localization file, 該 package 名為 skyrim/hearthfire, 那我該怎麼覆寫它?

resources/lang/vendor/hearthfire/en/messages.php

Laravel - Testing - Mocking (官方文件原子化翻譯) Laravel - Eloquent ORM - Collections (官方文件原子化翻譯筆記)

留言

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×