2009-05-20 14 views
5

क्रिस्टल रिपोर्ट्स पर लेबल (कॉलम शीर्षलेख, फ़ील्ड लेबल, हेडर/फ़ुटर्स इत्यादि) को स्थानीयकृत करने के लिए एक अच्छी विधि क्या है?स्थानीयकृत क्रिस्टल रिपोर्ट

हम वर्तमान में एक्सआई आर 2 एसपी 4 पर हैं लेकिन 2008 में माइग्रेट करना चाहते हैं। ऐसा लगता है कि 2008 दर्शक दर्शक यूआई के बेहतर स्थानीयकरण की पेशकश करता है। क्या इसकी सामग्री स्थानीयकरण कहानी है?

उत्तर

2

दो विकल्प जो मैं सोच सकता हूं वे हैं: 1) प्रत्येक स्थानीय संस्करण के लिए एक अलग रिपोर्ट है (यह बदसूरत हो जाता है और मैं इसे अत्यधिक अनुशंसा नहीं करता) या 2) किसी एप्लिकेशन से उत्पन्न रिपोर्ट (एसी # विंडोज/वेब ऐप कहें) और फिर आप कोड में स्थानीयकरण मानकों का उपयोग करके स्थानीयकरण टेक्स्ट (संसाधन फ़ाइलों से पढ़ सकते हैं) को स्थानांतरित कर सकते हैं।

मैं 2008 के बारे में निश्चित नहीं हूं लेकिन हम XI R2 पर भी हैं। हमने प्रत्येक भाषा के लिए स्थानीयकृत रिपोर्ट की है, लेकिन केवल इसलिए कि हम * जानते हैं कि हमें केवल तीन अलग-अलग स्थानीय संस्करणों की आवश्यकता होगी।

+0

# 2 प्रत्येक पाठ क्षेत्र के माध्यम से स्कैन और स्थानीय पाठ के साथ बदलने के लिए आरडीसी का उपयोग कर किया जाएगा के लिए सिंगल क्रिस्टल रिपोर्ट का उपयोग करें? –

+0

हाँ - मैं इसे कभी नहीं किया है, हालांकि तो मुझे यकीन है कि सिर दर्द किस तरह शामिल हैं नहीं कर रहा हूँ। –

+0

आप एक UFL कि स्थानीय तार रिटर्न के बारे में क्या सोचते हैं? क्या प्रत्येक लेबल फ़ील्ड से कॉल करना एक प्रदर्शन मुद्दा होगा? –

0

एक ग्राहक ने मुझे उनके लिए स्थानीयकरण रणनीति विकसित करने के लिए कहा। मेरा मतलब है कि इस पर एक लेख लिखना है। धन्यवाद, मैंने बस यही किया है। http://www.cogniza.com/blog/?p=55

संपादित करें:

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

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

+0

लिंक रोट के मामले में विचार को सारांशित करना: एक कस्टम फ़ंक्शन बनाएं जो क्रिस्टल XI ContentLocale चर की जांच करके स्थानीयकृत स्ट्रिंग देता है। –

+2

मुझे वास्तविक अनुवाद को कस्टम फ़ंक्शन में रखने का विचार पसंद नहीं है। आउटसोर्सिंग अनुवाद करते समय यह सिरदर्द पैदा करेगा। –

2

क्रिस्टल रिपोर्ट्स में डेटटाइम्स जैसे मूल्यों के स्थानीयकरण के लिए एक तरीका मिला।
उदाहरण के लिए यदि तिथि अगस्त -2009 है और संस्कृति फ्रेंच है तो एओयूटी -2009 के रूप में प्रदर्शित होगी।
यह सब मौजूदा थ्रेड संस्कृति को फ्रेंच में स्विच करने के बिना।

प्रासंगिक कोड स्निपेट (उदाहरण):

  //Locale must be set BEFORE report is opened 
      if (this.IsEnglish) 
      { 
       ReportDoc.ReportClientDocument.PreferredViewingLocaleID = 
        CrystalDecisions.ReportAppServer.DataDefModel.CeLocale.ceLocaleEnglishCanada; 
       ReportDoc.ReportClientDocument.LocaleID = 
        CrystalDecisions.ReportAppServer.DataDefModel.CeLocale.ceLocaleEnglishCanada; 
       ReportDoc.ReportClientDocument.ProductLocaleID = 
        CrystalDecisions.ReportAppServer.DataDefModel.CeLocale.ceLocaleEnglishCanada; 
      } 
      else 
      { 
       ReportDoc.ReportClientDocument.PreferredViewingLocaleID = 
        CrystalDecisions.ReportAppServer.DataDefModel.CeLocale.ceLocaleFrenchCanada; 
       ReportDoc.ReportClientDocument.LocaleID = 
        CrystalDecisions.ReportAppServer.DataDefModel.CeLocale.ceLocaleFrenchCanada; 
       ReportDoc.ReportClientDocument.ProductLocaleID = 
        CrystalDecisions.ReportAppServer.DataDefModel.CeLocale.ceLocaleFrenchCanada; 
      } 

      //Load the report from file path 
      ReportDoc.Load(reportPath.ToString()); 
1

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

हमने क्रिस्टल रिपोर्ट एपीआई (2008 - इसलिए कोई आरडीसी नहीं है) का उपयोग करने वाला एक एप्लीकेशन विकसित किया है और दो चरणों में काम करता है।

पहला चरण सभी टेक्स्ट और आउटपुट को अंग्रेजी .resx फ़ाइल में स्क्रैप करना है। इसका सबसे कठिन हिस्सा कार्यों के भीतर अनुवाद करने योग्य पाठ की पहचान कर रहा है, और एम्बेडेड फ़ील्ड को टोकन के साथ बदल रहा है जो "अनुवाद न करें" दर्शाता है।

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

क्रिस्टल एपीआई बीजान्टिन है, और आपको कार्यों और एम्बेडेड फ़ील्ड के भीतर अनुवादनीय तारों का पता लगाने के आसपास किनारे के मामलों से सावधान रहना होगा।PageNofM तरह builtin क्षेत्रों के साथ सावधान रहें, वे घुंघराले ब्रेसिज़ में संलग्न नहीं कर रहे हैं (उल्लेख करने के लिए नहीं है कि आप {क्षेत्र} पृष्ठ {क्षेत्र} तो "पृष्ठ" और "की" अनुवाद किया जा सकता के साथ इस की जगह चाहिए)। एक सूचक, नियंत्रक का उपयोग क्लोन/संशोधित प्रतियों के साथ मौजूदा आइटम को बदलने के लिए, तो आप सिर्फ जगह में वस्तुओं के पाठ सामग्री को संशोधित नहीं कर सकते। शुभकामनाएं अगर आप इस मार्ग पर जाते हैं, लेकिन अंत में हम सोचते हैं कि यह सबसे अच्छा विकल्प है।

-1

एकाधिक भाषा

if (CultureInfo.CurrentCulture.Name == "en-US") 
{ 
    (obj.ReportDefinition.ReportObjects["lbleverest"] as TextObject).Text = resBundle.GetString("Localization", "everest"); 
    (obj.ReportDefinition.ReportObjects["lblmandlicode"] as TextObject).Text = resBundle.GetString("Localization", "SocietyCode"); 
    (obj.ReportDefinition.ReportObjects["MandliName1"] as FieldObject).ApplyFont(new Font(resBundle.GetString("Localization", "Font"), Convert.ToInt32(resBundle.GetString("Localization", "FontSize")), FontStyle.Regular)); 
    (obj.ReportDefinition.ReportObjects["shortName1"] as FieldObject).ApplyFont(new Font(resBundle.GetString("Localization", "Font"), Convert.ToInt32(resBundle.GetString("Localization", "FontSize")), FontStyle.Regular));   
}  
else  
{  
    (obj.ReportDefinition.ReportObjects["lbleverest"] as TextObject).Text = resBundle.GetString("Localization", "everest");  
    (obj.ReportDefinition.ReportObjects["lblmandlicode"] as TextObject).Text = resBundle.GetString("Localization", "SocietyCode");  
    (obj.ReportDefinition.ReportObjects["MandliName1"] as FieldObject).ApplyFont(new Font(resBundle.GetString("Localization", "Font"), Convert.ToInt32(resBundle.GetString("Localization", "FontSize")), FontStyle.Regular));  
    (obj.ReportDefinition.ReportObjects["shortName1"] as FieldObject).ApplyFont(new Font(resBundle.GetString("Localization", "Font"), Convert.ToInt32(resBundle.GetString("Localization", "FontSize")), FontStyle.Regular));  
} 

obj.DataDefinition.FormulaFields["lang"].Text = "'" + CultureInfo.CurrentCulture.Name + "'";  
cv.crystalReportViewer1.ReportSource = obj;  
cv.Show(); 
+0

'resbundle' क्या है? यदि कोड/अन्य में कोड समान रूप से ब्लॉक क्यों है? –

संबंधित मुद्दे