2008-11-24 16 views
7

यदि आप दुनिया भर में बेचना चाहते हैं तो पूरी तरह से अंतर्राष्ट्रीयकृत आवेदन होना आवश्यक है। जावा में हम संसाधन बंडलों का उपयोग कर रहे हैं और यह स्थिर टेक्स्ट कोडसाइड के लिए चीजों को हल करता है।आप डेटाबेस में पाठ को अंतर्राष्ट्रीय कैसे बनाते हैं?

लेकिन डेटाबेस में संग्रहीत पाठ के बारे में आप क्या करते हैं? स्थिर परिभाषाओं से शुरू, उपयोगकर्ता संशोधित वस्तुओं के लिए, उपयोगकर्ता दर्ज डेटा के साथ समाप्त होता है।

मान लें कि आपके पास अलग-अलग लोकेल वाले उपयोगकर्ताओं द्वारा उपयोग किया जाने वाला डेटाबेस है - आप इसे कैसे संभालेंगे? आप कितनी अंतर्राष्ट्रीयकरण करते हैं? आपने पंक्ति को कहां खींचा था? क्या कामकाज उपयोगकर्ताओं को उस भाषा में पाठ प्राप्त करने से रोक सकता है जिसे वे समझ में नहीं आ रहे हैं?

उत्तर

6

डेटाबेस में सिस्टम जेनरेट किए गए टेक्स्ट को स्टोर न करें। इसके बजाए, एक कोड (एक संदेश संख्या की तरह) स्टोर करें और फिर इसे जीयूआई स्तर पर अंतर्राष्ट्रीयकृत करें। सुनिश्चित करें कि डेटाबेस से सीधे बाहर आने वाला एकमात्र पाठ वह पाठ है जिसे उपयोगकर्ता स्वयं में डालता है। सुनिश्चित करें कि आपका डेटाबेस यूनिकोड टेक्स्ट स्वीकार करने के लिए सेट है।

0

स्टेटिक डेटा सबसे आसान है, मैं एक अनुवाद तालिका बनाउंगा, इसलिए एक UserStatus तालिका की कल्पना करें जिसमें स्टेटस आईडी, अनुवाद टोकन है, तो अनुवादटेबल में टोकन, भाषा और टेक्स्ट है।

या सिमिलरी आप अपनी संसाधन फ़ाइलों का उपयोग करके प्रक्रिया के लिए केवल टोकन वापस कर सकते हैं।

उपयोगकर्ता इनपुट डेटा के लिए यह बहुत अधिक जटिल है। आपको कम से कम यूनिकोड वर्णों को स्वीकार करने की आवश्यकता है लेकिन फिर प्रश्न सॉर्टिंग और तुलना करना बन जाता है। छंटनी सबसे बड़ी है। आप जो कुछ भी कर सकते हैं वह आपके आवेदन पर निर्भर करता है। इसलिए यदि आपके डेटाबेस को किसी भी बिंदु पर केवल एक भाषा का समर्थन करना है (कल्पना करें कि आपका आवेदन आपके ग्राहकों को वितरित किया गया था), तो संयोजन एक महत्वपूर्ण बिंदु है क्योंकि आप इसे इंस्टॉल समय पर सेट कर सकते हैं।

हालांकि, यदि आपको एक डेटाबेस में एकाधिक भाषाओं का समर्थन करना है तो आपको कोलेक्शन को सही तरीके से संभालना होगा। फ्लाई पर टक्कर बदलने के लिए हमें एकमात्र रास्ता मिल गया था, इसे हमारे प्रश्नों के भीतर सेट करना था, और इसके लिए गतिशील एसक्यूएल उत्पन्न होना आवश्यक था। यह उदाहरण होगा कि आप एक ही टेबल में एक क्षेत्र में रूसी, अंग्रेजी और पोलिश को स्टोर कर रहे हैं।

हमने लैटिन और सिरिलिक collations से परे कुछ भी नहीं खोजा लेकिन मुझे लगता है कि एशियाई भाषाएं भी वही काम करती हैं।

0

हम अपने सिस्टम के लिए एक्सएमएल फाइल का उपयोग करते हैं। फ़ाइल में हमारे मॉड्यूल के विशिष्ट भाग के साथ प्रमुख संघ शामिल हैं। इस तरह हम सूचना पुनर्प्राप्त करने के लिए जल्दी से XPath कर सकते हैं। हमारे पास प्रत्येक भाषा के लिए 1 फ़ाइल है (हम इस पल के लिए 2 भाषाओं का समर्थन करते हैं, लेकिन एक भाषा जोड़ना फ़ाइल को कॉपी-पेस्ट करना बहुत आसान है)। यह समाधान सही नहीं है लेकिन कुछ फायदे हैं:

  1. डेटाबेस में नहीं।
  2. प्रोग्रामिंग के बाहर किसी बाहरी व्यक्ति द्वारा संपादित किया जा सकता है।
  3. कई विचारों में लागू किया जाना आसान है (हमारे पास WinForm और WebForm है)।
1

क्या वैकल्पिक हल के लिए एक भाषा वे समझ में नहीं आता में पाठ प्राप्त से उपयोगकर्ताओं को रख सकते हैं?

यह उपयोगकर्ता द्वारा दर्ज डेटा के लिए केवल एक समस्या होगी।इसलिए यदि आप लैंगेज में सामग्री देखने वाले अन्य उपयोगकर्ताओं से बचना चाहते हैं तो वे समझ में नहीं आ सकते हैं, सामग्री के साथ लोकेल कोड को एक साथ स्टोर करें और केवल उस सामग्री को उसी लोकेल/उपयोगकर्ता द्वारा चयनित लैंगेज के साथ प्रदर्शित करें।

दूसरी तरफ उपयोगकर्ता कई लैंगुगों को जान सकते हैं, इसलिए मैं उन्हें सामग्री देखने से प्रतिबंधित नहीं करूँगा, मैं सिर्फ एक नोटिस जोड़ूंगा जैसे "यह सामग्री आपकी पसंद की भाषा में उपलब्ध नहीं है ..." और फिर प्रदर्शित करें उपलब्ध लैंगेज में सामग्री। इस तरह आप संभावना को बढ़ाते हैं कि उपयोगकर्ता को वह सामग्री मिलती है जिसे वह समझ सकती है।

2

सबसे पहले, सीमाओं के बारे में बहुत जागरूक रहें। उपयोगकर्ता द्वारा निर्मित सामग्री के लिए, आप समुदाय अनुवाद (अनियमित), मशीन अनुवाद (अविश्वसनीय) या मानव अनुवादकों (महंगे!) का भुगतान कर रहे हैं यदि आप उन सामानों को स्थानीयकृत करना चाहते हैं जो आपके उपयोगकर्ता आपके आवेदन में प्रवेश कर रहे हैं। आप अपने उपयोगकर्ताओं से दो संस्करण प्रदान करने के लिए कह सकते हैं - एक आपकी डिफ़ॉल्ट संस्कृति (अंग्रेजी?) और एक अपनी स्थानीय संस्कृति के लिए, ताकि आप अन्य उपयोगकर्ताओं के लिए फॉल-बैक अनुवाद प्रदान कर सकें?

दूसरा, कुछ बेहद लंबी डेटाबेस माइग्रेशन के लिए तैयार रहें ... यदि आपके पास Excel स्प्रेडशीट में टेक्स्ट के चार कॉलम हैं, तो अचानक आप अपने अनुवाद सिस्टम में प्रत्येक मान डालने, स्थानीयकृत आईडी को पुनर्प्राप्त करने, और फिर उस तालिका में संग्रहीत जो आप वास्तव में आयात कर रहे हैं - और SELECT * केवल आपको वाक्यांश आईडी देगा, जिसे आपको अपनी अनुवाद तालिकाओं के विरुद्ध स्थानीयकरण करके स्ट्रिंग में वापस हल करने की आवश्यकता है।

उसने कहा - आप एक सामान्य प्रोजेक्ट में डेटाबेस द्वारा संचालित लुकअप टेबल, ड्रॉप-डाउन सूचियों आदि को स्थानांतरित कर सकते हैं। अन्य टिप्पणियों ने पहले ही डेटाबेस में स्ट्रिंगआईड मानों को संग्रहीत करने का उल्लेख किया है जो बाहरी संसाधन फ़ाइलों या स्प्रैडशीट्स का संदर्भ लेते हैं, लेकिन यदि आप डेटा के साथ डेटाबेस में अपने सभी स्थानीय टेक्स्ट को रखने में रुचि रखते हैं, तो आपको यह दृष्टिकोण उपयोगी लगेगा।

हमने वाक्यांश नामक एक तालिका का उपयोग किया है, जिसमें आपके आवेदन में पाठ के प्रत्येक भाग के लिए आईडी और डिफ़ॉल्ट (अंग्रेज़ी) सामग्री शामिल है।

आपका अन्य तालिकाओं अंत इस तरह लग रही:

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

एक दूसरी तालिका संस्कृति है, जो आप का समर्थन कर रहे विशिष्ट और तटस्थ संस्कृतियों शामिल बनाएँ। बोनस प्वाइंट्स के लिए, इस तालिका को एक स्व-रेफरेंसियल पेड़ के रूप में कार्यान्वित करें (प्रत्येक संस्कृति रिकॉर्ड में एक निरर्थक पेरेंटकल्चरकोड संदर्भ होता है), ताकि आप विशिष्ट संस्कृतियों (कनाडाई फ्रांसीसी के लिए "एफए-सीए") से तटस्थ संस्कृतियों ("fr" अगर कोई क्षेत्रीय स्थानीयकरण मौजूद है), अपने अपरिवर्तनीय/डिफ़ॉल्ट संस्कृति के लिए (आमतौर पर 'en', क्योंकि यह व्यापक रूप से बोली है)

आपका वास्तविक अनुवाद कि लग रहा है, एक LocalizedPhrase तालिका में हैं जैसे:

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

आप कर सकते हैं यदि आप नर/मादा-विशिष्ट स्थानीयकरण प्रदान करना चाहते हैं तो इस मॉडल का विस्तार करें:

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) 
) 

आप इस संपूर्ण तालिका ग्राफ को स्मृति में कैश करना चाहते हैं और तदनुसार अपनी क्वेरी/रणनीतियां संशोधित करना चाहते हैं - वाक्यांश कक्षाओं के अंदर स्थानीयकरण को कैश करना और वर्तमान थ्रेड संस्कृति का निरीक्षण करने के लिए वाक्यांश ऑब्जेक्ट पर ToString() विधि को ओवरराइड करना एक दृष्टिकोण है। आप कोशिश करते हैं और आपके प्रश्नों के अंदर इस चीजें करते हैं, तो आप एक बड़ा प्रदर्शन लागत का कारण बन जाएगा और हर क्वेरी इस तरह की तलाश में खत्म हो जाएगा:

-- 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

हमने अपने डेटाबेस में होने के लिए पाठ का एक बहुत बदल रहे हैं " कुंजी: डिफ़ॉल्ट पाठ "फिर हमारी अनुवाद फ़ाइलों में" कुंजी "को देख रहा है।इसमें सभी पाठ शामिल हैं जो ग्राहक डेटाबेस में नहीं बदलते हैं, (उदाहरण के लिए "क्रेडिट नोट" क्या कहना है)। जब ग्राहक टेक्स्ट बदलता है, तो वे केवल कुंजी को हटा सकते हैं, ताकि वे हमेशा वहां मूल्य प्राप्त कर सकें।

हमारे सिस्टम में कुछ सारणीयां हैं जिनमें कॉन्फ़िगरेशन डेटा होता है जिसमें उपरोक्त की आवश्यकता होती है, जिन तालिकाओं में केवल टेक्स्ट इनपुट होता है, वे समस्या नहीं हैं यदि प्रत्येक ग्राहक को केवल एक भाषा की आवश्यकता होती है।

1

मान लीजिए कि आप एक मेज करते हैं:

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'); 

तो फिर तुम एक अनुवाद तालिका बनाने:

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'); 

एक user के आधार पर डेटा वापस जाने के लिए एक दृश्य बनाएँ - defined सत्र चर। नीचे PostgreSQL विशेष है, लेकिन अपने डेटाबेस कस्टम सत्र चर, और उपयोग अस्थायी तालिका का समर्थन कर सकता है:

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 

क्वेरी जर्मनी में बोली जाने वाली के रूप में जर्मन में तालिका:

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 ... 

क्वेरी कनाडा के फ्रेंच में तालिका (सामान्य फ्रेंच के लिए वापस गिर जाता है):

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 ... 

क्वेरी (स्पेनिश में तालिका कोई अनुवाद है, रिटर्न अंग्रेजी):

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 ... 
संबंधित मुद्दे