Localization

Giới thiệu

Localization của laravel cung cấp một cách tiện lợi cho việc lấy các chuỗi dữ liệu từ các ngôn ngữ khác nhau, cho phép bạn dễ dàng tạo ứng dụng đa ngôn ngữ trong ứng dụng của bạn. Các chuỗi dữ liệu được lưu rong file nằm ở trong thư mục resources/lang. Bên trong thư mục này có chứa các thư mục con cho mỗi ngôn ngữ được hỗ trở bởi ứng dụng:

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

Tất cả các file ngôn ngữ đơn giản chỉ cần trả về mảng các chuỗi key. Ví dụ:

<?php

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

Cấu hình ngôn ngữ

Ngôn ngữ mặc định được thiết lập trong file cấu hình config/app.php . Tất nhiên, bạn có thể chỉnh sửa sao cho phù hợp với ứng dụng của bạn. Bạn cũng có thể thay đổi ngôn ngữ sử dụng mặc định bằng cách sử dụng hàm setLocale trong App facade:

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

    //
});

Bạn cũng có thể cấu hình "ngôn ngữ thay thế", khi mà ngôn ngữ đang sử dụng không có chứa file ngôn ngữ tương ứng. Giống như ngôn ngữ mặc định, ngôn ngữ thay thế cũng được cấu hình trong file config/app.php:

'fallback_locale' => 'en',

Kiểm tra ngôn ngữ hiện tại

Bạn có thể sử dụng phương thức getLocale and isLocale trong App facade để xác định ngôn ngữ hiện tại hoặc kiểm tra giá trị của ngôn ngữ hiện tại:

$locale = App::getLocale();

if (App::isLocale('en')) {
    //
}

Nhận dòng ngôn ngữ

Bạn có thể lấy các dòng trong file ngôn ngữ bằng cách sử dụng hàm trans. Phương thức trans nhận tên file và khóa trong file ngôn ngữ ở đối số đầu tiên. Ví dụ, để lấy dòng có khóa là welcome trong file resources/lang/messages.php:

echo trans('messages.welcome');

Tất nhiên nếu bạn sử dụng Blade templating engine, bạn có thể sử dụng cú pháp {{ }} để hiện thị dòng trong file ngôn ngữ hoặc sử dụng @lang directive:

{{ trans('messages.welcome') }}

@lang('messages.welcome')

Trường hợp nếu dòng ngôn ngữ không tồn tại, hàm trans sẽ trả về từ khóa của dòng đó. Vì vậy, ở ví dụ trên, hàm trans sẽ trả về messages.welcome nếu dòng này không tồn tại.

Đổi tham số trong dòng ngôn ngữ

Nếu bạn muốn, bạn có thể khai báo các giá trị thay thế trong file ngôn ngữ. Tất cả các giá trị thay thế được tiền tố với đầu :.Ví dụ, bạn khai báo một nội dung welcome với tên của giá trị thay thế:

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

Khi thực hiện thay thế lấy ngôn ngữ, truyền vào một mảng các giá trị thay thế vào tham số thứ hai của hàm trans:

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

Nếu giá trị thay thế chứa toàn ký tự in hoa, hoặc chỉ viết đầu chữ hoa, thì giá trị được truyền vào sẽ được viết tương ứng:

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

Tạo số nhiều

Tạo số nhiều là một vấn đề khó, như các ngôn ngữ khác nhau đều có quy tắc phức tạp để chuyển từ sang số nhiều. Bằng cách sử dụng ký tự "|" , bạn có thể phân biệt được thể số ít hay số nhiều của một chuỗi:

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

Sau khi định nghĩa, bạn có thể dùng hàm trans_choice để lấy dòng ngôn ngữ cho một giá trị "count". Trong ví dụ này, khi mà giá trị count lớn hơn một, thì thể số nhieuf của dòng ngôn ngữ được trả về:

echo trans_choice('messages.apples', 10);

Vì phần phiên dịch của Laravel dựa trên thành phần phiên dịch của Symfony, bạn thậm chí có thể tạo các quy tắc phức tạo cho số nhiêud:

'apples' => '{0} There are none|[1,19] There are some|[20,Inf] There are many',

Ghi đè nội dung của file ngôn ngữ

Vài packages có thể đính kèm file ngôn ngữ riêng của nó. Thay vì chỉnh sửa các file ngôn ngữ core, bạn có thể thực hiện ghi đè bằng file riêng của bạn bằng cách đặt vào trong thư mục resources/lang/vendor/{package}/{locale}.

Ví dụ, nếu bạn cần ghi đè nội dung tiếng anh trong file messages.php của một package tên là skyrim/hearthfire, bạn sẽ đặt file ngôn ngữ tại : resources/lang/vendor/hearthfire/en/messages.php. Trong file này chỉ nên định nghĩa các dòng ngôn ngữ bạn muốn thay thế. Bất cứ dòng nào bạn không ghi đè thì nõ vẫn lấy từ file gốc.

Nguồn: https://laravel.com/docs/5.3/localization