12/08/2018, 14:48

Localization in Laravel 5.4

Trong các phiên bản trước của Laravel, Đa ngôn ngữ được thực hiện bằng các chuyển đổi các key thành các giá trị dựa trên locale hiện tại của ứng dụng. Điều này được thực hiện với cú pháp như sau: trans('catalogue.products.save') Đầu tiên Laravel sẽ tìm kiếm file catalogue trong thư mục ...

Trong các phiên bản trước của Laravel, Đa ngôn ngữ được thực hiện bằng các chuyển đổi các key thành các giá trị dựa trên locale hiện tại của ứng dụng. Điều này được thực hiện với cú pháp như sau:

trans('catalogue.products.save')

Đầu tiên Laravel sẽ tìm kiếm file catalogue trong thư mục resources/lang/en. Tiếp đó nó sẽ tìm kiếm key save dựa trên cấu trúc như sau:

[
    // ...
    "products" => [
        "save" => "Save Product"
    ]
    // ...
]

Điều này tốt khi bạn muốn dịch một chuỗi ngắn, đơn giản. Nhưng nó thật sự khó chịu khi bạn thực sự muốn dịch một đoạn văn bản hoặc một câu dài.

trans('catalogue.error_product_must_have_atleast_one_size')

Bạn có thể khác phục điều này bằng cách sử dụng các key ngắn và xúc tích để chỉ nội dung của đoạn văn bản. Nhưng đôi khi thì để đặt một cái key như vậy rất khó khăn vì bạn không muốn thay đổi key đó trong tương lai và cũng muốn biết rằng nó là gì nếu không đặt trong ngữ cảnh của nó.

Vậy có gì mới trong 5.4

Đối với các ứng dụng có yêu cầu dịch nặng, xác định mỗi chuỗi với một "phím tắt" có thể trở thành một cách nhanh chóng gây nhầm lẫn khi tham khảo chúng trong quan điểm của bạn. Vì lý do này, Laravel cũng cung cấp hỗ trợ cho việc xác định các chuỗi dịch bằng cách sử dụng "mặc định" bản dịch của các chuỗi như là key. Trong phiên bản 5.4 để thực hiện đa ngôn ngữ bạn sẽ có thêm lựa chọn như sau:

__("I love programming.")

Và chỉ cần định nghĩa trong file resources/lang/es.json như sau:

{
    "I love programming.": "Me encanta la programación."
}

Tất nhiên là bạn vẫn có thể sử dụng short key như các phiên bản trước: Sử dụng:

 __('messages.welcome');

Định nghĩa key:

<?php

// resources/lang/en/messages.php

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

Trong trường hợp bạn muốn truyền paramater vào đa ngôn ngữ thì thực hiện thế nào? Định nghĩa key:

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

Sử dụng:

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

Có 1 điều rất thú vị ở đây là nếu place-holder của bạn được viết hoa chữ cái đầu hoặc toàn bộ thì từ được dịch cũng hiển thị tương ứng.

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

Ngữ pháp số nhiều Đây thật sự là một vấn đề khó trong nhiều ngôn ngữ khác nhau, ví dụ trong tiếng anh ta có:

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

Khi đó ta sẽ định nghĩ một translation phức tạp hơn:

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

Để sử dụng thì ta dùng method tran_choice

echo trans_choice('messages.apples', 10); // There are many

Tổng kết và tài liệu tham khảo.

Laravel 5.4 mang đến cho ta nhiều lựa chọn hơn trong việc thực thi đa ngôn ngữ của ứng dụng. Nó có thể không quá tuyệt đối với nhiều người nhưng tôi thấy nó khá là thú vị.

0