Thực tiễn tốt nhất để nội địa hóa và toàn cầu hóa chuỗi và nhãn [đã đóng]


124

Tôi là thành viên của một nhóm với hơn 20 nhà phát triển. Mỗi nhà phát triển làm việc trên một mô-đun riêng biệt (khoảng 10 mô-đun). Trong mỗi mô-đun, chúng tôi có thể có ít nhất 50 biểu mẫu CRUD, có nghĩa là chúng tôi hiện có gần 500 nút thêm , lưu nút , chỉnh sửa nút , v.v.

Tuy nhiên, vì chúng tôi muốn toàn cầu hóa ứng dụng của mình, chúng tôi cần có khả năng dịch các văn bản trong ứng dụng của mình. Ví dụ, ở mọi nơi, từ add nên trở thành ajouter cho người dùng Pháp.

Những gì chúng tôi đã làm cho đến bây giờ, là đối với mỗi chế độ xem trong Giao diện người dùng hoặc Lớp trình bày, chúng tôi có một từ điển các cặp bản dịch / khóa. Sau đó, trong khi hiển thị chế độ xem, chúng tôi dịch các văn bản và chuỗi yêu cầu bằng từ điển này. Tuy nhiên, cách tiếp cận này, chúng tôi đã có một cái gì đó gần 500 thêm vào 500 từ điển. Điều này có nghĩa là chúng tôi đã vi phạm hiệu trưởng DRY.

Mặt khác, nếu chúng ta tập trung các chuỗi chung, như đặt add ở một nơi và yêu cầu các nhà phát triển sử dụng nó ở mọi nơi, chúng ta sẽ gặp phải vấn đề không chắc chắn liệu một chuỗi đã được xác định trong từ điển tập trung hay chưa.

Một tùy chọn khác có thể là không có từ điển dịch thuật và sử dụng các dịch vụ dịch thuật trực tuyến như Google Dịch, Bing Translator, v.v.

Một vấn đề khác mà chúng tôi gặp phải là một số nhà phát triển chịu áp lực cung cấp dự án đúng thời gian không thể nhớ các khóa dịch . Ví dụ: đối với văn bản của nút thêm, nhà phát triển đã sử dụng add trong khi nhà phát triển khác đã sử dụng mới , v.v.

Cách thực hành tốt nhất hoặc phương pháp nổi tiếng nhất để toàn cầu hóa và nội địa hóa tài nguyên chuỗi của một ứng dụng là gì?


2
Cuộc nói chuyện của Alex Sexton về chủ đề Quốc tế hóa phía khách hàng từ hội nghị JS EU là một khởi đầu tốt.
Minko Gechev

Câu trả lời:


51

Theo như tôi biết, có một thư viện tốt được gọi là Bản localeplanetđịa hóa và Quốc tế hóa trong JavaScript. Hơn nữa, tôi nghĩ nó là bản địa và không phụ thuộc vào các thư viện khác (ví dụ: jQuery)

Đây là trang web của thư viện: http://www.localeplanet.com/

Cũng xem bài viết này của Mozilla, bạn có thể tìm thấy phương pháp và thuật toán rất tốt cho dịch thuật phía máy khách: http://blog.mozilla.org/webdev/2011/10/06/i18njs-i Intlize-your-javascript-with-with một chút giúp đỡ từ json-và-the-server /

Phần chung của tất cả các bài viết / thư viện đó là chúng sử dụng một i18nlớp và mộtget phương thức (theo một số cách cũng xác định một tên hàm nhỏ hơn như _) để lấy / chuyển đổi keythành value. Trong phần giải thích của tôi keycó nghĩa là chuỗi bạn muốn dịch và valuechuỗi dịch nghĩa là.
Sau đó, bạn chỉ cần một tài liệu JSON để lưu trữ keyvalue.

Ví dụ:

var _ = document.webL10n.get;
alert(_('test'));

Và đây là JSON:

{ test: "blah blah" }

Tôi tin rằng sử dụng các giải pháp thư viện phổ biến hiện nay là một cách tiếp cận tốt.


1
Không xúc phạm nhưng đây không phải là những gì Afshin đã thử? Vấn đề của anh ấy là các nhà phát triển khác nhau gặp khó khăn trong việc ghi nhớ sử dụng khóa nào. Tôi đồng ý với phương pháp được mô tả của bạn là cách để đi. Tôi không thấy làm thế nào nó có thể khác. Cảm ơn các liên kết tuyệt vời btw.
Spock

47

Khi bạn phải đối mặt với một vấn đề cần giải quyết (và thật lòng mà nói, ai không phải là những ngày này?), Chiến lược cơ bản thường được người máy tính của chúng ta thực hiện được gọi là chia rẽ và chinh phục. Nó như thế này:

  • Khái niệm hóa vấn đề cụ thể như một tập hợp các vấn đề phụ nhỏ hơn.
  • Giải quyết từng vấn đề nhỏ hơn.
  • Kết hợp các kết quả thành một giải pháp của vấn đề cụ thể.

Nhưng chia rẽ và chinh phục thành phố không phải là chiến lược duy nhất có thể. Chúng ta cũng có thể có một cách tiếp cận tổng quát hơn:

  • Khái niệm hóa vấn đề cụ thể như một trường hợp đặc biệt của một vấn đề tổng quát hơn.
  • Bằng cách nào đó giải quyết vấn đề chung.
  • Thích ứng giải pháp của vấn đề chung với vấn đề cụ thể.

- Eric Lippert

Tôi tin rằng nhiều giải pháp đã tồn tại cho vấn đề này bằng các ngôn ngữ phía máy chủ như ASP.Net/C#.

Tôi đã phác thảo một số khía cạnh chính của vấn đề

  • Vấn đề : Chúng tôi chỉ cần tải dữ liệu cho ngôn ngữ mong muốn

    Giải pháp : Với mục đích này, chúng tôi lưu dữ liệu vào một tệp riêng cho từng ngôn ngữ

Ví dụ. res.de.js, res.fr.js, res.en.js, res.js (đối với ngôn ngữ mặc định)

  • Vấn đề: Các tệp tài nguyên cho mỗi trang phải được tách riêng để chúng tôi chỉ nhận được dữ liệu chúng tôi cần

    Giải pháp : Chúng tôi có thể sử dụng một số công cụ đã tồn tại như https://github.com/rgrove/lazyload

  • Vấn đề: Chúng tôi cần một cấu trúc cặp khóa / giá trị để lưu dữ liệu của chúng tôi

    Giải pháp : Tôi đề xuất một đối tượng javascript thay vì chuỗi / chuỗi không khí. Chúng ta có thể hưởng lợi từ intellisense từ IDE

  • Vấn đề: Các thành viên chung nên được lưu trữ trong một tệp công khai và tất cả các trang sẽ truy cập chúng

    Giải pháp : Với mục đích này, tôi tạo một thư mục trong thư mục gốc của ứng dụng web có tên Global_Resource và một thư mục để lưu trữ tệp toàn cầu cho mỗi thư mục con mà chúng tôi đặt tên là 'Local_Resource'

  • Vấn đề: Mỗi thành viên hệ thống con / thư mục con / mô-đun nên ghi đè các thành viên Global_Resource trên phạm vi của chúng

    Giải pháp : Tôi đã xem xét một tệp cho mỗi

Cấu trúc ứng dụng

root/
    Global_Resources/
        default.js
        default.fr.js
    UserManagementSystem/
        Local_Resources/
            default.js
            default.fr.js
            createUser.js
        Login.htm
        CreateUser.htm

Mã tương ứng cho các tệp:

Global_Resource / default.js

var res = {
    Create : "Create",
    Update : "Save Changes",
    Delete : "Delete"
};

Global_Resource / default.fr.js

var res = {
    Create : "créer",
    Update : "Enregistrer les modifications",
    Delete : "effacer"
};

Tệp tài nguyên cho ngôn ngữ mong muốn sẽ được tải trên trang được chọn từ Global_Resource - Đây phải là tệp đầu tiên được tải trên tất cả các trang.

Người dùng quản lý hệ thống / Local_Resource / default.js

res.Name = "Name";
res.UserName = "UserName";
res.Password = "Password";

Người dùng quản lý hệ thống / Local_Resource / default.fr.js

res.Name = "nom";
res.UserName = "Nom d'utilisateur";
res.Password = "Mot de passe";

Người dùng quản lý hệ thống / Local_Resource / createdUser.js

// Override res.Create on Global_Resources/default.js
res.Create = "Create User"; 

Người dùng quản lý hệ thống / Local_Resource / createdUser.fr.js

// Override Global_Resources/default.fr.js
res.Create = "Créer un utilisateur";

tệp manager.js ( tệp này sẽ được tải sau cùng)

res.lang = "fr";

var globalResourcePath = "Global_Resources";
var resourceFiles = [];

var currentFile = globalResourcePath + "\\default" + res.lang + ".js" ;

if(!IsFileExist(currentFile))
    currentFile = globalResourcePath + "\\default.js" ;
if(!IsFileExist(currentFile)) throw new Exception("File Not Found");

resourceFiles.push(currentFile);

// Push parent folder on folder into folder
foreach(var folder in parent folder of current page)
{
    currentFile = folder + "\\Local_Resource\\default." + res.lang + ".js";

    if(!IsExist(currentFile))
        currentFile = folder + "\\Local_Resource\\default.js";
    if(!IsExist(currentFile)) throw new Exception("File Not Found");

    resourceFiles.push(currentFile);
}

for(int i = 0; i < resourceFiles.length; i++) { Load.js(resourceFiles[i]); }

// Get current page name
var pageNameWithoutExtension = "SomePage";

currentFile = currentPageFolderPath + pageNameWithoutExtension + res.lang + ".js" ;

if(!IsExist(currentFile))
    currentFile = currentPageFolderPath + pageNameWithoutExtension + ".js" ;
if(!IsExist(currentFile)) throw new Exception("File Not Found");

Hy vọng nó giúp :)


7
Điều duy nhất tôi không thích về cách tiếp cận này là nội địa hóa và phát triển được kết hợp chặt chẽ ... Vì vậy, khi một chuỗi tiếng Anh (dù là mặc định) được thêm vào, các ngôn ngữ còn lại phải được cập nhật thông qua mã. Tôi muốn tạo JSON bằng một công cụ từ một số loại tệp dịch. Vẫn là một đại diện tốt!
Nate-Wilkins

đã thực hiện tương tự như bạn đã làm để bản địa hóa, bạn có thể thấy điều đó trong truy vấn này: stackoverflow.com/q/53864279/4061006 . Điều duy nhất là cách bạn dịch Global_Resource / default.js sang Global_Resource / default.fr.js? Bạn đang sử dụng công cụ / bộ công cụ nào để chuyển đổi các tệp đó sang ngôn ngữ mong muốn. Vì tôi cũng cần điều này
Jayavel 26/12/18

Bạn nên lưu trữ một nhận xét có thể đọc được của con người bên cạnh mỗi khóa mô tả chuỗi đó đi đâu và ý nghĩa của nó, để bạn có thể cung cấp thêm ngữ cảnh cho người dịch (hoặc chính bạn) khi bạn thêm ngôn ngữ mới và bạn đã quên một số ngôn ngữ của chuỗi có nghĩa. Làm một cái gì đó giống "Create" : {"message": "Create", "description": "text on the button that opens the editor with a blank Foo"}như họ làm để bản địa hóa các tiện ích mở rộng Chrome chẳng hạn. Hoặc tạo một tập tin riêng giữ những bình luận này.
Boris

13

jQuery.i18n là một plugin jQuery nhẹ để cho phép quốc tế hóa trong các trang web của bạn. Nó cho phép bạn đóng gói các chuỗi tài nguyên tùy chỉnh trong các tệp '.properations', giống như trong Gói tài nguyên Java. Nó tải và phân tích các gói tài nguyên (.properations) dựa trên ngôn ngữ được cung cấp hoặc ngôn ngữ được báo cáo bởi trình duyệt.

để biết thêm về điều này, hãy xem Cách quốc tế hóa các trang của bạn bằng JQuery?


Liên kết đã biến mất
Alexander Farber
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.