2008-11-24 32 views
7

Có một ứng dụng được quốc tế hóa hoàn toàn là điều cần thiết nếu bạn muốn bán trên toàn thế giới. Trong Java, chúng tôi đang sử dụng các gói tài nguyên và giải quyết mọi thứ cho mã hóa văn bản tĩnh.Làm cách nào để quốc tế hóa văn bản trong cơ sở dữ liệu?

Nhưng bạn sẽ làm gì về văn bản được lưu trữ trong cơ sở dữ liệu? Bắt đầu với định nghĩa tĩnh, đối với các đối tượng có thể sửa đổi người dùng, kết thúc bằng dữ liệu do người dùng nhập.

Giả sử bạn có cơ sở dữ liệu được người dùng sử dụng với các miền địa phương khác nhau - bạn xử lý điều này như thế nào? Bạn quốc tế hóa bao xa? Bạn ve con đương nay ở đâu vậy? Giải pháp nào có thể ngăn người dùng nhận văn bản bằng ngôn ngữ mà họ không hiểu?

Trả lời

6

Không lưu trữ văn bản được tạo hệ thống trong cơ sở dữ liệu. Thay vào đó, lưu trữ một mã (giống như một số tin nhắn) và sau đó quốc tế hóa nó ở cấp độ GUI. Đảm bảo rằng văn bản duy nhất xuất hiện trực tiếp từ cơ sở dữ liệu là văn bản mà người dùng tự đặt vào. Đảm bảo cơ sở dữ liệu của bạn được đặt để chấp nhận văn bản unicode.

0

Dữ liệu tĩnh là cách dễ nhất tôi sẽ tạo Bảng dịch để tưởng tượng một bảng UserStatus có một StatusId, TranslationToken, sau đó TranslationTable có một Mã thông báo, ngôn ngữ và văn bản.

Hoặc mô phỏng bạn chỉ có thể trả lại mã thông báo cho ứng dụng xử lý bằng tệp tài nguyên của bạn.

Đối với dữ liệu đầu vào của người dùng, điều này phức tạp hơn rất nhiều. Bạn cần chấp nhận các ký tự unicode ở mức tối thiểu nhưng sau đó câu hỏi trở thành Sắp xếp và So sánh. Phân loại là thứ lớn nhất. Rất nhiều những gì bạn có thể làm phụ thuộc vào ứng dụng của bạn. Vì vậy, nếu cơ sở dữ liệu của bạn chỉ hỗ trợ một ngôn ngữ duy nhất tại bất kỳ thời điểm nào (Hãy tưởng tượng nếu ứng dụng của bạn được phân phối cho khách hàng của bạn), thì đối chiếu là điểm tranh luận vì bạn có thể đặt thời gian cài đặt.

Tuy nhiên, nếu bạn phải hỗ trợ nhiều ngôn ngữ trong một cơ sở dữ liệu, bạn sẽ cần phải xử lý đối chiếu đúng cách. Cách duy nhất chúng tôi tìm thấy để thay đổi collation trên bay là để đặt nó trong các truy vấn của chúng tôi, và yêu cầu sql năng động được tạo ra. Ví dụ này sẽ là bạn đang lưu trữ tiếng Nga, tiếng Anh và Ba Lan tất cả trong một lĩnh vực trong cùng một bảng.

Chúng tôi chưa bao giờ khám phá bất cứ điều gì ngoài việc thu thập chữ cái La tinh và Kirin nhưng tôi tưởng tượng các ngôn ngữ Châu Á sẽ hoạt động tương tự.

0

Chúng tôi sử dụng tệp XML cho hệ thống của mình. Tệp chứa các liên kết chính với phần cụ thể của mô-đun của chúng tôi. Bằng cách này, chúng tôi có thể nhanh chóng thực hiện XPath để truy xuất thông tin. Chúng tôi có 1 tệp cho mọi ngôn ngữ (chúng tôi hỗ trợ 2 ngôn ngữ cho thời điểm này, nhưng thêm ngôn ngữ rất đơn giản chỉ cần sao chép-dán tệp). Giải pháp này không hoàn hảo nhưng có một số lợi thế:

  1. Không có trong cơ sở dữ liệu.
  2. Có thể được người khác bên ngoài lập trình chỉnh sửa.
  3. Dễ triển khai trong nhiều chế độ xem (chúng tôi có WinForm và WebForm).
1

workaround gì có thể giữ cho người dùng từ nhận văn bản trong một ngôn ngữ mà họ không hiểu?

Đó sẽ chỉ là vấn đề đối với dữ liệu do người dùng nhập.Vì vậy, nếu bạn muốn tránh những người dùng khác xem nội dung trong ngôn ngữ họ có thể không hiểu, hãy lưu trữ mã ngôn ngữ cùng với nội dung và chỉ hiển thị nội dung đó cho bất kỳ ai có cùng ngôn ngữ/người dùng đã chọn langauge.

Mặt khác, người dùng có thể biết nhiều ngôn ngữ để tôi không hạn chế họ xem nội dung, tôi chỉ thêm thông báo như "Nội dung này không có sẵn bằng ngôn ngữ bạn chọn, ..." và sau đó hiển thị nội dung trong ngôn ngữ có sẵn. Bằng cách này, bạn tăng khả năng người dùng nhận được nội dung mà cô ấy có thể hiểu được.

2

Thứ nhất, hãy nhận thức được những hạn chế. Đối với nội dung do người dùng tạo, bạn đang xem bản dịch cộng đồng (thất thường), dịch máy (không đáng tin cậy) hoặc thanh toán cho người dịch (đắt tiền!) Nếu bạn muốn bản địa hóa nội dung mà người dùng của bạn đang nhập vào ứng dụng của bạn. Bạn có thể muốn yêu cầu người dùng cung cấp hai phiên bản - một cho văn hóa mặc định của bạn (tiếng Anh?) Và một cho văn hóa được bản địa hóa của họ để bạn có thể cung cấp bản dịch ngược cho người dùng khác?

Thứ hai, hãy chuẩn bị cho một số di chuyển cơ sở dữ liệu cực kỳ dài ... nếu bạn có bốn cột văn bản trong bảng tính Excel, đột nhiên bạn đang xử lý việc chèn từng giá trị vào hệ thống dịch, truy xuất ID được bản địa hóa, và sau đó lưu trữ rằng trong bảng bạn đang thực sự nhập - và SELECT * sẽ chỉ cung cấp cho bạn ID cụm từ mà bạn cần phải giải quyết trở lại thành chuỗi bằng cách bản địa hóa chúng dựa trên bảng dịch của bạn.

Điều đó nói rằng - bạn có thể bản địa hóa rất nhiều bảng tra cứu, danh sách thả xuống, v.v. được điều khiển bởi cơ sở dữ liệu trong một dự án điển hình. Các chú thích khác đã đề cập đến việc lưu trữ các giá trị StringId trong cơ sở dữ liệu tham chiếu đến các tệp hoặc bảng tính tài nguyên bên ngoài, nhưng nếu bạn quan tâm đến việc giữ TẤT CẢ văn bản đã bản địa hóa trong cơ sở dữ liệu cùng với dữ liệu, thì bạn có thể thấy phương pháp này hữu ích.

Chúng tôi đã sử dụng bảng có tên là Cụm từ, có chứa ID và nội dung mặc định (tiếng Anh) cho mọi phần văn bản trong ứng dụng của bạn.

bảng khác của bạn kết thúc lên trông như thế này:

CREATE TABLE ProductType (
    Id int primary key, 
    NamePhraseId int, -- link to the Phrase containing the name of this product type. 
    DescriptionPhraseId int 
) 

Tạo Văn hóa bảng thứ hai, trong đó có các nền văn hóa cụ thể và trung tính bạn đang hỗ trợ. Đối với các điểm thưởng, hãy thực hiện bảng này dưới dạng cây tự tham chiếu (mỗi bản ghi Văn hóa chứa tham chiếu ParentCultureCode không có giá trị), vì vậy bạn có thể quay trở lại từ các nền văn hóa cụ thể ("fr-CA" cho tiếng Pháp Canada) sang nền văn hóa trung tính ("fr" nếu không có nội địa hóa trong khu vực tồn tại), với văn hóa bất biến/default của bạn (thường là 'en' bởi vì nó nên sử dụng rộng rãi)

dịch thực tế của bạn đang ở trong một bảng LocalizedPhrase, trông giống như:

CREATE TABLE LocalizedPhrase (
    PhraseId int primary key, 
    CultureCode varchar(8) primary key, 
    Content nvarchar(255) -- the actual localized content 
) 

bạn có thể mở rộng mô hình này nếu bạn muốn cung cấp các bản địa hóa cụ thể cho phái nam/nữ:

CREATE TABLE GenderedLocalizedPhrase (
    PhraseId int primary key, 
    CultureCode varchar(8) primary key, 
    GenderCode char(1) primary key, -- 'm', 'f' or '?' - links to Gender table 
    Content nvarchar(255) 
) 

Bạn sẽ muốn lưu toàn bộ biểu đồ bảng này vào bộ nhớ và sửa đổi các truy vấn/kết hợp các chiến lược phù hợp - lưu trữ các bản địa hóa bên trong các lớp Cụm từ và ghi đè phương thức ToString() trên đối tượng Cụm từ để kiểm tra văn bản luồng hiện tại. Nếu bạn cố gắng và làm công cụ này bên trong truy vấn của bạn, bạn sẽ phải chịu một chi phí hiệu suất đáng kể và mọi truy vấn sẽ kết thúc như thế này:

-- assume @MyCulture contains the culture code ('ca-FR') that we are looking for: 
SELECT 
    Product.Id, 
    Product.Name, 

    COALESCE(ProductStatusLocalizedPhrase.Content, ProductStatusPhrase.Content) as ProductStatus, 
    COALESCE(ProductTypeLocalizedPhrase.Content, ProductTypePhrase.Content) as ProductType, 
    FROM Product 

    INNER JOIN ProductStatus ON Product.StatusId = ProductStatus.Id 
    INNER JOIN Phrase as ProductStatusPhrase ON ProductStatus.NamePhraseId = Phrase.Id 
    LEFT JOIN LocalizedPhrase as ProductStatusLocalizedPhrase 
     ON ProductStatus.NamePhraseId = ProductStatusLocalizedPhrase.Id and CultureCode = @MyCulture 

    INNER JOIN ProductType ON Product.TypeId = ProductType.Id 
    INNER JOIN Phrase as ProductTypePhrase ON ProductType.NamePhraseId = Phrase.Id 
    LEFT JOIN LocalizedPhrase as ProductTypeLocalizedPhrase 
     ON ProductType.NamePhraseId = ProductTypeLocalizedPhrase.Id and CultureCode = @MyCulture 
1

Chúng tôi đang thay đổi rất nhiều các văn bản trong cơ sở dữ liệu của chúng tôi là “ : văn bản mặc định ”sau đó tìm" khóa "trong các tệp dịch của chúng tôi.Điều này bao gồm tất cả văn bản mà khách hàng không thay đổi trong cơ sở dữ liệu, (ví dụ: những gì gọi là "ghi chú tín dụng"). Khi khách hàng thay đổi văn bản, họ có thể chỉ cần xóa khóa, để họ luôn đạt được giá trị đó.

Hệ thống của chúng tôi có một vài bảng chứa dữ liệu cấu hình cần ở trên, các bảng chỉ chứa văn bản mà khách hàng nhập vào không phải là vấn đề nếu mỗi khách hàng chỉ cần một ngôn ngữ duy nhất.

1

Hãy nói rằng bạn có một bảng:

create table countries (
    country_id int primary key, 
    short_name text not null unique, 
    official_name text not null unique, 
    iso_code char(2) not null unique 
); 

insert into countries values (12, 'Algeria', 'The People''s Democratic Republic of Algeria' 'DZ'); 

Sau đó, bạn tạo một bảng dịch:

create table countries_t (
    country_id int not null references countries(country_id), 
    short_name text not null, 
    official_name text not null, 
    locale varchar(5) not null, 

    primary key (country_id, locale) 
); 

insert into countries_t values 
(12, 'Algérie', 'la République algérienne démocratique et populaire', 'fr'), 
(12, 'Algerien', 'Demokratische Volksrepublik Algerien', 'de-DE'); 

Tạo một cái nhìn để trả lại dữ liệu dựa trên một user - biến phiên defined. Dưới đây là PostgreSQL cụ thể nhưng cơ sở dữ liệu của bạn có thể hỗ trợ các biến session tùy chỉnh, nếu không sử dụng tạm thời bảng:

create view countries_i18n as 
    select 
    a.country_id, 
    coalesce(c.short_name, b.short_name, a.short_name) as short_name, --default to countries.name if translation not found 
    coalesce(c.official_name, b.official_name, a.official_name) as official_name 
    countries.iso_code 
    from countries a 
    left join countries_t b on b.id = a.id and b.locale = current_setting('my_custom_guc.locale') 
    left join countries_t c on c.id = a.id and c.locale = left(current_setting('my_custom_guc.locale'), 2); --fall-back to 2-letter locale 

Query bảng bằng tiếng Đức như nói ở Đức:

SET my_custom_guc.language_code = 'de-DE'; 

select country_id, iso_code, short_name, official_name from countries_i18n; 

country_id iso_code short_name official_name 
----------------------------------------------- 
12   DZ  Algerien Demokratische ... 

Query bảng bằng tiếng Pháp của Canada (rơi trở lại để chung tiếng Pháp):

SET my_custom_guc.locale= 'fr-CA'; 

select country_id, iso_code, short_name, official_name from countries_i18n; 

country_id iso_code short_name official_name 
----------------------------------------------- 
12   DZ  Algérie  la République ... 

Query bảng trong tiếng Tây Ban Nha (không có dịch, trả về tiếng Anh):

SET my_custom_guc.language_code = 'es'; 

select country_id, iso_code, short_name, official_name from countries_i18n; 

country_id iso_code short_name official_name 
----------------------------------------------- 
12   DZ  Algeria The People's D ... 
Các vấn đề liên quan