2010-02-23 9 views
10

अब तक केवल 2 अच्छी चीजें जिन्हें मैंने सरणी के बजाय गेटटेक्स्ट का उपयोग करने के बारे में देखा है, मुझे यह है कि मुझे "ग्रीटिंग" "उप-सरणी" (या जिसे भी कहा जाता है) बनाना नहीं है। और मुझे "डिफ़ॉल्ट भाषा" के लिए फ़ोल्डर बनाने की ज़रूरत नहीं है।बहुभाषी वेबसाइटों में PHP गेटटेक्स्ट एक्सटेंशन बनाम PHP Arrays का उपयोग करना?

बहुभाषी वेबसाइटों के लिए गेटटेक्स्ट और PHP एरे का उपयोग करने के अन्य पेशेवर और क्या हैं?

का उपयोग gettext:

स्पेनिश/messages.po:

#: test.php:3 
msgid "Hello World!" 
msgstr "Hola Mundo" 

index.php:

<?php echo _("Hello World!"); ?> 

index.php lang = स्पेनिश:

<?php echo _("Hello World!"); ?> turns to Hola Mundo 

का उपयोग कर PHP सरणियों:

lang.en.php

<?php 
$lang = array(
    "greeting" => "Hello World", 
); 
?> 

lang.es.php

<?php 
$lang = array(
    "greeting" => "Hola Mundo", 
); 
?> 

index.php:

<?php echo $lang['greeting']; ?> greeting turns to Hello World 

index.php lang = स्पेनिश

<?php echo $lang['greeting']; ?> greeting turns to Hola Mundo 

(मैं पहली बार gettext के साथ शुरू किया, लेकिन यह मेरी साझा मुक्त होस्टिंग Zymic में समर्थित नहीं किया गया था। मैं ज़ेंड_ट्रांसलेट का उपयोग नहीं करना चाहता था, मुझे अपने सरल कार्य के लिए यह बहुत जटिल पाया गया, इसलिए मैंने अंततः php define का उपयोग करके समाप्त कर दिया, लेकिन बाद में किसी ने मुझे बताया कि मुझे सरणी का उपयोग करना चाहिए)

उत्तर

7

जीएनयू गेटटेक्स्ट का उपयोग करके आप प्लेफहोल्डर्स जैसे प्रिंटफ और अंतरराष्ट्रीय बहुवचन रूपों के लिए समर्थन प्राप्त करते हैं। प्लेसहोल्डर्स ऑर्डर को अनुवाद या छोड़ा जा सकता है।पीएचपी प्रलेखन से

उदाहरण:


<?php 
setlocale(LC_ALL, 'cs_CZ'); 
printf(ngettext("%d window", "%d windows", 1), 1); // gives "1 okno" 
printf(ngettext("%d window", "%d windows", 2), 2); // gives "2 okna" 
printf(ngettext("%d window", "%d windows", 5), 5); // gives "5 oke" 
?> 

एक और समर्थक है कि आप के रूप में @middus द्वारा बताया शब्दावली प्रबंधन, अनुवाद स्मृति और मशीन अनुवाद के लिए मानक उपकरण का उपयोग कर सकते हैं।

साझा वातावरण के लिए Danilo Segan से एक महान php-gettext library है।

+0

आप सरणियों का उपयोग कर रहे, तब भी आप printf का उपयोग कर pladeholders उपयोग कर सकते हैं और अधिक विस्तार, है ना? (आपके पास बहुवचन रूप नहीं हैं, हालांकि) – middus

+0

हाँ आप कर सकते हैं। :) –

+0

PHP का अपना गेटटेक्स्ट कम से कम mod_php के साथ वास्तव में flaky है। न केवल कैशिंग समस्या बल्कि कुछ ताज़ा करने पर अनुवाद सिर्फ काम नहीं करते हैं। तो प्रतिस्थापन में लगभग एक बूंद है: [php-gettext] (https://launchpad.net/php-gettext/) 'setlocale' के बजाय उपयोग करना बेहद आसान है जिसका उपयोग आप' _setlocale' 'करते हैं और इसी तरह ... – Ciantic

4

मेरी राय में यह नहीं बनाता है php जैसे गतिशील भाषा के लिए एक बाइनरी प्रारूप (gettext की .mo फ़ाइलें) का उपयोग करने के लिए बहुत अधिक समझ है।

हालांकि, गेटटेक्स्ट का एक समर्थक उपकरण के विशाल पारिस्थितिक तंत्र का अस्तित्व है जो आपके सॉफ़्टवेयर के अनुवादक उपयोग करने में सक्षम हैं (उदा। Poedit)। डाउनसाइड यह है कि आप इसे अपने .po को .mo पर संकलित करने से पहले संकलित करते हैं, जबकि आप फ्लाई पर एक सरणी वाली एक php फ़ाइल को प्रतिस्थापित कर सकते हैं।

एक और con है, जैसा कि आप पहले से ही पहचाना है, यह php के सभी इंस्टॉलेशन पर उपलब्ध नहीं है।

5

गेटटेक्स्ट() का उपयोग करने के लिए सबसे स्पष्ट समर्थक निश्चित रूप से स्रोत स्ट्रिंग को स्थित है जहां यह संबंधित है। अर्थात। यह

echo _("This is a string"); 

की तुलना में इस

echo $lang['a_string']; 

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

+0

@tobefound मैं आपके साथ सहमत हूं, लेकिन मुझे echo $ lang ['a_string'] का उपयोग करने के 2 पेशेवर मिले; (वास्तव में अब मैंने एल ('string_a);): 1. का उपयोग किया है क्योंकि सामग्री इंडेक्स पेज के बाहर है क्योंकि कोड अधिक पठनीय और कॉम्पैक्ट दिखता है। 2. यदि मैं वेब पेज की पूरी सामग्री का अनुवाद करना चाहता हूं तो मैं सामग्री को एक अनुवादक में पेस्ट कर सकता हूं (क्योंकि lang.php में केवल वाक्यांश और शब्द होते हैं। – alexchenco

8

मैं gettext का उपयोग करने की सलाह देता हूं, मैं अच्छे परिणामों के साथ 5 वर्षों के लिए PHP में ऐसा कर रहा हूं।

सबसे पहले यदि आप echo _('my text to translate') का उपयोग करते हैं और इसके लिए कोई अनुवाद नहीं है, तो आप आउटपुट में मूल स्ट्रिंग देखेंगे, जो कि अच्छा है। echo $translation['were is my translation'] जैसे सरणी का उपयोग करना और कोई भी नहीं है, आप कुछ भी नहीं देखेंगे। लेकिन सावधानी बरतें और echo _(''); कर रहे हैं, यह एक अच्छा विचार नहीं है, poedit परियोजना की जानकारी के लिए msgid "" का उपयोग करता है, जो अधिकतर आप अपने दर्शकों को नहीं दिखाना चाहते हैं, इसलिए किसी को खाली तारों का अनुवाद करने की कोशिश नहीं करना चाहिए :)

इसके अलावा यह बहुत तेज है और इसमें बहुवचन और सामान के लिए कुछ अतिरिक्त सुविधाएं हैं, उदाहरण के लिए poedit भी अनुवाद डीबी होने से जीवन को आसान बनाता है, इसलिए आपको एक ही सामान का बार-बार अनुवाद नहीं करना चाहिए, जो आप पहले से ही करेंगे prefilled और चिह्नित करें "जांचें कि यह सही है"। बहुत ही आराम से।

थीबी मिडस ने डाउनसाइड का उल्लेख किया है कि आपको पीओ फ़ाइल को संकलित करना होगा, जबकि आप सरणी का उपयोग करते समय एक php-file को आसानी से ओवरराइट कर सकते हैं - अच्छी तरह से आप अपनी मो फ़ाइल को भी ओवरराइट करते हैं, और यदि poedit का उपयोग करते हैं, तो यह संकलन के बाद संकलन करता है फ़ाइल। तो वास्तव में आप एक php-file संपादित करने के साथ फ़ाइल को सहेजते हैं और कॉपी करते हैं।

लेकिन यदि आप mod_php का उपयोग करते हैं, तो वास्तविक नकारात्मकता है। ध्यान रखें कि mod_php के साथ यह थ्रेडसेफ नहीं है, हालांकि मुझे कभी भी कोई कठिनाई नहीं थी।

यह अधिकतर है कि आपको mod_php का उपयोग करते समय अपने अपाचे को पुनरारंभ करना होगा या आपकी gettext कॉल विफल हो जाएंगी (कभी-कभी कोई अनुवाद नहीं लौटाया जाता है, कभी-कभी आप बिना किसी सामग्री के प्यारे सफेद पृष्ठ के साथ समाप्त होते हैं)। लेकिन mod_itk जैसे कुछ का उपयोग करके (मुझे विश्वास है कि सीजीआई/फास्टसीजी इसे कर सकता है) आपको इस समस्या को और भी नहीं मिला है।

-1

उपयोगकर्ता ड्रॉप-डाउन से किसी भी भाषा का चयन करता है या किसी भी क्षेत्र तो सत्र में की तरह चयनित भाषा आईडी सहेजते हैं,

$ _SESSION [ 'भाषा'] = 1;

अब सत्र में संग्रहीत भाषा आईडी के आधार पर डेटाबेस तालिका 'सामग्री' से डेटा प्राप्त करें।

यहाँ

http://skillrow.com/multilingual-website-in-php-2/

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