Chiến lược hiệu quả để bản địa hóa trong .NET [đã đóng]


121

Tôi đang phát triển giao diện người dùng cho ứng dụng .NET MVC sẽ yêu cầu bản địa hóa quốc tế tất cả nội dung trong tương lai gần. Tôi rất quen thuộc với .NET nói chung nhưng chưa bao giờ có một dự án đòi hỏi sự tập trung đáng kể như vậy vào khả năng tiếp cận quốc tế.

Dự kiến ​​ban đầu được thực hiện bằng tiếng Anh. Tôi nên thực hiện những biện pháp nào vào thời điểm này để dễ dàng thực hiện nội địa hóa trong tương lai?


2
Câu hỏi tuyệt vời! Tôi đang đối mặt với một tình huống tương tự và rất thích thấy các chuyên gia cân nhắc về vấn đề này.

Bất cứ ai cũng có bất kỳ tiêu chuẩn tốt cho quản lý tài nguyên? Giá trị cục bộ cũng có thể bao gồm hình ảnh, và không chỉ chuỗi.

1
Đây có phải là giao diện người dùng WPF / silverlight hay Winforms không? Từ kinh nghiệm (có giới hạn) của tôi, trải nghiệm WinForms để bản địa hóa đơn giản hơn nhiều so với WPF / Silverlight.
Pete Stensønes

1
Nếu bạn kết thúc việc lưu trữ các chuỗi cục bộ của mình trong cơ sở dữ liệu, thay vì các tệp tài nguyên, bạn có thể muốn xem cuộc thảo luận này: stackoverflow.com/questions/2458615/

1
@Pete, @smartcaveman cho biết anh ta "đang phát triển giao diện người dùng cho ứng dụng .NET MVC", vì vậy ...
BrunoSalvino

Câu trả lời:


74

Bạn đang phát triển ứng dụng ASP.Net MVC phải không? Các câu trả lời khác dường như là cụ thể cho các ứng dụng máy tính để bàn. Hãy để tôi nắm bắt những điều phổ biến:

Phát hiện địa phương

Điều khá quan trọng là ứng dụng của bạn phát hiện ngôn ngữ của người dùng một cách chính xác. Trong ứng dụng máy tính để bàn, CultureInfo. . Đối với các ứng dụng web, bạn nên đặt cả hai nền văn hóa thành tự động (để tự động phát hiện ngôn ngữ từ tiêu đề AcceptL Language) trừ khi bạn muốn thực hiện một số quy trình phát hiện ngôn ngữ địa phương ưa thích (nghĩa là muốn hỗ trợ thay đổi ngôn ngữ theo yêu cầu).

Chuỗi bên ngoài

Tất cả các chuỗi phải đến từ tài nguyên, đó là các tệp Resx. Trong Ứng dụng Winforms có thể dễ dàng đạt được bằng cách đặt biểu mẫu Thuộc tính bản địa hóa thành đúng. Bạn cũng sẽ cần phải thủ công (không may) các chuỗi bên ngoài xuất phát từ các mô hình của mình. Nó cũng tương đối đơn giản. Trong Asp.Net, bạn sẽ cần phải thực hiện mọi thứ bằng tay ...

Bố cục

Bạn chắc chắn cần phải cho phép mở rộng chuỗi. Trong thế giới Winforms có thể đạt được thông qua TableLayoutPanel, nên được sử dụng để đảm bảo rằng bố cục sẽ tự động điều chỉnh để phù hợp với văn bản dài hơn. Trong thế giới web, bạn có một chút may mắn. Bạn có thể cần triển khai Cơ chế bản địa hóa CSS - một cách để sửa đổi (ghi đè) các định nghĩa CSS. Điều này sẽ cho phép người bản địa hóa sửa đổi các vấn đề về phong cách theo yêu cầu. Đảm bảo rằng mỗi phần tử HTML trong trang được hiển thị có id duy nhất - nó sẽ cho phép nhắm mục tiêu chính xác.

Vấn đề văn hóa cụ thể

Tránh sử dụng đồ họa, màu sắc và âm thanh có thể dành riêng cho văn hóa phương Tây. Nếu bạn thực sự cần nó, vui lòng cung cấp phương tiện Bản địa hóa. Tránh đồ họa nhạy cảm với hướng (vì đây sẽ là một vấn đề khi bạn cố gắng bản địa hóa để nói tiếng Ả Rập hoặc tiếng Do Thái). Ngoài ra, đừng cho rằng cả thế giới đang sử dụng cùng một số (nghĩa là không đúng với tiếng Ả Rập).

ToString () và Parse ()

Hãy chắc chắn luôn vượt qua CultureInfo khi gọi ToString () trừ khi nó không được hỗ trợ. Bằng cách đó bạn đang bình luận ý định của bạn. Ví dụ: nếu bạn đang sử dụng một số số trong nội bộ và vì một số lý do cần phải chuyển đổi nó thành chuỗi sử dụng:

int i = 42;
var s = i.ToString(CultureInfo.InvariantCulture);

Đối với các số sẽ được hiển thị cho người dùng sử dụng:

var s = i.ToString(CultureInfo.CurrentCulture); // formatting culture used

Điều tương tự cũng áp dụng cho Parse (), TryPude () và thậm chí là ParseExact () - một số lỗi khó chịu có thể được đưa vào mà không sử dụng đúng cách CultureInfo. Đó là bởi vì một số linh hồn nghèo nàn trong Microsoft, với đầy đủ ý định tốt đã quyết định rằng nên coi CultureInfo.CiverseCARM là mặc định (nó sẽ được sử dụng nếu bạn không vượt qua bất cứ điều gì) - sau tất cả khi ai đó đang sử dụng ToString ( ) anh ấy / cô ấy muốn hiển thị nó cho người dùng, phải không? Hóa ra không phải lúc nào cũng vậy - ví dụ: cố gắng lưu trữ số phiên bản ứng dụng của bạn trong cơ sở dữ liệu và sau đó chuyển đổi nó thành thể hiện của lớp Phiên bản. Chúc may mắn.

Ngày và múi giờ

Đảm bảo luôn lưu trữ và khởi tạo DateTime trong UTC (sử dụng DateTime.UtcNow thay vì DateTime.Now). Chuyển đổi nó thành giờ địa phương ở định dạng cục bộ khi hiển thị:

DateTime now = DateTime.UtcNow;
var s = now.ToLocalTime().ToString(CultureInfo.CurrentCulture);

Nếu bạn cần gửi email có tham chiếu thời gian trong cơ thể, hãy chắc chắn bao gồm thông tin múi giờ - bao gồm cả bù UTC và danh sách các thành phố:

DateTime someDate; // i.e. from database
var formattedDate = String.Format("{0} {1}", 
             someDate.ToLocaleTime().ToString(CultureInfo.CurrentCulture),
             TimeZoneInfo.Local.DisplayName);

Tin nhắn tổng hợp

Bạn đã được cảnh báo không nối chuỗi. Thay vào đó, bạn có thể sẽ sử dụng String.Format () như được hiển thị ở trên. Tuy nhiên, tôi phải nói rõ rằng bạn nên giảm thiểu việc sử dụng tin nhắn ghép. Đó chỉ là do các quy tắc ngữ pháp đích khá khác nhau, do đó người dịch không chỉ cần phải sắp xếp lại câu (điều này sẽ được giải quyết bằng cách sử dụng trình giữ chỗ và String.Format ()), nhưng dịch toàn bộ câu theo cách khác nhau dựa trên những gì sẽ được thay thế. Để tôi cho bạn vài ví dụ:

// Multiple plural forms
English: 4 viruses found.
Polish: Znaleziono 4 wirusy. **OR** Znaleziono 5 wirusów.

// Conjugation
English: Program encountered incorrect character | Application encountered incorrect character.
Polish: Program napotkał nieznaną literę | Aplikacja napotkała nieznaną literę.

Các vấn đề nối khác

Ghép không bị giới hạn trong chuỗi. Tránh đặt ra các điều khiển cùng nhau, nói:

Nhắc tôi một lần nữa trong [hộp văn bản có số] ngày.

Điều này nên được thiết kế lại thành một cái gì đó như: Nhắc tôi một lần nữa trong số ngày này: [hộp văn bản].

Mã hóa ký tự và phông chữ

Luôn lưu, chuyển, bất kỳ văn bản nào trong Unicode (tức là trong UTF-8). Không sử dụng phông chữ mã cứng - Bản địa hóa có thể cần sửa đổi chúng và nó sẽ tắt cơ chế dự phòng phông chữ mặc định (trong trường hợp Winforms). Hãy nhớ cho phép các ký tự "lạ" trong hầu hết các trường (ví dụ: tên người dùng).

Kiểm tra

Bạn có thể sẽ cần phải thực hiện cái gọi là dịch giả, nghĩa là tạo tài nguyên để nói văn hóa Đức và sao chép chuỗi tiếng Anh của bạn thêm tiền tố và hậu tố. Bạn cũng có thể bọc giữ chỗ để dễ dàng phát hiện các chuỗi ghép. Mục đích của dịch giả là để phát hiện các vấn đề địa phương hóa như chuỗi mã hóa cứng, vấn đề bố cục và sử dụng quá mức các thông điệp ghép.


5
Về Tin nhắn tổng hợp - Tôi đã phải thực hiện nhiều hình thức số nhiều một lần. Tôi đã mở rộng String.Formatđể nó có thể hỗ trợ cú pháp tuyệt vời này: "There {0:was|were} {0} {0:virus|viruses} found."Mỗi ngôn ngữ có thể tải các quy tắc riêng của mình, vì vậy bạn có thể thực hiện "Znaleziono {0} {0:wirusy|wirusów}." Nguồn trên GitHub: github.com/scottrippey/SmartFormat/wiki
Scott Rippey

2
@Scott Rippey Bạn có để ý rằng ví dụ Ba Lan có ghi "Znaleziono 4 wirusy. HOẶC Znaleziono 5 wirusów." <- Tiếng Ba Lan, giống như nhiều ngôn ngữ khác, có nhiều hơn hai dạng số nhiều và các quy tắc để phân biệt giữa chúng cũng có thể phức tạp. Ở đây tôi phải rời khỏi Ba Lan vì tôi không nói được, nhưng trong ngôn ngữ của tôi, dạng số nhiều cho 101 điều tương tự như đối với 1 điều. Bạn có thể xem cách GNU gettext giải quyết vấn đề này: gnu.org/s/hello/manual/gettext/Plural-forms.html
gregopet

2
@gregopet Ví dụ tiếng Ba Lan của tôi đã bị tước đoạt, vì tôi không nói ra, nhưng đó chính xác là những gì mà dự án SmartFormat làm. Đây là một ví dụ tốt hơn : "{0} {0:plik|pliki|plików}". Trình định dạng có quy tắc Ba Lan xác định hình thức nào trong 3 hình thức sẽ sử dụng và xác định chính xác các trường hợp đặc biệt. Tôi hiện đang làm việc để thêm nhiều quy tắc, vì vậy gettextbài viết sẽ chứng minh rất hữu ích, cảm ơn bạn.
Scott Rippey

Để giả địa phương hóa, tôi đã xây dựng một công cụ giả định trực tuyến miễn phí tại pseudolocalize.com
JerSchneid

74

Một số điều cơ bản bạn nên tính đến:

Bên ngoài tất cả các tài nguyên chuỗi

Tất cả tài nguyên của bạn nên được chứa trong các tệp bên ngoài có thể được lưu lại để bản địa hóa. Đừng quên thông báo lỗi, nếu bạn cũng muốn những thông báo cục bộ này.

Cho phép đủ không gian để mở rộng chuỗi

Ví dụ, chuỗi trong một số ngôn ngữ có xu hướng dài hơn tới 30% (như tiếng Hy Lạp), vì vậy hãy đảm bảo rằng bạn thiết kế giao diện người dùng của mình theo cách sao cho chuỗi có thể mở rộng nếu cần. Đây là một ví dụ khá khắc nghiệt cho tiếng Pháp:

Ok -> Aceemter (tiếng Pháp - mở rộng 400%)

Tôi khuyên bạn nên thực hiện một số loại dịch giả làm điểm bắt đầu ( http://en.wikipedia.org/wiki/Pseudolocalization ). Hoặc bạn có thể dịch tài nguyên của mình thông qua Google Dịch hoặc Bing. Điều này sẽ cung cấp cho bạn một dấu hiệu tốt về những bản dịch thực tế sẽ trông như thế nào.

Xem ra cho văn bản trong hình ảnh

Nếu bạn sử dụng bất kỳ hình ảnh nào trong ứng dụng của mình - đảm bảo chúng không chứa bất kỳ văn bản nào - điều này rõ ràng không thể dịch được.

Không bao giờ mã hóa bất kỳ đường dẫn đến thư mục Windows

Rõ ràng, nhưng tôi đã nhìn thấy nó trong quá khứ. Ví dụ: C:\Program Filesđược dịch trên một số phiên bản quốc tế của Windows, ví dụ: C:\Programmetrên hệ điều hành Đức.

Tránh sử dụng thuật ngữ địa phương cụ thể

Ví dụ: nếu bạn hỏi ai đó về 'Trường trung học' của họ trên một biểu mẫu, điều này có rất ít ý nghĩa ở Tây Âu.

Tránh tạo chuỗi thông qua nối chuỗi

Ví dụ, điều này có vẻ vô hại:

strWelcome = ReadExternalString("Welcome"); 
strMessage = strWelcome + ", " + UserName;

Nhưng, thứ tự từ trên tiếng Nhật chẳng hạn sẽ khác, vì vậy điều này có thể sẽ không có ý nghĩa gì.

Cài đặt thời gian / ngày

Luôn đảm bảo lấy định dạng thời gian / ngày từ HĐH.


@Jimmy C, làm thế nào để bạn xây dựng chuỗi cho tính nhất quán logic độc lập với ngôn ngữ?
smartcaveman

14
@Smart làm một cái gì đó trong tài nguyên của bạn như "{0}, {1}" sau đó khi bạn bản địa hóa nó, hãy sử dụng string.format và chuyển vào lời chào và tên người dùng. Thêm vào đó, điều này mang lại cho bạn lợi ích của việc có "Tốc độ {0} hiện tại là {1} {2}" và bạn có thể chuyển qua "Động cơ", "50" và "MPH" và khi bạn dịch câu của mình, bạn có thể di chuyển { 0} vv xung quanh nơi mà chúng có ý nghĩa trong ngôn ngữ đó
taylonr

4
Danh sách tốt JimmyC. "Không bao giờ mã hóa bất kỳ đường dẫn nào tới các thư mục Windows" nhắc nhở tôi về "Luôn sử dụng Path.Combine" thay vì nối chuỗi cho các đường dẫn của windows.

@ Jimmy-C Câu trả lời tuyệt vời!

1
Môi trường.GetFolderPath có thể được sử dụng để có được các đường dẫn hợp lệ đến các đường dẫn phổ biến như Tài liệu của tôi mà không phụ thuộc vào tên tiếng Anh cho các thư mục đó.
tê liệt

24

Cân nhắc đặc biệt cho ngôn ngữ châu Á

Ngoài tất cả các câu trả lời tuyệt vời đã có ở đây, một số cảnh giác dành cho các ngôn ngữ châu Á:

Coi chừng độ dài khác nhau của văn bản

Văn bản tiếng Trung và tiếng Hàn có xu hướng ngắn hơn nhiều so với văn bản tiếng Anh tương đương (vì bạn thường cần ít ký tự khối hơn để viết cùng một thứ), vì vậy một trang thực sự có thể trông trống rỗng bằng tiếng Trung Quốc nhưng bị kẹt hoàn toàn bằng tiếng Đức ... Bạn cần phải làm một số kích thước năng động ở đây để nhìn tốt.

Tuy nhiên, văn bản tiếng Nhật thường có xu hướng dài hơn nhiều, thậm chí dài hơn văn bản tiếng Anh tương đương về số lượng ký tự.

Cẩn thận với bố cục cơ sở và giao diện "trượt lên"

Các ký tự châu Á thường được đặt trên đường cơ sở , không bao gồm hậu duệ (tức là phần dưới của y, g, q, j, v.v.) Khi bạn định dạng một thành phần màn hình - thường là các nút - có văn bản bên trong và nếu đó văn bản chỉ là ngôn ngữ châu Á (tức là không có bảng chữ cái phương Tây), sau đó văn bản sẽ trông giống như được dịch chuyển lên trên.

Định dạng số và đơn vị số địa phương

Xử lý định dạng số khác nhau. Các quốc gia châu Á khác nhau có cách định dạng số khác nhau. Tương tự với tiền tệ. Ví dụ, ở Đông Á, 10.000 (wan) là một đơn vị phổ biến. Ở Ấn Độ, 100.000 (lakhs) là phổ biến.

Đồng nội tệ

Tiền tệ của một số quốc gia có rất nhiều số không và không có dấu thập phân (ví dụ: Nhật Bản, Indonesia, Ý), trong khi các loại tiền khác có tối đa hai chữ số sau dấu thập phân.

Cẩn thận với các đơn đặt hàng từ khác nhau

Trật tự từ có thể không phải luôn luôn giống nhau. Tốt nhất nên sử dụng {0}, {1}, v.v. trong định dạng chuỗi thay vì thứ tự từ mã hóa cứng nếu chuỗi của bạn đến từ sự kết hợp của các phần dữ liệu khác nhau.

Sử dụng sắp xếp theo địa phương

Sắp xếp là khác nhau theo ngôn ngữ và mỗi ngôn ngữ - bạn nên luôn luôn dựa vào loại sắp xếp theo địa phương cụ thể của O / S.

Hãy thận trọng với các ký tự toàn chiều rộng / nửa chiều rộng

Cảnh giác với sự khác biệt giữa các ký tự "toàn chiều rộng" và "nửa chiều rộng". Chân đế, dấu chấm câu, vv có thể có các phiên bản "toàn chiều rộng" khác với ASCII tiêu chuẩn. Nếu bạn thực hiện tìm kiếm hoặc chia chuỗi dựa trên các chữ cái này, trước tiên bạn cần chuyển đổi tất cả các biểu tượng có chiều rộng đầy đủ thành tương đương nửa chiều rộng.

Dấu chấm không phải là dấu chấm ... dấu phẩy không phải là dấu phẩy ...

Cảnh giác với dữ liệu đầu vào của gotcha - ví dụ, trong tiếng Trung, dấu chấm không phải là dấu chấm ".". Dấu phẩy là toàn chiều rộng, không phải ",". Đừng cố tìm kiếm dấu chấm câu phương tây nếu người dùng thực hiện nhập dữ liệu có thể vô tình bật IME ngôn ngữ châu Á.

Số điện thoại

Đừng giả sử bất cứ điều gì trong định dạng số điện thoại. Không phải lúc nào cũng có mã vùng, v.v. và nó có thể được định dạng khác nhau. Thông thường, có một chuỗi định dạng cho mỗi quốc gia.

Đừng cho rằng mọi người sẽ chỉ có một số điện thoại di động hoặc một số fax, v.v. Đây không phải là cách này ở châu Á.

Địa chỉ - dày đặc hơn bạn nghĩ

Đối với địa chỉ, đừng giả sử bất cứ điều gì . Có thể không phải lúc nào cũng có mã zip. Mã zip có thể không phải luôn luôn là số. Một quốc gia có thể không có tỉnh / bang. Một quốc gia có thể chỉ là một thành phố lớn (ví dụ Singapore). Đối với một số quốc gia châu Á, đơn vị nhỏ nhất của một ngôi nhà có thể là "Phòng X, Đơn vị Y, Phần Z, Tầng A, Khối B, Nhóm C, Bất động sản D". Nói chung, rất tự do về số lượng trường và số lượng ký tự được phép trong địa chỉ.

Salutations

Salutations không chỉ giới hạn cho ông, bà, vv Mặc dù có lẽ bạn đang an toàn trong việc sử dụng "M" và "F" cho quan hệ tình dục - chúng tôi không thấy lạ chưa ...


1
Đoạn cuối làm tôi mỉm cười.
BoltClock

Ồ, chúng tôi (i18n guys) thậm chí chưa bắt đầu ... Chúng tôi chỉ có thể làm trầy xước bề mặt :) Nếu chúng tôi nói về các vấn đề cụ thể như hỗ trợ GB18030, bài đăng của chúng tôi sẽ quá dài để SO xử lý :) Cảm ơn cho ghi chú của bạn dù sao, tôi đã bỏ lỡ khá nhiều mặt hàng.
Paweł Dyda

Về cuối cùng, tôi tin rằng Vương quốc Anh bây giờ chính thức chấp nhận "Khác" là một giới tính. Hãy nghĩ rằng người chuyển giới.
Bart Friederichs

11

Một số bước cơ bản là đảm bảo bất kỳ chuỗi nào được hiển thị trên màn hình không phải là một chữ trong mã của bạn. Nếu bạn đang thực hiện Winforms, mỗi biểu mẫu sẽ có tài nguyên UI. Đối với các hộp thoại, báo cáo, v.v., hãy đảm bảo bạn sử dụng các tệp tài nguyên dự án.

Vì vậy, thay vì "Tải lên thất bại" trong mã của bạn, bạn có thể có một cái gì đó như Tài nguyên.UploadFails

Bằng cách này, bạn có thể tạo một tệp tài nguyên mới cho mỗi ngôn ngữ bạn sử dụng (và .Net sẽ giúp với điều này.) Và có chuỗi địa phương hóa trong mỗi tệp.

EDIT Tôi quên đề cập đến khi bạn đang thực hiện giao diện người dùng của mình, đảm bảo bạn không chỉ nhồi nhét những thứ trong đó. Tùy thuộc vào ngôn ngữ bạn định vị, bất động sản có thể là một vấn đề. Tôi đã làm việc trong một dự án có tiếng Đức và tiếng Bồ Đào Nha là 2 tội phạm lớn nhất cho sự phát triển chuỗi. Nếu chúng ta không cẩn thận các chuỗi tiếng Anh tốt, tiếng Pháp và tiếng Ý sẽ nổ tung bằng tiếng Đức.


1
Từ kinh nghiệm L10n của tôi, tiếng Nga là trường hợp xấu nhất. Tuy nhiên, trong Winforms với người dùng TableLayoutPanels thích hợp, người ta có thể xử lý sự tăng trưởng chuỗi một cách duyên dáng.
Paweł Dyda

Vâng, kinh nghiệm của tôi chỉ giới hạn ở 7 ngôn ngữ: tiếng Anh, tiếng Đức, tiếng Bồ Đào Nha, tiếng Ý, tiếng Pháp, tiếng Tây Ban Nha và tiếng Nhật. Nhưng tôi có thể thấy tiếng Nga rất tệ vì họ có xu hướng có nhiều hậu tố và tiền tố
taylonr

9

Tôi khuyên bạn nên chạy FXCop hoặc Phân tích mã Visual Studio (chúng khá giống nhau) trên các hội đồng của bạn.

Họ rất giỏi trong việc phát hiện mã .NET không sử dụng quá tải định hướng văn hóa thích hợp, như thế này: CA1305: Chỉ định IFormatProvider .

Tôi phải thêm rằng các công cụ này cũng gây phiền toái vì chúng thường phát hiện hàng trăm vấn đề trong mã của bạn, tuy nhiên, ngay cả khi bạn không tuân theo từng quy tắc, bạn nên tìm hiểu nhiều.


Đây có phải là mặc định hay tôi cần chỉ định một số cài đặt cho nó để tìm kiếm các quy tắc cụ thể toàn cầu hóa?
smartcaveman

@smartcaveman - đó là mặc định (hmm .. trên thực tế, một số người nghĩ rằng có những quy tắc mặc định kéo nhiều trong những công cụ này :-)
Simon Mourier

7

Ngoài cách cụ thể để tải tài nguyên, tôi chắc chắn rằng bạn sẽ kiểm tra phiên bản giả cục bộ để bắt đầu. Mặt khác, bạn không có khả năng nhận thấy những nơi mà các cân nhắc quốc tế hóa đã bị bỏ qua cho đến khi kết thúc.


Để có một cách nhanh chóng, dễ dàng để giả hành, tôi đã xây dựng một công cụ trực tuyến miễn phí tại pseudolocalize.com
JerSchneid

6

Ngoài tất cả các gợi ý hữu ích khác, đây là một số điều còn thiếu:

Hãy xem xét rằng một số quốc gia sử dụng nhiều hơn một ngôn ngữ. Ví dụ, ở Canada, người dùng sẽ có thể dễ dàng chuyển đổi giữa tiếng Anh và tiếng Pháp.

Nếu bạn hỏi người dùng một câu hỏi mong đợi một câu trả lời, đừng mong người dùng nhấn phím 'Y' để nói Có.

Hãy lưu ý trong các procs được lưu trữ ngày tháng trong SQL DB có định dạng ở Hoa Kỳ

Đặt các chuỗi văn bản trong DB cho phép bạn sau đó thêm các ngôn ngữ bổ sung mà không cần triển khai lại.

Khi gửi tệp văn bản để dịch, luôn bao gồm mô tả ngữ cảnh để đảm bảo người dịch chọn từ đúng. Ví dụ: không có ngữ cảnh, bạn có thể dịch "cao độ:" thành một thứ gì đó để làm với âm thanh hoặc một nơi mà bạn chơi bóng đá

Nhãn địa chỉ luôn cần chuyển đổi. Tỉnh ở Canada, Bang ở Mỹ, Quận ở Anh


5

Bạn cần xem xét:

  1. Định tuyến cho đa ngôn ngữ

  2. Di chuyển tất cả chuỗi mã cứng vào tệp tài nguyên

Một ví dụ cho một tài sản:

Mô hình:

[Display(Name = <Resource for display name>.<field for this property>)]
[Required(ErrorMessage = <Resource for error message>.<field for this validate message>)]
public string TestProperty { get; set; }

Lượt xem:

@Html.LabelFor(m=>m.TestProperty)
@Html.EditorFor(m => m.TestProperty)
@Html.ValidationMessageFor(m => m.TestProperty)

5

Đây là một cái gì đó không được đề cập trong phần còn lại của câu trả lời.

Tùy thuộc vào mức độ phức tạp của ứng dụng của bạn và nội địa hóa, tôi rất khuyên bạn nên triển khai một nhà cung cấp tài nguyên thay thế và giữ tài nguyên cục bộ trong cơ sở dữ liệu. Với lược đồ nội địa hóa mặc định của ASP.NET, tất cả các tài nguyên được giữ trong các tệp RESX, trong đó:

  1. Là một nỗi đau ở mông để chỉnh sửa trong Visual Studio
  2. Hạn chế phân phối và quản lý tài nguyên cục bộ sau khi ứng dụng được biên dịch / vận chuyển / chạy.

Trong trường hợp sử dụng có thể, hãy xem xét việc cung cấp các gói ngôn ngữ cho ứng dụng của bạn và khả năng nhập và xuất ngôn ngữ thông qua giao diện người dùng. Các tập tin RESX sẽ không giúp đỡ ở đây.

Trong các tình huống như thế này, một nhà cung cấp tài nguyên thay thế là rất hữu ích. Thông tin thêm về cách thực hiện một có thể được tìm thấy ở đây . Tất nhiên đây là trường hợp hiếm gặp hơn thường thấy trong các ứng dụng doanh nghiệp, nhưng vẫn còn hiệu lực.


1
Cảm ơn bạn đã dành thời gian để xem qua những câu trả lời tuyệt vời này và vẫn đóng góp một cái gì đó mới và hữu ích.
smartcaveman

+1; Tôi đã xây dựng một ứng dụng web rộng rãi trong Asp.NET và cuối cùng chúng tôi đã thực hiện các bản dịch thông qua cơ sở dữ liệu. Các tính năng mới thường được thêm vào nhưng vì các dịch giả của chúng tôi không phải là chuyên gia về thuật ngữ cụ thể đã sử dụng, chúng tôi có thể nhanh chóng giải quyết các email khách hàng tức giận thuộc loại "Tại sao bạn sử dụng từ Y cho X mà hoàn toàn sai?".
gregopet

3

Điều quan trọng nhất là quản lý nội dung bằng nhiều ngôn ngữ khác nhau. Tôi đã tự mình phát triển vài websistes và quản lý nội dung bằng nhiều ngôn ngữ khác nhau là thách thức lớn nhất.

Tôi đang sử dụng cơ sở dữ liệu để lưu trữ các tài nguyên / nội dung. Nó cho tôi sự linh hoạt của việc thêm bất kỳ hỗ trợ ngôn ngữ nào tôi muốn. Tôi đã thực hiện logic quay trở lại ngôn ngữ tiếng Anh nếu không tìm thấy tài nguyên trong ngôn ngữ cụ thể.

Sau này bạn có thể sử dụng một trình dịch để chuyển đổi giá trị tiếng Anh sang bất kỳ ngôn ngữ nào.


2

Tóm tắt những điều cần xem xét trong quốc tế hóa:

  • Tất cả các thông tin nên được quốc tế hóa. Hãy xem xét rằng đồ họa có thể có thông tin mà chúng tôi muốn quốc tế hóa.

  • Kích thước của các trường hoặc chuỗi, tùy thuộc vào ngôn ngữ vì nó có thể gây ra sự cố cho chúng tôi.

  • Thứ tự các từ phụ thuộc vào ngôn ngữ chúng ta, vì vậy một trật tự trong một ngôn ngữ sẽ giống nhau trong ngôn ngữ khác.

  • Chúng ta phải tính đến việc định dạng ngày sẽ thay đổi từ ngôn ngữ này sang ngôn ngữ khác


1

Làm bài kiểm tra Thổ Nhĩ Kỳ :

Quốc tế hóa phần mềm là khó khăn trong hoàn cảnh tốt nhất , nhưng nó luôn làm tôi ngạc nhiên về mức độ thường xuyên một quốc gia cụ thể xuất hiện trong các cuộc thảo luận về các vấn đề quốc tế hóa: Thổ Nhĩ Kỳ ...

Nếu bạn quan tâm đến việc bản địa hóa hoặc quốc tế hóa, hãy buộc mã của bạn chạy theo miền địa phương Thổ Nhĩ Kỳ càng sớm càng tốt . Đó là một tiếng chuông mạnh mẽ cho mã của bạn chạy trong hầu hết - nhưng không có nghĩa là tất cả - văn hóa và địa phương ...

Nếu trang web / chương trình của bạn chạy tốt với một khách hàng Thổ Nhĩ Kỳ, bạn có thể chắc chắn rằng nó sẽ chạy trên hầu hết các nền tảng khác.

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.