2013-06-14 5 views
5

मैं यहाँ BryanH के जवाब से निर्देशों का पालन कर रहा हूँ: gettext() equivalent in Intl library? और php-intl साथ स्थानीयकरण (अनुवाद) को लागू करने की कोशिश कर, लेकिन मैं एक ही समस्या इस व्यक्ति था बार आ रही है: ResourceBundle returns NULL without any errors being raisedमैं PHP में उपयोग के लिए आईसीयू संसाधन फ़ाइलों को कैसे बना सकता हूं?

उन्होंने उल्लेख किया है कि वह Dat फ़ाइलें बनाई एक टूल के साथ (जिसे मैं समझ नहीं सकता कि कैसे काम करना है) जबकि पूर्व उत्तर में व्यक्ति बस एक .res एक्सटेंशन के साथ txt फ़ाइलों का उपयोग कर रहा है।

मैं php-intl और संसाधन बंडल के साथ स्थानीयकरण को सही ढंग से कैसे कार्यान्वित कर सकता हूं, और मैं गलत क्या कर रहा हूं?

लक्ष्य तो मैं

$t = new Translator(); 
$t->setResource(new \ResourceBundle('es', 'locales_folder/')); 
$t->echo("somestring"); // "el stringo" 

..much की तरह पहले उत्तर में व्यक्ति था के लिए इसी तरह कुछ कर सकते हैं अलग-अलग भाषाओं के साथ विभिन्न डेटा फ़ाइलों है। साथ ही, इसका उद्देश्य आसानी से संपादन योग्य फाइलें रखना है, इसलिए मैं उन्हें फिक्सेस, अपडेट आदि के लिए अनुवादकों को दे सकता हूं। मुझे एहसास है कि मैं आसानी से एक साधारण पाठ फ़ाइल के माध्यम से कस्टम समाधान के साथ ऐसा कर सकता हूं जो पहले अनुरोध पर पार्स किया जाता है और मेमकैच में सहेजा जाता है, जहां यह तब रहता है और .dat फ़ाइलों को दोबारा पढ़ने के बिना सेवा करता है, लेकिन मैं बल्कि यहां सुझाए गए मार्ग को लें।

संपादित करें: बस इसे बाहर निकालने के लिए - मैंने गेटटेक्स्ट सफलतापूर्वक एक ही चीज़ लागू की और यह आसान था - एक बग के लिए सहेजें जो लिनक्स सिस्टम (http://www.php.net/manual/en/book.gettext.php#91187) में बनी रहती है - लेकिन मैं और अधिक पर भरोसा करना चाहता हूं यदि संभव हो तो आधुनिक और समस्त समावेशी अंतर एक्सटेंशन।

उत्तर

9

मैं कैसे बना सकते हैं और intl PHP एक्सटेंशन के लिए .res फ़ाइलों का उपयोग करने के बारे में अपने प्रश्न के लिए एक समाधान प्रदान कर सकते हैं, हालांकि मैं गति के साथ कोई अनुभव नहीं है और उत्पादन प्रणालियों में उपयोग करते हैं, आप खुद के लिए देखने के लिए हो सकता है अगर होगा gettext के लिए एक प्रतिस्थापन।

मेरी राय में gettext का एक बड़ा लाभ xgettext जैसे अतिरिक्त टूल हैं जो अनुवाद करने के लिए स्ट्रिंग निकाल सकते हैं। फिर भी, संसाधनों का उपयोग आपके उपयोग-मामले में अधिक उपयोगी हो सकता है।

.res फ़ाइल उत्पन्न करने के लिए आपको प्रोग्राम genrb का उपयोग करने की आवश्यकता है जो bundled with ICU है। (उदाहरण के लिए उपयोग करते समय पर OSX आईसीयू स्थापित करने brew install icu4c (see this tutorial) आप /usr/local/Cellar/icu4c/*/bin/genrb पर उपकरण प्राप्त कर सकते हैं (संस्करण संख्या के साथ * की जगह))

इसके बाद आप प्रत्येक स्थान के लिए एक फ़ाइल तैयार करते हैं। आइए इस उदाहरण में जर्मन और स्पेनिश में दो भाषाओं के लिए ऐसा करते हैं।

$ cat de.txt 
de { 
    hello { "Hallo" } 
} 

$ cat es.txt 
es { 
    hello { "Hola" } 
} 

$ genrb *.txt 
genrb number of files: 2 

अब आप 2 अतिरिक्त फ़ाइलें de.res और es.res, जो आप अब पीएचपी

<?php 
foreach (array("de", "es") as $locale) { 
    $r = ResourceBundle::create($locale, __DIR__); 
    echo $r["hello"], "\n"; 
} 

में उपयोग कर सकते हैं उत्पादन

Hallo 
Hola 

तो संक्षेप में, आप उन *.txt हाथ कर सकते हैं जो है अपने अनुवादकों को फाइलें और उन्हें genrb का उपयोग करके PHP के लिए तैयार करें।

अंत में, वर्ग के लिए एक छोटा सा उदाहरण आप लिखने की कोशिश कर रहे थे:

<?php 
class Translator { 
    private $resourceBundle = null; 

    public function __construct(\ResourceBundle $r) { 
     $this->resourceBundle = $r; 
    } 

    public function __get($string) { 
     return $this->resourceBundle[$string]; 
    } 
} 
$t = new Translator(new \ResourceBundle('es', __DIR__)); 
echo $t->hello; 
+0

धन्यवाद, कि करेंगे। चूंकि इसे थ्रेड सुरक्षित माना जाता है, इसलिए मुझे लगता है कि यह वह समाधान है जिसे मैं ढूंढ रहा था। अब मुझे बस अपना स्वयं का स्ट्रिंग निकालने वाला लिखना होगा और इसे काम करना चाहिए। – Swader

+1

यदि आप अपने स्ट्रिंग एक्स्ट्रैक्टर के साथ भी अनुभव कर सकते हैं तो यह बहुत उपयोगी होगा (शायद आप इसे स्रोत भी खोल सकते हैं?)। अग्रिम में धन्यवाद! – akirk

+0

चूंकि गेटेट गेटटेक्स्ट के लिए स्वतः निकाला जा सकता है, इसलिए मुझे लगा कि मैं इसे $ t -> _ ($ string) की तरह देखने के लिए एक और पैटर्न दे सकता हूं, जो तब उन स्ट्रिंग्स के लिए .mo और .po फाइलें बनायेगा। मुझे बस इतना करना होगा कि एक ऐसा टूल लिखें जो उन्हें आरईएस प्रारूप में परिवर्तित करता है, जो काफी आसान लगता है। मैं पूरी परीक्षा के बारे में एक ब्लॉग पोस्ट लिखूंगा और इसे यहां लिंक करूंगा। – Swader

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