2012-06-19 18 views
5

संपादित करें: मैंने पूरी तरह से प्रश्न फिर से लिखा क्योंकि ऐसा लगता है कि मैं अपने पहले दो संस्करणों में पर्याप्त स्पष्ट नहीं था। अभी तक सुझावों के लिए धन्यवाद।जावा स्रोत कोड को अंतर्राष्ट्रीयकृत कैसे करें?

मैं ट्यूटोरियल प्रोजेक्ट के लिए स्रोत कोड को अंतर्राष्ट्रीयकृत करना चाहता हूं (कृपया ध्यान दें, रनटाइम एप्लिकेशन नहीं)। यहाँ एक उदाहरण (जावा में) है:

/** A comment */ 
public String doSomething() { 
    System.out.println("Something was done successfully"); 
} 
अंग्रेजी में

, और फिर फ्रेंच संस्करण की तरह कुछ है:

/** Un commentaire */ 
public String faitQuelqueChose() { 
    System.out.println("Quelque chose a été fait avec succès."); 
} 

और इतने पर।

com.foo.class.comment1=A comment 
com.foo.class.method1=doSomething 
com.foo.class.string1=Something was done successfully 

और अन्य भाषाओं के लिए:

com.foo.class.comment1=Un commentaire 
com.foo.class.method1=faitQuelqueChose 
com.foo.class.string1=Quelque chose a été fait avec succès. 

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

कुछ ट्रेल्स मैं पाया है (क्या Alexs सुझाव के अलावा अन्य):

  • AntLR, एक भाषा पार्सर/जनरेटर। ऐसा लगता है कि Eclipse plugin
  • Eclipse's AST (सार सिंटेक्स ट्री) का उपयोग करना और मुझे लगता है कि किसी प्रकार की प्लगइन का निर्माण करना है।

मुझे आश्चर्य है कि वहां कोई उपकरण नहीं है जो पहले से ही ऐसा करता है।

+1

संपत्ति फ़ाइलों का उपयोग करें। –

+0

इसे देखें http://stackoverflow.com/questions/1318347/how-to-use-java-property-files –

+0

[जावा अंतर्राष्ट्रीयकरण ट्यूटोरियल] (http://docs.oracle.com/javase/tutorial/i18n/ index.html) अच्छी शुरुआत है। –

उत्तर

2

मैं के रूप में अद्वितीय तार का उपयोग करेंगे methodnames (या कुछ भी आप चाहते हैं स्थानीयकृत संस्करण द्वारा प्रतिस्थापित किया जा करने के लिए

public String m37hod_1() { 
    System.out.println(m355a6e_1); 
} 

तो मैं इस तरह प्रत्येक भाषा के लिए propertyfile निर्धारित करेंगे:।

m37hod_1=doSomething 
m355a6e_1="Something was done successfully" 

और फिर मैं सोर्सफाइल को पार्स करने और तारों को बदलने के लिए एक छोटा सा प्रोग्राम लिखूंगा। तो बस ग्रहण के बाहर सबकुछ।

या मैं एक स्टैंडअलोन अनुवाद कार्यक्रम की बजाय चींटी कार्य Replace और संपत्तिफाइल का भी उपयोग करता हूं। कुछ इस तरह:

<replace 
    file="${src}/*.*" 
    value="defaultvalue" 
    propertyFile="${language}.properties"> 
    <replacefilter 
    token="m37hod_1" 
    property="m37hod_1"/> 
    <replacefilter 
    token="m355a6e_1" 
    property="m355a6e_1"/> 
</replace> 

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

+0

+1। नोट: अर्थपूर्ण आईडी अधिक समझदार हो सकती है। –

+0

आपके सुझावों के लिए धन्यवाद। हाँ, यह एकमात्र तरीका है जिसे मैं अभी जानता हूं (मैंने शायद किसी प्रकार की grep/shell खोज और प्रतिस्थापन उपकरण का उपयोग करने के बारे में सोचा था) लेकिन फिर यह मूल कोड को पढ़ने में काफी कठिन बनाता है। मैं वास्तव में कुछ ऐसा खोजना चाहता हूं जो अधिक उपयोगकर्ता के अनुकूल है और यदि संभव हो तो ग्रहण में प्लग किया गया है। – bdery

+0

शायद आप वास्तव में अपने नाम छोड़ सकते हैं कि वे क्या हैं और यह वही काम करेगा। मैं मुख्य रूप से गीक-कारक के लिए 1337 का उपयोग करता हूं;) – AlexS

0

उपयोग .properties फ़ाइल, जैसे:

Locale locale = new Locale(language, country); 
ResourceBundle captions= ResourceBundle.getBundle("Messages",locale); 

इस तरह, जावा वर्तमान स्थानीय

(कौन सा ऑपरेटिंग सिस्टम या जावा स्थान सेटिंग्स से प्राप्त किया जाता है) के अनुसार Messages.properties फ़ाइल उठाता फ़ाइल, classpath पर होना चाहिए कहा जाता Messages.properties (डिफ़ॉल्ट एक), या जर्मन के लिए Messages_de.properties, आदि

एक पूरा ट्यूटोरियल के लिए यह देखें: http://docs.oracle.com/javase/tutorial/i18n/intro/steps.html

जहां तक ​​स्रोत कोड जाता है, मैं दृढ़ता से अंग्रेजी के साथ रहने की अनुशंसा करता हूं। GetUnternehmen() जैसे विधि नाम औसत डेवलपर के बाद बदतर अंग्रेजी वाले होते हैं। यदि आपको विदेशी डेवलपर्स को अपने कोड में परिचित करने की आवश्यकता है, तो अपनी भाषा में उचित डेवलपर दस्तावेज़ लिखें।

यदि आप अंग्रेजी और अन्य भाषाओं दोनों में जावाडोक रखना चाहते हैं, तो यह SO thread देखें।मुद्रित/लॉग स्ट्रिंग के लिए

+0

यह मेरे प्रश्न का उत्तर नहीं देता, क्षमा करें। यदि आवश्यक हो तो फिर से दोबारा पढ़ें। – bdery

0

, जावा में कुछ अंतरराष्ट्रीयकरण कार्यशीलताएं हैं, उर्फ ​​संसाधन बंडल। इस on oracle site

ग्रहण के बारे में एक ट्यूटोरियल भी है ("बाहरी स्ट्रिंग", जैसा कि मुझे याद है) के लिए ग्रहण भी है।

समारोह नाम के लिए, मैं बाहर लगता है कि नहीं क्या है, क्योंकि यह कई संस्करण पर कोड स्रोत बनाए रखने के लिए की आवश्यकता होगी ...

संबंध

+0

धन्यवाद लेकिन यह सवाल का जवाब नहीं देता है। वास्तविक प्रश्न का उत्तर देने के लिए – bdery

1

एक दृष्टिकोण कोड को एक भाषा में समाप्त करना होगा, फिर दूसरों का अनुवाद करना होगा।

आप सहायता करने के लिए ग्रहण का उपयोग कर सकते हैं।

  1. तैयार कोड को भाषा-विशिष्ट परियोजनाओं में कॉपी करें। तब
  2. :
    • पहचानकर्ता: रूपरेखा दृश्य (विंडो> दृश्य दिखाएं> रूपरेखा) में, प्रत्येक आइटम का चयन करें और Refactor> (Alt + Shift + R) का नाम बदलें। यह जहां भी इसका उपयोग किया जाता है पहचानकर्ता का नाम बदलने का ख्याल रखता है।
    • टिप्पणियां: खोज> फ़ाइल का उपयोग करें "/ *" या "//" के सभी उदाहरणों को खोजने के लिए। प्रत्येक पर क्लिक करें और संशोधित करें।
    • स्ट्रिंग्स:
      1. उपयोग स्रोत> तार बाह्यरूप शाब्दिक तार के सभी खोजने के लिए।
      2. खोज> संदेश "संदेश.getString()" के लिए फ़ाइल।
      3. प्रत्येक परिणाम पर क्लिक करें और संशोधित करें।
      4. प्रत्येक फ़ाइल पर, 'संपादित करें> ढूंढें/बदलें' ', "स्ट्रिंग स्ट्रिंग के साथ" //\$NON-NLS-.*\$ "को प्रतिस्थापित करें।
+0

धन्यवाद, हाँ यह एक तरीका है। मैं ऐसा करने का एक और अधिक स्वचालित और सुरुचिपूर्ण तरीका खोजना चाहता हूं। पूर्व। बाह्यकरण के लिए सभी तारों को इकट्ठा करना, एक उपकरण होने से सभी वर्गों, विधियों, चर, टिप्पणियों और तारों को किसी प्रकार के योग्य पहचानकर्ता (उदाहरण com.foo.class1.method1 = myMethod, आदि) के साथ तैयार करने वाली एक बड़ी गुण फ़ाइल उत्पन्न होती है, जो तैयार है अनुवादित किया जाना चाहिए। – bdery

+0

समझा। इस पर विचार करें यदि ऐसा उपकरण मौजूद नहीं है। :) स्थानीयकरण के साथ अपने अनुभव के आधार पर यह उत्तर प्रदान किया गया, और अनुमान है कि ट्यूटोरियल्स के लिए उदाहरण कोड बड़े पैमाने पर होने की संभावना नहीं है। –

2

क्या आप चाहते हैं एक बड़े पैमाने पर कोड परिवर्तन इंजन है।

एएनटीएलआर चाल नहीं करेगा; एएसटी आवश्यक हैं लेकिन पर्याप्त नहीं हैं। Life After Parsing पर मेरा निबंध देखें। ग्रहण का "एएसटी" बेहतर हो सकता है, यदि ग्रहण पैकेज नाम और प्रकार के संकल्प के लिए कुछ समर्थन प्रदान करता है; अन्यथा आप कभी भी यह समझने में सक्षम नहीं होंगे कि प्रत्येक "doSomething" (ओवरलोडेड या स्थानीय हो सकता है) को प्रतिस्थापित करने के लिए, जब तक कि आप उन्हें सभी समान रूप से प्रतिस्थापित करने के इच्छुक नहीं हैं (और आप संभवतः ऐसा नहीं कर सकते हैं, क्योंकि कुछ प्रतीकों का संदर्भ है जावा पुस्तकालय तत्वों के लिए)।

हमारे DMS Software Reengineering Toolkit का उपयोग आपके कार्य को पूरा करने के लिए किया जा सकता है। डीएमएस जावा को एएसटी (टिप्पणी कैप्चर समेत) को पार्स कर सकता है, एएसटी को मनमानी तरीकों से पार कर सकता है, एएसटी का विश्लेषण/परिवर्तन कर सकता है, और निर्यात संशोधित एएसटी वैध स्रोत कोड (टिप्पणियों सहित) के रूप में संशोधित किया जा सकता है।

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

यदि आपके पास एएसटी है तो स्ट्रिंग का गणना बहुत आसान है; बस पेड़ को क्रॉल करें और स्ट्रिंग अक्षर युक्त वृक्ष नोड्स देखें। (एएनटीएलआर और ग्रहण निश्चित रूप से भी ऐसा कर सकते हैं)।

यदि पार्सर ने टिप्पणियां कैप्चर की हैं तो टिप्पणियों की गणना भी सरल है। डीएमएस करता है। मुझे पूरा यकीन नहीं है कि क्या एएनटीएलआर का जावा व्याकरण करता है, या ग्रहण एएसटी इंजन; मुझे संदेह है कि वे दोनों सक्षम हैं।

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

pattern local_for_loop_index(i: IDENTIFIER, t: type, e: expression, e2: expression, e3:expression): for_loop_header 
     = "for (\t \i = \e,\e2,\e3)" 

पाश चर के लिए स्थानीय की घोषणाओं से मेल खाते हैं, और पहचानकर्ता, प्रकार, और विभिन्न भाव के लिए subtrees प्राप्त होगा; आप केवल पहचानकर्ता को पकड़ना चाहते हैं (और इसका स्थान, आसानी से स्रोत स्थिति की जानकारी से लिया जाता है जो प्रत्येक पेड़ नोड पर डीएमएस टिकटों को लेता है)। आपको विभिन्न प्रकार के पहचानकर्ताओं के मामलों को कवर करने के लिए शायद 10-20 ऐसे पैटर्न की आवश्यकता होगी।

कैप्चर चरण पूरा हो गया है, कुछ को सभी कब्जे वाली इकाइयों को अपनी लक्षित भाषा में अनुवाद करने की आवश्यकता है। मैं तुम्हें छोड़ दूंगा; अनुवादित इकाइयों को वापस रखना बाकी है।

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

मजेदार हिस्सा पहचानकर्ता का उपयोग करने में आता है।इसके लिए आपको दो बातें पता करने की जरूरत:

    एक पहचानकर्ता के किसी भी उपयोग के लिए
  • , क्या घोषणा का उपयोग करता है है, यदि आप इसे जानते हैं, तो आप इसे घोषणा के लिए नए नाम से बदल सकते हैं; डीएमएस पूर्ण नाम और प्रकार के रिज़ॉल्यूशन के साथ-साथ उपयोग सूची प्रदान करता है, जिससे यह बहुत आसान हो जाता है, और
  • क्या नाम बदलकर पहचानकर्ता मूल रूप से अलग-अलग क्षेत्रों में अलग-अलग होते हैं? सामान्य रूप से करना मुश्किल है। हालांकि, जावा भाषा के लिए, हमारे पास "छायांकन" जांच है, इसलिए आप कम से कम तय कर सकते हैं कि आपके पास कोई समस्या है। (, तो आप बस समझौता पेड़ वापस बाहर पुनर्लेखन एक स्रोत फ़ाइल डीएमएस का उपयोग कर के रूप में भी एक नाम प्रक्रिया है कि इस तरह छाया को हल करने के लिए इस्तेमाल किया जा सकता है का विरोध करता

पेड़ पैचिंग के बाद नहीं है के अंतर्निहित prettyprinter। मुझे लगता है कि ग्रहण एएसटी कर सकते हैं अपने पेड़ के साथ पैच लिखो। मुझे यकीन नहीं है कि एएनटीएलआर एएसटी से स्रोत कोड को पुन: उत्पन्न करने के लिए कोई सुविधा प्रदान करता है, हालांकि किसी ने जावा व्याकरण के लिए कोड किया हो सकता है। यह harder to do than it sounds है, सभी पिक्री विवरणों के कारण। वाईएमएमवी

अपने लक्ष्य को देखते हुए, मैं थोड़ा आश्चर्यचकित हूं कि आप एक स्रोतफाइल "foo.java" नहीं चाहते हैं जिसमें "कक्षा foo {...}" का नाम बदलकर .java हो। इसके लिए न केवल तब्दील पेड़ को लिखना होगा अनुवादित करने के लिए फ़ाइल का नाम (बहुत आसान) लेकिन शायद निर्देशिका पेड़ का पुनर्निर्माण भी कर रहा है (डीएमएस निर्देशिका निर्माण और फ़ाइल प्रतियों को भी करने के लिए सुविधाएं प्रदान करता है)।

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

+0

धन्यवाद, आप बहुत उपयोगी बिट्स लाते हैं। यह सच है कि समाधान सिर्फ पार्सिंग के बारे में नहीं बल्कि बदल रहा है। मुझे लगता है कि मैं एक साधारण खोज-प्रतिस्थापन समाधान के लिए जाऊंगा, क्योंकि ऐसा लगता है कि मैं इन पार्सर-अनुवादकों के साथ अपने सिर पर आ सकता हूं और मेरा उपयोग मामला बल्कि साधारण सामान के लिए था। मैं नीचे अपना आधिकारिक उत्तर पोस्ट करूंगा। – bdery

0

आप freemarker टेम्पलेट्स (या velocity जैसे अन्य टेम्पलेटिंग भाषा का उपयोग करके अपना कोड लिख सकते हैं)।

doSomething.tml

/** ${lang['doSomething.comment']} */ 
public String ${lang['doSomething.methodName']}() { 
    System.out.println("${lang['doSomething.message']}"); 
} 

lang_en.prop

doSomething.comment=A comment 
doSomething.methodName=doSomething 
doSomething.message=Something was done successfully 

और फिर अपने निर्माण के दौरान प्रत्येक भाषा प्रोप फ़ाइल के साथ टेम्पलेट विलय (का उपयोग कर चींटी/Gradle/Maven आदि)

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