कई (इन-हाउस) परियोजनाओं के लिए एक स्ट्रिंग अनुवाद डेटाबेस का निर्माण


9

हमारी कंपनी में हमारे पास मौजूदा अनुवाद ms-sql टेबल wich स्टोर स्ट्रिंग्स इस तरह हैं:

Id |     Key     | Language | Value 
 1 | hello-world |  nl-BE   | Hallo Wereld
 2 | hello-world |  en-GB   | Hello World

सिस्टम में 3 भाषाएं हैं और मुझे उम्मीद है कि यह भविष्य में अधिकतम 10 तक बढ़ जाएगी

इस तालिका को कई अलग-अलग परियोजनाओं (लगभग 60 परियोजनाओं, ज्यादातर वेबसाइटों / वेब एप्लिकेशन और कुछ वेब सेवाओं) द्वारा पढ़ा जाता है, जो प्रत्येक अनुवाद डेटाबेस के लिए एक डेटाबेस कनेक्शन खोलते हैं, अनुवाद को कैश करते हैं

फ्रंट-एंड देवों से प्रतिक्रिया यह है कि हमारे UIto इनपुट या अनुवाद का सबसे बड़ा नकारात्मक पक्ष यह है कि वे यह नहीं जान सकते हैं कि कौन सा प्रोजेक्ट इन स्ट्रिंग्स का उपयोग करता है।

वे कभी-कभी तारों को संशोधित करते हैं, यह नहीं जानते कि वे इसके साथ 7 परियोजनाओं को तोड़ रहे हैं।

अब उन्हें बस कुछ टाइप करना है this.Translate("Hello World")और सिस्टम बाकी का ध्यान रखता है।

मैं उन्हें कुछ करने के लिए मजबूर कर सकता था, this.Translate("Hello World","AwesomeApplication1")लेकिन ऐसा लगता है कि यह कई कई परियोजनाओं के लिए बहुत सारे refactoring की आवश्यकता है।

आप इस समाधान को कैसे प्रदान करेंगे? आप एक देव के रूप में, अनुवाद के लिए "प्रोजेक्ट नाम" कैसे प्रदान करेंगे? आप इसे डेटाबेस में कैसे संग्रहीत करेंगे?

महत्वपूर्ण नोट: अनुवाद फिर से उपयोग केंद्रीकृत डेटाबेस का पूरा बिंदु है, इसलिए किसी एक परियोजना में अनुवाद करना

1|hello-world|nl-BE|Hallo Wereld|MyAwesomeApplicatoin1
5|hello-world|nl-BE|Hallo Wereld!|MyAwesomeApplicatoin2

वास्तव में एक वांछित विकल्प नहीं है।

मैं कुछ पसंद करूँगा:

1|hello-world|nl-BE|Hallo Wereld|MyAwesomeApplicatoin1,MyAwesomeApplicatoin2

या तालिका में नाम डालने के बराबर एक विदेशी कुंजी।

अपडेट करें

डेटाबेस को सामान्य करने की सलाह के आधार पर मैं अब तक कुछ इस तरह से आया हूं:

//this allows me to distinquish if translations where added by developer or by translator

UPDATE2: पाठ के बजाय edmx जोड़ा गया। अगर लोग दिलचस्पी रखते हैं तो मैं WCF परियोजना को जीआईटीयूबी बना सकता हूं, इसलिए मैं इस अवधारणा को लपेट रहा हूं ताकि अन्य लोग इसका परीक्षण और उपयोग कर सकें।


सामान्यीकरण के लिए Ty। मतदान q और ए। मुझे विश्वास है, एक वसंत जावा गिटब मदद करेगा।
tgkprog

जवाबों:


5

प्रारंभिक नोट # 1: आप हमें यह नहीं बता रहे हैं कि फिलहाल अनुवाद कैसे बनाए रखा जाता है

प्रारंभिक नोट # 2: आपका डेटाबेस सामान्यीकृत नहीं है। जो भी समाधान आप लेने जा रहे हैं, पहले अपने डेटाबेस को सामान्य करें । यदि आप ऐसा नहीं करते हैं तो आप बाद में भयानक रखरखाव समस्याओं में भाग जाते हैं

क्या यही मुझे करना होगा।

  1. अपने अनुवाद कॉल को फिर से लिखें ताकि यह प्रोग्राम आईडी को सर्वर पर वापस ले जाए

  2. यदि यह अभी तक मौजूद नहीं है, तो बैक एंड अनुवादक डेटाबेस तालिका में स्ट्रिंग डाल देगा, और इसे प्रोग्राम आईडी के साथ टैग करेगा

  3. यदि स्ट्रिंग पहले से मौजूद है, तो यह तभी अपडेट किया जाएगा जब प्रोग्राम आईडी उस मूल प्रोग्राम आईडी से मेल खाती है जिसके साथ स्ट्रिंग बनाई गई थी। यदि नहीं, तो एक विरोधाभास अधिसूचना वापस करें।

बदलाव:

  • आप प्रोग्राम आईडी के बजाय 'डेवलपर आईडी / अनुवादक आईडी' का उपयोग कर सकते हैं। मैं इसे बेहतर मानता हूं क्योंकि ऐसे लोग हैं जो एक विदेशी भाषा जानते हैं और जो सोचते हैं कि वे जानते हैं। केवल पहले समूह में संशोधन के अधिकार हैं।

  • आप डीबी में स्ट्रिंग का उपयोग करने वाले सभी कार्यक्रमों की आईडी स्टोर करना चाह सकते हैं, ताकि आपको पता चल सके कि किन कार्यक्रमों में संघर्ष है।

  • आप इस 'स्वामित्व' का विस्तार प्रत्येक व्यक्ति की भाषा में कर सकते हैं: एक व्यक्ति अंग्रेजी कर सकता है, दूसरा डच।

  • एक बार जब आपका डेटाबेस सामान्य हो जाता है तो आप बिल्ड जटिलता जैसे "प्रोग्राम ए भाषाओं में 1,2,3 है, बी 3 और 5 में है"

मेरा यह भी सुझाव है कि आप एक अलग 'ट्रांसलेशन मेंटेनेंस' प्रोग्राम लिखें, जो आपको मिसिंग ट्रांसलेशन आदि दिखाएगा। मैंने एक बार 2-लेवल ऑथराइजेशन के साथ किया था: प्रत्येक ट्रांसलेशन को दूसरे व्यक्ति (आमतौर पर एक देशी वक्ता) द्वारा वेट किया जाना होता है।


1
मैंने आपके विचारों के आधार पर अपने प्रश्न को अपडेट किया
my

5

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

भंडारण के लिए, आप कुछ ऐसा कर सकते हैं:

1 ! hello-world ! nl-EN ! Hello World  ! *
2 ! hello-world ! nl-EN ! Howdy, World ! CowboyApp
3 ! hello-world ! nl-EN ! Arrgh        ! PirateApp

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

यह देखने के लिए कि कौन सा प्रोग्राम किस अनुवाद का उपयोग कर रहा है, आप अब यह जानते हैं - यदि आप उस जानकारी को मैन्युअल रूप से गेटर नहीं करना चाहते हैं, तो आप अनुवाद अनुरोधों को लॉग इन कर सकते हैं।


इसे 'इस' वर्ग में ले जाने का विचार मुझे अच्छा लगता है, मुझे लगता है कि मैं इस परियोजना का नाम वेब / ऐप के लिए ले जा रहा हूँ। फाइल को वहां से पढ़ें और पढ़ें। क्या आपको लगता है कि वाइल्ड कार्ड / प्रोजेक्ट-नाम का विचार 4000 अनुवादों की तरह स्केलेबल है?
16

3
एक वृद्धि के रूप में, डेटाबेस या DBAL में एक ट्रिगर जोड़ा जा सकता है जो "सब्सक्राइब्ड प्रोग्राम" कॉलम को अपडेट करता है जब भी कोई अनुवादित शब्द पढ़ा जाता है।

डेटाबेस ट्रिगर कभी परियोजना का नाम कैसे जान सकता है? (हम इकाई ढांचे 4 का उपयोग कर रहे हैं)
संशोधन

@ संशोधन मैं नहीं देखता कि क्यों नहीं - वॉल्यूम को एक मुद्दे का ज्यादा हिस्सा नहीं होना चाहिए। यदि बहुत सारे ऐप-विशिष्ट अनुवाद केवल ऐप का नाम सम्मिलित कर रहे हैं, तो आप स्थिरांक का उपयोग कर सकते हैं और साथ ही डुप्स में कटौती कर सकते हैं।
ग्रैंडमास्टरबी

एनवीएम मैं गलत समझा। हाँ एक ट्रिगर अच्छा कॉल कर सकता है, और wouldspeed बातें जाँच और पढ़ने पर एफई गर्त कि सामान को अद्यतन करने की तुलना में ऊपर ....
MVISION

1

यदि आपके सभी प्रोजेक्ट C # में लिखे गए हैं, और सभी अनुवादक कॉल इस तरह दिखते हैं

this.Translate("hello-world")

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

आपके प्रोग्राम की वास्तविक संरचना के आधार पर, वैकल्पिक रूप से आपके असेंबली के IL कोड से उस जानकारी को निकालना आसान हो सकता है। मैंने कुछ समय पहले कुछ ऐसा ही किया था, अनुवाद प्रयोजनों के लिए, इस उदाहरण कोड का उपयोग करके विधानसभाओं को पार्स करना।


मुझे इस तरह का समाधान पसंद था। लेकिन इस नई प्रणाली के साथ उत्पादन में जाने से पहले सभी 60 परियोजनाओं (कुछ भी नहीं) की आवश्यकता होगी। कॉलिंग कोड में प्रोजेक्ट नाम को स्थानांतरित करने के लिए सुझाया गया समाधान ठीक काम करता है और इससे बहुत कम परेशानी होगी, वैसे भी धन्यवाद!
18

1
@ संशोधन: मुझे लगता है कि विपरीत सच है। यदि आप रन टाइम में अनुवादों के लिए प्रोजेक्ट का नाम निर्धारित करते हैं, तो आपको यह सुनिश्चित करना होगा कि आपके सभी 60 प्रोजेक्ट्स के लिए हर अनुवाद के साथ हर वेब पेज को एक बार कॉल किया जाए ताकि आप उन सभी को लॉग इन कर सकें। स्रोत या असेंबली को स्टेटिक रूप से स्कैन करना, हालांकि, आपको किसी भी परीक्षण की आवश्यकता के बिना या पूरी प्रणाली चलाने के लिए एक पूरी सूची देता है।
डॉक ब्राउन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.