2010-10-12 15 views
20

मुझे एक सॉफ्टवेयर बनाना है जो कई * निक्स प्लेटफॉर्म (लिनक्स, एईक्स, ...) पर काम करना चाहिए।क्या printf के लिए कोई विकल्प है?

मैं अंतर्राष्ट्रीयकरण और मेरे अनुवाद तार को संभालने की ज़रूरत निम्नलिखित रूप में कर रहे हैं: नाम के लिए

"Hi %1, you are %2." // English 
"Vous êtes %2, bonjour %1 !" // French 

यहाँ %1 स्टैंड, और एक अन्य शब्द के लिए %2। मैं प्रारूप बदल सकता हूं, यह कोई मुद्दा नहीं है।

मैंने printf() का उपयोग करने की कोशिश की लेकिन आप पैरामीटर के क्रम को निर्दिष्ट नहीं कर सकते हैं, आप बस उनके प्रकार निर्दिष्ट करते हैं। printf() सिर्फ पहले एक, अगले उपयोग करता है तो:

"Hi %s, you are %s" 
"Vous êtes %s, bonjour %s !" 

अब कोई रास्ता नहीं है जो पैरामीटर के %s बदलने के लिए उपयोग करने के लिए पता करने के लिए है।

क्या printf() कोई विकल्प है जो इस से संबंधित है?

नोट: gettext() कोई विकल्प नहीं है।

+0

कोई अन्य भाषा का उपयोग करें? पायथन यह करता है, लेकिन यह सी – shodanex

उत्तर

25

POSIX printf() स्थितीय तर्क का समर्थन करता है है।

printf("Hi %1$s, you are %2$s.", name, status); 
printf("Vous êtes %2$s, bonjour %1$s !", name, status); 
+1

कूल! मुझे पता नहीं था! कोई संदर्भ? –

+0

@Amigable: 'man 3p printf' –

+0

ओह। लेकिन मुझे कहना होगा कि मैं पूरी तरह से मैनपेज को समझ नहीं पा रहा हूं। प्रिंटफ ("% * डी", चौड़ाई, संख्या) कैसे हो सकता है; और printf ("% 2 $ * 1 $ d", चौड़ाई, संख्या); अगर तर्कों को बाएं से दाएं गिने जाते हैं तो बराबर हो? –

11

boost.format अजगर की तरह इस तरह से समर्थन करता है, लेकिन इस के लिए सी ++

+1

बूस्ट :: प्रारूप का सबसे अच्छा तरीका है क्योंकि यह टाइपएफ़ भी है। कार्यान्वयन को अनुकूलित नहीं किया गया है, हालांकि, कवर के तहत printf के माध्यम से कॉल किया गया है (या पिछली बार मैंने देखा था) तो धीमा है कि सी printf का उपयोग 2-3 के कारक से सीधे कर रहा है। – dajames

9

आप% n $ s एक्सटेंशन चाहते हैं जो अधिकांश यूनिक्स सिस्टम के लिए आम है।

"Hi %1$s, you are %2$s." 

नीचे printf

सादर DaveF

+0

वाह - कई सेकंड बाद पोस्ट 6 अप वोट और 0. –

+0

@ डेविड एलन फिंच के बीच अंतर है: मैं निष्पक्षता के लिए उभरा। लेकिन यह हर समय मेरे साथ होता है;) – ereOn

+0

@ereOn: वास्तव में एक झुकाव नहीं, बस कुछ सेकंड तक भी पहली पोस्ट को झटका दें, उसी जवाब के लिए अब 11 बनाम 2 प्राप्त करने के लिए बहुत कुछ मायने रखता है। –

23

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

हम इन समस्याओं से बचने के लिए पूरी तरह से परिवर्तनीय बिट्स से त्रुटि टेक्स्ट को डिस्कनेक्ट करना चाहते हैं। तो

XYZ-E-1002 Frobozz not configured for multiple zorkmids (F22, 7). 

और, त्रुटि के वर्णन में, आप बस राज्य है कि अंत में कोष्ठक में दो मानों frobozz पहचानकर्ता और zorkmids की संख्या इस प्रकार थे: के लिए, उदाहरण के लिए, हम एक त्रुटि उत्पन्न करेंगे आपने उस पर चढ़ने की कोशिश की।

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

अनुवाद टीम को बस "Frobozz not configured for multiple zorkmids" परिवर्तित करना है और यह बहुत आसान है।


उन एक ठोस उदाहरण देखना चाहेंगे जो लिए, मैं कुछ हमारे अनुवाद bods से वापस (पर्याप्त सामग्री के साथ दोषी की रक्षा के लिए बदल गया है)।

कुछ बिंदु पर, किसी को प्रस्तुत निम्नलिखित:

The {name} {object} is invalid 

जहां {name} एक वस्तु का नाम था (ग्राहकों, आदेश, आदि) और {object} ऑब्जेक्ट प्रकार ही था (टेबल, फ़ाइल, दस्तावेज़, संग्रहीत प्रक्रिया, आदि)।

अंग्रेजी के लिए पर्याप्त सरल, डेवलपर्स की प्राथमिक (शायद केवल) भाषा, लेकिन जर्मन/स्विस-जर्मन में अनुवाद करते समय उन्होंने एक समस्या का सामना किया।

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

"ग्राहकों की संग्रहीत प्रक्रिया" के साथ एक बड़ी समस्या थी जो gespeichertes Verfahren der Kunden, सचमुच "ग्राहकों की संग्रहीत प्रक्रिया" बन गई। जबकि जर्मन ग्राहकों ने Kunden dokument में एक स्थान रखा हो सकता है, gespeichertes Verfahren der Kunden को {name} {object} पर सफलतापूर्वक लागू करने का कोई तरीका नहीं है।

अब आप कह सकते हैं एक चालाक प्रारूप स्ट्रिंग इस तय होगा कि लेकिन वहाँ कई कारण है कि सही नहीं होगा और इस प्रकार हैं:

  • यह एक बहुत ही सरल उदाहरण है, वहाँ और अधिक जटिल दूसरों (होने की संभावना है मैं कुछ उदाहरण प्राप्त करने की कोशिश करता हूं लेकिन हमारे अनुवाद बोड्स ने यह स्पष्ट कर दिया है कि उन्हें अपने हर चीज में जमा करने के बजाय अधिक दबाने वाले काम हैं)।
  • स्वरूप तारों का पूरा बिंदु बाहरी अनुवाद करना है। यदि प्रारूप स्ट्रिंग स्वयं अनुवाद लक्ष्य के लिए विशिष्ट हैं, तो आप टेक्स्ट को बाहरी करके बहुत कम प्राप्त कर चुके हैं।
  • डेवलपर्स को {possible-pre-adjectives} {possible-pre-owner} {object} {possible-post-adjectives} {possible-post-owner} {possible-postowner-adjectives} जैसे स्वरूप तारों के साथ खुद को चिंता करने की ज़रूरत नहीं है। यह अनुवाद टीम का काम है क्योंकि वे बारीकियों को समझते हैं।

ध्यान दें कि डिस्कनेक्ट शुरू अच्छी तरह से इस मुद्दे को नजरअंदाज कर देता है:

पिछले अनुवाद मेरा में से एक था
 
The object specified by <parameter 1>, of type <parameter 2>, is invalid. 
    Parameter 1 = {name}. 
    Parameter 2 = {object}. 
Der sache nannte <parameter 1>, dessen art <parameter 2> ist, ist falsch. 
    Parameter 1 = {name}. 
    Parameter 2 = {object}. 

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

+0

+1। मैं यहां तय नहीं कर सकता। हालांकि मैं उन्हें आपकी बात समझाने की कोशिश करूंगा। – ereOn

+0

@paxdiablo: मुझे वास्तविक दुनिया के उदाहरण में दिलचस्पी होगी क्योंकि मैं ऐसे मामले के बारे में नहीं सोच सकता जहां यह काम नहीं करेगा (अर्थपूर्ण शब्दों/पहचानकर्ताओं को वाक्य में स्लॉट करने के लिए दिया गया है)। मैंने वास्तव में इस तरह से सॉफ्टवेयर लिखा है ताकि यदि आप विधि की चेतावनियों को इंगित कर सकते हैं, तो कृपया करें। –

+2

@ कोनराड रुडॉल्फ: ऐसी स्थिति जहां एक व्याकरणिक वस्तु एक भाषा में दो में विभाजित होती है लेकिन दूसरे में नहीं। उदाहरण के लिए 'printf ("I% s know", iKnow? "": "Do not");' फ्रांसीसी समकक्ष "मुझे पता है" और "मुझे नहीं पता" "जे सैस" और "जे ne sais pas "। ऋणात्मक टेम्पलेट फिट नहीं होगा जो अंग्रेजी के लिए ठीक काम करता है। – JeremyP

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