Mặc dù Laravel rất phù hợp với nhiều loại ứng dụng, nhưng nó là một framework có mục đích chung. Điều này có nghĩa là chúng ta có thể cần xây dựng các lớp của riêng mình trên Laravel để phù hợp nhất với các ứng dụng web tùy chỉnh của chúng ta. Đối với quốc tế hóa [i18n], nó cung cấp một số trợ giúp ngay lập tức. Tuy nhiên, chúng tôi muốn cung cấp cho bạn một số mẹo và thủ thuật Laravel i18n bổ sung
Laravel PHP framework không cần giới thiệu. Nó đã vươn lên dẫn đầu trong gói PHP MVC và vì lý do chính đáng. Laravel là một trong những framework được thiết kế tốt nhất hiện có. Nó đơn giản, nhiều lớp và được ghi chép đầy đủ. Laravel chỉ là một niềm vui để sử dụng
Tôi giả định rằng bạn đã biết kiến thức cơ bản về Laravel và đã đọc tài liệu về bản địa hóa của nó. Do đó, chúng tôi có thể chuyển sang một số thông tin chi tiết sẽ giúp ích cho bạn với ứng dụng Laravel được bản địa hóa của bạn
Tại thời điểm viết bài, tôi đang sử dụng PHP 7. 3, ấu trùng 5. 7 và Mysql 5. 7
Đặt đất. Thư viện ngôn ngữ đơn giản
Laravel cung cấp cho chúng ta một số cấu hình ngôn ngữ trong
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }3 và các phương thức
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }4 và
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }5 của nó. Những điều này tốt cho các ứng dụng đơn giản, nhưng khi ứng dụng của chúng tôi phát triển qua một vài trang, chúng tôi có thể thấy mình lặp lại mã nếu chúng tôi không đưa một số kiến trúc quốc tế hóa cơ bản vào vị trí
Mở rộng cấu hình ngôn ngữ cơ bản
Ngay lập tức, Laravel nhận biết ngôn ngữ, cung cấp cho chúng tôi các tùy chọn cấu hình
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }6 và
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }7. Chúng tôi có thể thêm tùy chọn
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }8 để cung cấp cho chúng tôi một nguồn thông tin chính xác duy nhất cho ngôn ngữ mà ứng dụng của chúng tôi xử lý
Của chúng ta
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }3 khi đó sẽ trông như thế này [đoạn trích]
'locale' => 'en', 'fallback_locale' => 'en', /* |-------------------------------------------------------------------------- | Supported Application Locales |-------------------------------------------------------------------------- | | Our supported locales will have available frontend and model | translations. | */ 'supported_locales' => [ 'en' => [ 'name' => 'English', 'dir' => 'ltr', ], 'ar' => [ 'name' => 'Arabic', 'dir' => 'rtl' ], ],
Thiết lập này sẽ ghép nối với một lớp
php artisan make:provider LocaleServiceProvider
0 mà chúng tôi sẽ tạo và chứa mọi thứ chúng tôi cần để hiển thị một ngôn ngữ trên giao diện người dùng. Mã ngôn ngữ của nó, tên của nó trong ngôn ngữ mặc định và hướng của nó để giải thích cho các ngôn ngữ từ phải sang tráiTạo một lớp bản địa
Bây giờ chúng ta có thể viết API bản địa hóa hấp dẫn, mạnh mẽ hơn bằng cách sử dụng cấu hình này. Một lớp học
php artisan make:provider LocaleServiceProvider
0 cơ bản có thể giúp chúng ta bắt đầuTrong
php artisan make:provider LocaleServiceProvider
2if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }1
Lớp
php artisan make:provider LocaleServiceProvider
0 của chúng tôi sử dụng một phiên bản của ứng dụng Laravel cơ bản để hiển thị một thư viện các phương thức trợ giúp giúp làm việc với các ngôn ngữ dễ dàng hơn nhiều. Nó cũng có thể giữ cho mã của chúng tôi đẹp và KHÔ [Không lặp lại chính mình] bằng cách trở thành API truy cập của chúng tôi để xử lý các ngôn ngữNhận một bản sao của lớp Locale dưới dạng Gist
Sử dụng nhà cung cấp dịch vụ để tái sử dụng và rõ ràng
Hiện tại, chúng tôi phải khởi tạo một phiên bản mới của lớp
php artisan make:provider LocaleServiceProvider
0 và thêm phiên bản ứng dụng của chúng tôi mỗi khi chúng tôi cần một trong các phương thức của nóif [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }
Đây có thể là một vấn đề khó khăn và chúng ta có thể giảm bớt khó khăn này một chút bằng cách sử dụng Larvel Nhà cung cấp dịch vụ. Đây chỉ là một cách để đăng ký chức năng với Laravel để tái sử dụng và đảo ngược quyền kiểm soát [IoC]. Họ có thể làm cho mã của chúng tôi dễ kiểm tra hơn và dễ suy luận hơn
Để tạo trình cung cấp, chúng ta có thể sử dụng công cụ dòng lệnh Artisan tích hợp sẵn
________số 8Điều này sẽ tạo ra lớp soạn sẵn tại
php artisan make:provider LocaleServiceProvider
5Chúng ta có thể cập nhật phương thức
php artisan make:provider LocaleServiceProvider
6 của lớp này để liên kết lớp php artisan make:provider LocaleServiceProvider
0 của chúng ta trong vùng chứa IoC của Laravelphp artisan make:provider LocaleServiceProvider
5if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }0
Nhận một bản sao của lớp LocaleServiceProvider dưới dạng Gist
Chúng tôi liên kết một singleton với tên lớp của chúng tôi để chúng tôi không xây dựng một thể hiện nhiều lần trong một yêu cầu. Chúng tôi cũng tạo một nguồn sự thật duy nhất để xây dựng lớp bằng cách cung cấp phiên bản ứng dụng của chúng tôi ở một nơi
Bây giờ chúng tôi có thể đăng ký nhà cung cấp dịch vụ mới của chúng tôi
Trong
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }3 [đoạn trích]
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }2
Giờ đây, Laravel sẽ liên kết singleton của chúng ta với tên của lớp trong mọi yêu cầu. Chúng ta có thể sử dụng liên kết này để truy cập lớp học của mình
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }3
Sử dụng Hàm trợ giúp toàn cầu hoặc Mặt tiền cho Mã sạch
Mặc dù điều này tốt hơn so với việc viết_______200, nhưng việc gọi bộ chứa IoC theo cách thủ công mỗi khi chúng tôi muốn làm việc với thư viện ngôn ngữ của mình là điều không lý tưởng. Chúng ta có thể làm cho cuộc sống của mình dễ dàng hơn bằng cách viết một hàm trợ giúp toàn cầu
Đầu tiên, chúng tôi tạo
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }01. Trong đó, chúng ta có thể đặt chức năng đơn giản này
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }6
Tiếp theo, chúng tôi đăng ký tệp của mình để được tự động tải bằng cách cập nhật cấu hình Trình soạn thảo của chúng tôi
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }02 [đoạn trích]
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }8
Thực sự chỉ nên có một số chức năng toàn cầu trong ứng dụng của chúng tôi, nếu không, chúng tôi có nguy cơ làm ô nhiễm không gian tên toàn cầu và va chạm với khung hoặc mã của bên thứ ba
Sau đó, chúng tôi có thể chạy
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }03 từ dòng lệnh để cung cấp chức năng mới cho mã của chúng tôi
Và kìa
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }0
Sạch sẽ hơn nhiều, phải không? . Điều này có lợi thế là không gây ô nhiễm không gian tên toàn cầu. Tuy nhiên, việc lựa chọn sử dụng chức năng toàn cầu hoặc mặt tiền chủ yếu là vấn đề sở thích cá nhân
Để sử dụng mặt tiền, chúng tôi viết một tệp nhỏ tại
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }04
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }10
Bây giờ chúng ta có thể sử dụng thư viện của mình thông qua các cuộc gọi phương thức tĩnh
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }11
Để tránh xung đột với lớp
0 được tích hợp sẵn trong PHP, chúng ta có thể đặt tên cho lớp làphp artisan make:provider LocaleServiceProvider
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }06
Lộ trình
Với thư viện gọn gàng của chúng tôi, chúng tôi có thể đi sâu vào công việc quốc tế hóa của mình. Ứng dụng của chúng tôi cần một cách để xác định ngôn ngữ của người dùng hiện tại. Chúng tôi có thể thực hiện việc này thông qua các tiêu đề đã nhận, địa chỉ IP của người dùng hoặc URI hiện được yêu cầu
Xác định ngôn ngữ từ URI
Chúng tôi sẽ tập trung vào phương pháp URI ở đây vì nó khá phổ biến và đơn giản nhất để thực hiện
Giả sử chúng ta có một ứng dụng cửa hàng âm nhạc và chúng ta có các tuyến đường như
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }07 mà chúng ta muốn quốc tế hóa, thì chúng ta có thể thiết lập ngôn ngữ làm thông số trong các tuyến đường của mình
Trong
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }08 [đoạn trích]
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }12
Bạn có thể nhận thấy rằng chúng tôi đang lặp lại khá nhiều ở đây và điều này có nghĩa là bộ điều khiển của chúng tôi sẽ phải xử lý cài đặt ngôn ngữ của chúng tôi. Một
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }09 nên giao dịch với các nghệ sĩ, không phải địa phương
Sử dụng tiền tố định tuyến và nhóm để giữ mọi thứ KHÔ
Chúng ta có thể sử dụng các nhóm tuyến đường để loại bỏ sự lặp lại này
Trong
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }08 [đoạn trích]
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }13
Điều đó có vẻ tốt hơn rất nhiều, phải không?
Lưu ý » Một số trình duyệt sẽ tích cực chuyển hướng 301 vào bộ đệm giống như chuyển hướng chúng tôi đã xác định ở trên. Vì vậy, nếu một khách truy cập đến tuyến đường gốc
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }22 và URI của cô ấy chuyển thànhif [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }23, thì cô ấy có thể tiếp tục đếnif [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }23 ngay cả sau khi chúng tôi đã cập nhật ngôn ngữ hiện tại của mình trongif [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }3. Một cách để giải quyết vấn đề này là luôn bao gồm chuyển đổi ngôn ngữ thủ công cho khách truy cập trang web
Hãy cẩn thận với thứ tự tham số tuyến đường
Tiếp tục ví dụ trên, nếu bạn viết phương thức
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }26 như thế này
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }14
bạn sẽ thấy rằng giá trị ngôn ngữ nằm trong tham số
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }27. Chúng ta có thể viết lại phương thức này để giải quyết vấn đề này
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }15
Sử dụng Middleware để phân tách mối quan tâm và hành vi tài liệu
Để thực sự đặt ngôn ngữ, chúng tôi cần thông báo cho ứng dụng của mình về mã ngôn ngữ mà chúng tôi tìm thấy trong URI. Cách đơn giản nhất để thực hiện việc này là sử dụng phần mềm trung gian
Chúng ta có thể tạo một lớp phần mềm trung gian mới bằng Artisan trên dòng lệnh
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }16
Thao tác này sẽ tạo một bản soạn sẵn tại
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }28. Chúng tôi có thể cập nhật phương thức
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }29 của phần mềm trung gian mới để đặt ngôn ngữ
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }17
Chúng tôi chỉ lấy
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }30 từ
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }31, kiểm tra xem chúng tôi có hỗ trợ hay không và dự phòng cho một ngôn ngữ đã định cấu hình nếu chúng tôi không hỗ trợ. Trong mọi trường hợp, khi phần mềm trung gian này xử lý yêu cầu, ngôn ngữ của chúng tôi sẽ được đặt. Tuy nhiên, trước tiên, chúng ta cần đăng ký nó với Laravel
Trong
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }32 [đoạn trích]
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }18
Chúng tôi đặt phần mềm trung gian của mình chạy ngay sau khi chúng tôi kiểm tra chế độ bảo trì. Tất nhiên, nếu trang chế độ bảo trì của bạn cần được bản địa hóa, bạn có thể di chuyển
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }33 phần mềm trung gian lên trên ngăn xếp
Giờ đây, ngôn ngữ của chúng tôi sẽ được đặt theo từng yêu cầu của ứng dụng và chúng tôi có thể truy xuất ngôn ngữ đó bằng cách sử dụng
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }34. Hơn nữa, tồn tại một tệp và lớp chuyên dụng để ghi lại hành vi này để các nhà phát triển trong tương lai [bao gồm cả chúng tôi] có thể dễ dàng suy luận về cách ứng dụng của chúng tôi xác định địa phương của nó. Điều này tốt hơn là chôn mã đó trong tệp định tuyến
Giao diện người dùng
Laravel chứng minh khả năng bản địa hóa giao diện người dùng của nó khá tốt. Và với thư viện ngôn ngữ nhỏ của chúng tôi, chế độ xem Blade của chúng tôi có thể trông sạch sẽ
Một chung
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }35 [đoạn trích]
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }19
Thẻ ở trên sẽ luôn có ngôn ngữ và hướng được hỗ trợ ['ltr' hoặc 'rtl']. Cái sau rất quan trọng đối với các ngôn ngữ viết từ phải sang trái như tiếng Ả Rập và tiếng Do Thái vì toàn bộ bố cục trang sẽ thay đổi đối với những ngôn ngữ đó.
Sử dụng chuỗi dịch làm khóa cho mã giao diện người dùng tự nhiên
Các tệp dịch mặc định mà Laravel sử dụng có thể làm cho chế độ xem ứng dụng của chúng tôi và quy trình quốc tế hóa/địa phương hóa của chúng tôi trở nên khá rắc rối
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }36 [đoạn trích]
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }0
Thay vào đó, chúng tôi có thể sử dụng các tệp dịch
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }37 JSON để làm cho chế độ xem của chúng tôi trông tự nhiên hơn nhiều
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }38 [đoạn trích]
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }1
Mặc dù phương pháp này có thể hơi dài dòng, nhưng nó làm cho quan điểm của chúng ta dễ đọc hơn nhiều. Nó cũng giúp chúng tôi không phải viết bản dịch cho ngôn ngữ mặc định của chúng tôi. Trong ví dụ trên, chúng tôi sẽ không có tệp
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }39. Nếu ứng dụng của chúng tôi chỉ hỗ trợ tiếng Ả Rập và tiếng Anh, chúng tôi chỉ có thể có một tệp dịch
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }60 [đoạn trích]
if [[new App\Locale[app[]]->isSupported['es']] { // Spanish is supported }2
Bạn có thể trộn và khớp các tệp dịch PHP và JSON dựa trên mảng
Kết thúc
Viết mã để bản địa hóa ứng dụng của bạn là một nhiệm vụ, nhưng làm việc với bản dịch lại là một câu chuyện hoàn toàn khác. Nhiều bản dịch cho nhiều ngôn ngữ có thể nhanh chóng khiến bạn choáng ngợp, dẫn đến sự nhầm lẫn của người dùng. May mắn thay, Phrase có thể giúp cuộc sống của bạn với tư cách là nhà phát triển dễ dàng hơn. Vui lòng tìm hiểu thêm về Cụm từ, tham khảo Bộ bản địa hóa cụm từ
Tôi hy vọng những lời khuyên này đã giúp bạn trong hành trình của mình với Laravel i18n. Đây là một chủ đề lớn và chúng ta có thể đi sâu vào việc bản địa hóa các lớp khác của ứng dụng Laravel, chẳng hạn như lớp mô hình và lớp dữ liệu. Tôi hy vọng chúng ta có thể làm điều đó trong một bài báo sắp tới. Giữ nguyên. . ]