2009-11-20 10 views
11

PHP में (या शायद सामान्य रूप से गेटटेक्स्ट) में, जब यह गतिशील सामग्री को चर दिखाता है तो gettext क्या करता है?गेटटेक्स्ट गतिशील सामग्री को कैसे प्रबंधित करता है?

मेरे मन में 2 मामले हैं।

1) मान लें कि मेरे पास <?=$user1?> poked John <?=$user2?> है। शायद कुछ भाषा में शब्दों का क्रम अलग है। गेटटेक्स्ट को कैसे संभालता है? (नहीं, मैं फेसबुक नहीं बना रहा हूं, यह सिर्फ एक उदाहरण था)

2) मान लीजिए कि मैं डेटाबेस में कुछ श्रेणियां संग्रहीत करता हूं। वे शायद ही कभी, लेकिन वे एक डेटाबेस में स्टोर कर रहे हैं। अगर मैं <?php echo gettext($data['name']); ?> करता हूं तो क्या होगा? मैं अनुवादकों को उन श्रेणी के नामों का भी अनुवाद करना चाहता हूं, लेकिन क्या इसे डेटाबेस में ही किया जाना है?

धन्यवाद

+1

इस प्रश्न के पाठकों को "gettext .po फ़ाइलों में आदेशित चर निर्दिष्ट करने के तरीके" में रुचि हो सकती है: http://stackoverflow.com/questions/13979962/how-to -स्पेसिटी-ऑर्डर-वेरिएबल्स-इन-गेटटेक्स्ट-पीओ-फाइल – Ryan

उत्तर

19

आपका सबसे अच्छा विकल्प spritf() फ़ंक्शन का उपयोग करें। फिर आप अपने तारों में गतिशील सामग्री को संभालने के लिए printf नोटेशन का उपयोग करेंगे।

%s poked %s 

इनपुट कौन क्या तुम करोगी:

function translate() 
{ 
    $args = func_get_args(); 
    $num = func_num_args(); 
    $args[0] = gettext($args[0]); 

    if($num <= 1) 
     return $args[0]; 

    return call_user_func_array('sprintf', $args); 

} 

अब उदाहरण 1 के लिए, आप के लिए स्ट्रिंग बदलना चाहते हैं: यहाँ एक समारोह मैं यहाँ कुछ समय पहले पर पाया आप के लिए आसानी से इस संभाल करने के लिए है इस तरह का अनुवाद() फ़ंक्शन में:

<?php echo translate('%s poked %s', $user1, $user2); ?> 

आप पार्स आउट कर सभी PoEdit साथ का अनुवाद() फ़ंक्शन होगा। और उसके बाद % s स्ट्रिंग प्लेसहोल्डर्स को संशोधित किए बिना, जो भी भाषा आप चाहते थे, में "% s poked% s" स्ट्रिंग का अनुवाद करें। वे क्रमशः उपयोगकर्ता 1 और उपयोगकर्ता 2 के साथ अनुवाद() फ़ंक्शन द्वारा आउटपुट पर प्रतिस्थापित होंगे। आप अधिक उन्नत उपयोग के लिए PHP मैनुअल में sprintf() पर और अधिक पढ़ सकते हैं।

समस्या # 2 के लिए। आपको एक स्थिर फ़ाइल बनाने की आवश्यकता होगी जो poEdit श्रेणी नामों को पार्स कर सकता है। उदाहरण के लिए "misctranslations.php":

<?php 

_('Cars'); 
_('Trains'); 
_('Airplanes'); 

फिर poedit पार्स misctranslations.php है। इसके बाद आप <?php echo gettext($data['name']); ?>

+4

केस 1 को अधिक आसानी से संभाला जा सकता है: ' '। आपको एक अतिरिक्त फ़ंक्शन की आवश्यकता नहीं है और poedit अभी भी स्ट्रिंग को किसी अन्य की तरह ठीक कर देगा। – DanMan

+1

यदि आप "% s poked% s" का अनुवाद कर रहे हैं, तो आप दोनों उपयोगकर्ताओं के नाम कैसे स्वैप कर सकते हैं जब वे दोनों एक ही प्लेसहोल्डर के साथ चिह्नित होते हैं? कुछ भाषाओं में विषय वस्तु से पहले चला जाता है। – bdsl

4

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

मैं वास्तव में इस बारे में एक लेख लिख रहा हूँ, लेकिन मेरे प्रस्तावित जवाब कुछ इस तरह चला जाता है:

gettext कि स्ट्रिंग में प्रकट होता है आप लाइन नंबर स्टोर करने के लिए अनुमति देता है .po फ़ाइल के अंदर कोड। यदि आप स्ट्रिंग को पूरी तरह बदलते हैं, तो .po संपादक को पता चलेगा कि स्ट्रिंग नया नहीं है लेकिन यह पुराना है (लाइन नंबर के लिए धन्यवाद)।

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

बेशक वहाँ नए और अधिक बुद्धिमान .po संपादक हो सकते हैं लेकिन कम से कम अगर आपका नया तारों के साथ आपको परेशानी दे रहा है तो यह उन्हें हल करेगा।

मेरे 2 सेंट।

1

@Julian

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

मुझे लगता है कि अनुवाद आईडी बदलने के प्रबंधन का एकमात्र बुद्धिमान तरीका आपकी .po-file में समान आईडी खोजने का प्रयास करेगा। संपादक मौजूदा अनुवाद के साथ नए अनुवाद पाठ को विलय करने के लिए एक सुझाव दिखा सकता है, यदि वे बहुत समान हैं और आपके कोड में सहेजी गई पंक्ति संख्या में कोई अनुवाद स्ट्रिंग नहीं है।

1

यदि आपके पास कहीं भी आपके कोड में है: <?=sprintf(_('%s poked %s'), $user1, $user2)?> और आपकी भाषाओं में से एक को तर्कों को स्वैप करने की आवश्यकता है, यह बहुत आसान है। बस इस तरह अपना कोड अनुवाद करें: msgid "%s poked %s" msgstr "%2$s translation_of_poked %1$s"

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