2012-05-07 21 views
6

मैं कुछ स्ट्रिंग्स का अनुवाद करने के लिए PHP gettext एक्सटेंशन का उपयोग करने का प्रयास कर रहा हूं। सभी फ़ंक्शन सही मान वापस करने के लिए प्रतीत होते हैं लेकिन gettext()/_() पर कॉल करने से केवल मूल स्ट्रिंग लौटाती है। पीओ/एमओ फाइलें सही लगती हैं और मेरा मानना ​​है कि मैंने निर्देशिकाओं को सही तरीके से सेट किया है। मैं विंडोज़ पर PHP 5.3.10 के साथ WAMP सर्वर चला रहा हूं (5.3.4 और 5.3.8 चलाने की भी कोशिश की क्योंकि मेरे पास इंस्टॉलेशन हैं)।PHP गेटटेक्स्ट - कोई अनुवाद नहीं

सबसे पहले, /new2/www/index.php देखें:

$locale = 'esn'; # returns Spanish_Spain.1252 in var dump 

putenv("LC_ALL={$locale}"); // Returns TRUE 
setlocale(LC_ALL, $locale); // Returns 'Spanish_Spain.1252' 

$domain = 'messages'; 
bindtextdomain($domain, './locale'); // Returns C:\wamp\www\new2\www\locale 
bind_textdomain_codeset($domain, 'UTF-8'); // Returns UTF-8 
textdomain($domain); // Returns'messages' 

print gettext("In the dashboard"); // Prints the original text, not the translation. 
exit; 

मैं निम्नलिखित फ़ाइल संरचना बनाई है: es_ES, esn, esp, Spanish, और Spanish_Spain:

www/new2/www/locale/Spanish_Spain.1252/LC_MESSAGES/messages.mo 

मैं भी साथ Spanish_Spain.1252 की जगह की कोशिश की है।

पीओ एमओ उत्पन्न करने के लिए इस्तेमाल किया फ़ाइल की तरह तो (केवल प्रासंगिक प्रविष्टि दी गयी है) है:

#: C:\wamp\www\new2/www/index.php:76 
msgid "In the dashboard" 
msgstr "TRANSLATED es_ES DASHBOARD" 

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

किसी भी मदद की सराहना की जाएगी।

संपादित: निर्देशिका संरचना में संशोधन किया। नोट - 24hrs के भीतर हाल के उत्तरों का प्रयास करने में सक्षम हो जाएगा।

+0

क्या आपका लोकेल और निर्देशिका 'es_ES.UTF-8' नहीं होनी चाहिए? – mario

+0

@ मारियो मैंने उस लोकेल और निर्देशिका को आजमाया है लेकिन 'setlocale()' फिर गलत लौटाता है। – Pete171

उत्तर

1

देखो here। यह मेरे लिए खिड़कियों और लिनक्स पर भी काम करता है। सरणी में अंतिम मान विंडोज़ के लिए काम करता है। भाषाओं के नामों की सूची here मिल सकती है। मेरे कैटलॉग में

./locales/en/LC_MESSAGES/domain.mo 
     /cs/LC_MESSAGES/domain.mo 
+0

@ Fanda मैंने विंडोज लोकेल नामों का उपयोग करने की कोशिश की है ('esn' और 'esp' सहित - मेरे प्रश्न में)। मैंने आपके द्वारा लिंक किए गए पोस्ट से सीधे कई उदाहरणों की कोशिश की है, लोकेल को 'सरणी' ('de_DE.UTF-8', 'de_DE', 'de', 'german') पर सेट किया है। मैंने इन मानों में से प्रत्येक के लिए 'लोकेल/[VALUE-FROM-ARRAY]/LC_MESSAGES/messages.mo' फ़ाइल बनाई और फिर से प्रयास करने से पहले अपाचे को पुनरारंभ किया - कोई भाग्य नहीं। हालांकि, सभी कार्य सही ढंग से लौट रहे हैं। कोई और सुझाव? – Pete171

+0

क्या आपने लैंग सबडिर को 2 अक्षर कोड में बदलने का प्रयास किया था? (लोकेशंस/डी/एलसी ...? – Fanda

+0

@FandaYes, मेरे पास है। कोई भाग्य नहीं। – Pete171

0

समस्या भी है जब आप अपने * .po और * .mo फ़ाइलों बदलते हैं, तो पुनः आरंभ अपाचे सर्वर करने के लिए है कि हो सकता है। यह समस्या हो सकती है, इसलिए आप वर्कअराउंड का उपयोग कर सकते हैं - हमेशा इन फ़ाइलों का नाम किसी नए नाम पर बदलें और उन्हें पुनः लोड किया जाएगा।

+0

@jasir कृपया मेरा मूल प्रश्न पढ़ें; जब भी मेरी .MO फ़ाइलें बदल गई हैं, मैंने अपाचे को पुनरारंभ किया है। धन्यवाद। – Pete171

2

एक सुझाव: यदि आप mo फ़ाइल के लिए पूर्ण वातावरण पड़ सकता है। यह शायद स्पेनिश_Spain.UTF8 या esn_esn.UTF8 या esn_esp.UTF8 है (1252 नहीं, जैसा कि आप कोड आधार बदलते हैं)।

क्या निर्देशिका यह की तलाश में ट्रैक करने के लिए, आप प्रक्रिया मॉनिटर (http://technet.microsoft.com/en-us/sysinternals/bb896645) स्थापित कर सकते हैं। यह जानकारी पर बाल्टी लोड को बाहर निकाल देता है, लेकिन आपको यह पता लगाने में सक्षम होना चाहिए कि कौन सी फ़ाइल/निर्देशिका की तलाश की जा रही है।

(मेरे दूसरे सोचा फाइल अनुमति जाँच करने के लिए है - लेकिन आप पहले से ही Zend_Translate में कुछ इसी तरह है, तो शायद नहीं कारण है, लेकिन वैसे भी जाँच के लायक था)।

क्षमा करें अगर अच्छा नहीं है - लेकिन आपको एक सुराग दे सकता है।

+0

धन्यवाद - मुझे बाद में प्रक्रिया मॉनीटर पर एक नज़र डालेंगी और देखें कि यह मेरी मदद करता है। मैं वही हो सकता हूं जो मैं ढूंढ रहा हूं। – Pete171

3

मैं यह मेरा XAMPP उदाहरण पर की स्थापना की और यह पता लगा।

  • फ़्लैट आउट सेटलोकेल विंडोज पर काम नहीं करता है, तो यह जो भी लौटाता है वह अप्रासंगिक है।
  • Windows के लिए आप मानक भाषा/देश कोड (इस मामले es_ES स्पेनिश के रूप में स्पेन में बोली जाती है)
  • का उपयोग कर अपने स्थान निर्देशिका के तहत बनाने es_ES/LC_MESSAGES/स्थानीय निर्धारित किया है। यह जहां आपकी Message.mo फ़ाइल रहता है।

    $locale = 'es_ES'; 
    
    putenv("LC_ALL={$locale}"); // Returns TRUE 
    
    $domain = 'messages'; 
    bindtextdomain($domain, './locale'); 
    bind_textdomain_codeset($domain, 'UTF-8'); 
    textdomain($domain); // Returns'messages' 
    
    print gettext("In the dashboard"); 
    exit; 
    

मैं अगर यह एक अलग कर दिया, लेकिन जब पो फ़ाइल बनाने मैं दो बातें किया था यकीन नहीं है। फ़ाइल के तहत poEdit में -> प्राथमिकताएं मैंने लाइन अंत में प्रारूप को विंडोज़ में बदल दिया। और जब मैंने पीओएडिट के साथ प्रारंभिक पीओ बनाया, मैंने नोटपैड ++ में फाइल खोली और एन्कोडिंग प्रकार को यूटीएफ -8 में बदल दिया क्योंकि पीओईडीआईटी ने ऐसा नहीं किया।

मुझे आशा है कि कम से कम आपको सही दिशा में इंगित करें।

संदर्भ

PHP Localization Tutorial on Windows

Country Codes

Language Codes

1

मैं विंडोज पर gettext उपयोग करने की कोशिश कभी नहीं किया है, लेकिन हर बार मैं Linux सिस्टम पर gettext के साथ समस्या नहीं थी, कारण था कि एक उचित भाषा पैक स्थापित नहीं किया गया था।

3

आपका कोड bindtextdomain से वापसी मान के रूप में यह उल्लेख है:

C:\wamp\www\new2\www\locale 
Spanish_Spain.1252 की setlocale और messages की textdomain साथ

, इस रास्ते में दिखेगा gettext करने के लिए कॉल:

C:\wamp\www\new2\www\locale\Spanish_Spain.1252\LC_MESSAGES\messages.mo 

लेकिन आप फ़ाइल संरचना बनाई:

www/new2/locale/Spanish_Spain.1252/LC_MESSAGES/messages.mo 
     ^^ 
     www/ missing here 

संपादित करें

ठीक है, इसलिए इससे मदद नहीं मिली। मैं आप की तरह विंडोज पर एक परीक्षण स्क्रिप्ट और poedit का उपयोग कर बना लिया है:

$locale = "Dutch_Netherlands.1252"; 
putenv("LC_ALL=$locale"); // 'true' 
setlocale(LC_ALL, $locale); // 'Dutch_Netherlands.1252' 
bindtextdomain("messages", "./locale"); // 'D:\work\so\l10n\locale' 
textdomain("messages"); // 'messages' 

echo _("Hello world"); // 'Hallo wereld' 

मेरे फ़ोल्डर संरचना इस तरह है:

D:\work\so\l10n\ 
    \locale\Dutch_Netherlands.1252\LC_MESSAGES\messages.mo 
    \locale\Dutch_Netherlands.1252\LC_MESSAGES\messages.po 
    \test.php 

, आशा है कि यह मदद करता है, हालांकि यह तुम्हारा के लगभग समान लग रहा है। कुछ बातें मैं ऑनलाइन पाया:

  • यह, चरित्र पुलिस फाइल स्थानीयकरण फाइल के अंदर
  • रिक्त स्थान में स्थापित एक UTF8 विकल्प हो सकता है स्थापित करने के लिए इतना कुंजी लुकअप ऐसा न करने से सावधान रहना जरूरी है। सबसे पहले परीक्षण करने की सबसे अच्छी चीज रिक्त स्थान के बिना कुंजी है।
+0

अहह, मुझे खेद है - मैंने गलत तरीके से इसकी प्रतिलिपि बनाई है। मैंने वास्तव में 'सी: \ वैंप \ www \ new2 \ www \ locale \ Spanish ... 'आदि बनाया है। मैं अब अपना प्रश्न संशोधित करूंगा। हालांकि, यह जानने के लिए धन्यवाद! – Pete171

+0

@ पीट 171 मैंने अपना जवाब अपडेट कर लिया है, एक नज़र डालें। –