2009-09-12 19 views
23

प्रश्न के बजाय एक नया सवाल बनाने का अपडेट किया गया ...PHP में भाषा फ़ाइल करने का सबसे प्रभावी तरीका?

मैं वास्तव में, यह मेरी पहली बार किसी भी तरह का कर रही होगी कुछ वैकल्पिक भाषाओं अन्य तो अंग्रेजी मेरे सामाजिक नेटवर्क साइट पर मैं निर्माण कर रहा हूँ प्रदान करना चाहते हैं भाषा अनुवाद तो कृपया मेरे साथ भालू।
मैं शोध कर रहा हूं इसलिए मैं अल कान हूं और विचारों के लिए खुला हूं और मेरे पास पहले से ही बहुत सारे प्रश्न हैं।

1)
i18n का क्या मतलब है, मैं इसे अक्सर देखते हैं जब इतने पर भाषा अनुवाद शोध?

2)
अधिकांश लोगों का कहना है कि उपयोग gettext पीएचपी इसके लिए एक विस्तार या समर्थन हासिल है,
अच्छी तरह से मैं इसे शोध किया गया है और मैं इसके बारे में एक बुनियादी समझ है, जहाँ तक मैं यह बता सकते हैं कि एक है इस मार्ग पर जाने के लिए बहुत सारे अतिरिक्त काम,
मेरा मतलब है कि मेरी साइट को इसके कार्यों का उपयोग करने के लिए कोडिंग यानी; _ ('हैलो वर्ल्ड मैं अब अंग्रेजी में हूं') या अन्य गेटटेक्स्ट ('हैलो वर्ल्ड मैं अब अंग्रेजी में हूं') कोई समस्या नहीं है क्योंकि मुझे जाने वाले किसी भी रूट की आवश्यकता होगी।
लेकिन फिर आपको अपने सर्वर पर गेटटेक्स्ट इंस्टॉल करना होगा और इसे काम करना होगा,
फिर विशेष फाइल बनाने और उन्हें संकलित करने के लिए कुछ विशेष संपादकों का उपयोग करें।

दर्द की तरह लगता है, मुझे लगता है कि यह जाने का सबसे अच्छा मार्ग माना जाता है, ठीक है हर कोई ऐसा कहता है।
तो क्या कोई मुझे बता सकता है कि यह जाने का मार्ग क्यों है?

3)
मैं वास्तव में इस दृष्टिकोण की सादगी, बस एक भाषा सरणी के निर्माण और वाक्यांश आप नीचे दिए गए उदाहरण की तरह एक समारोह में की जरूरत है बुला की तरह, आप तो बस उपयुक्त भाषा के साथ एक फ़ाइल को शामिल किया जाएगा सरणी।

मैं वास्तव में क्या जानना चाहता हूं, क्या यह गेटटेक्स्ट का उपयोग करने की तुलना में उच्च ट्रैफ़िक और काफी बड़ी साइट पर कम बेहतर प्रदर्शन विधि होगी और यदि आप कृपया क्यों समझा सकते हैं?

<?PHP 
//Have seperate language files for each language I add, this would be english file 
function lang($phrase){ 
    static $lang = array(
     'NO_PHOTO' => 'No photo\'s available', 
     'NEW_MEMBER' => 'This user is new' 
    ); 
    return $lang[$phrase]; 
} 
//Then in application where there is text from the site and not from users I would do something like this 
echo lang('NO_PHOTO'); // No photo's available would show here 
?> 

* कुछ नीचे

+0

आप जानते हैं कि आपको सरणी में _ का उपयोग करने की आवश्यकता नहीं है, लेकिन हां, आपको शायद स्वयं को रोल करने के बजाय PHP एक्सटेंशन का उपयोग करना चाहिए। – SeanJA

उत्तर

6

पहिया को पुन: पेश न करें। उदाहरण के लिए gettext या Zend_Translate का उपयोग करें।

+8

लेकिन पहिया वर्ग है! – srcspider

+12

-1। क्यूं कर? चूंकि "पहिया को पुन: पेश न करें" का अत्यधिक दुर्व्यवहार किया जाता है, मेरे लिए वाक्यांश का अर्थ है कि कुछ ऐसा पहले से आदर्श करने के बजाय, इसका उपयोग करें! नहीं, हे, कुछ दोस्त ने एक पुस्तकालय बनाया जो गधे को मारता है, हम वास्तव में परवाह नहीं करते कि आपको यह पसंद नहीं है (बहुत जटिल) या जो भी हो। – John

+0

v1 ढांचे के उपयोग के लिए Zend_Translate लिंक पुराना है [यह लिंक] (http://framework.zend.com/manual/1.12/en/zend.translate.html) और v2 ढांचे के उपयोग के लिए [यह एक] (http://framework.zend.com/manual/current/en/modules/zend.i18n.translating.html)। –

5

brianreavis के जवाब से इस्तेमाल किया अपनी खुद की भाषा ढांचा न लिखें कोड। gettext का प्रयोग करें। PHP में मानक bindings है जिसे आप इंस्टॉल कर सकते हैं।

+0

मैंने इसे पोस्ट करने से पहले गेटटेक्स्ट पेज इयरलीर पर अभी देखा है, मैं वास्तव में यह नहीं समझ सकता कि यह संक्षेप में कैसे काम करता है, क्या आप इसके बारे में कुछ समझ सकते हैं? – JasonDavis

+0

जेसॉन्डाविस: यह वही करता है जो आप करने का प्रयास कर रहे हैं और अधिक। जब आप इसे इंस्टॉल करते हैं, तो आप अपनी भाषा अनुवाद फ़ाइल (".po") रखने के लिए कहीं भी चुनते हैं। आप इस फाइल में अपने सभी तारों का अनुवाद कर सकते हैं। फिर अपने स्रोत में, आप अपने सभी बहुभाषी तारों को gettext() (या आमतौर पर एक उपनाम, '_()') के साथ लपेटते हैं और यह आपके लिए उस स्ट्रिंग के वर्तमान अनुवाद को खींच देगा। यह बहुवचन वाक्यांशों और कुछ अन्य महत्वपूर्ण विशेषताओं के लिए भी प्रदान करता है जो आपको आवश्यक लगेगा। – Fragsworth

+1

@ भविष्य पाठक, मैं कहूंगा, अगर आपकी वेबसाइट या ऐप सैकड़ों से हजारों शब्दों का उपयोग नहीं करता है, तो एसोसिएटिव सरणी तरीका जा रहा है Gettext से बेहतर है। गेटटेक्स्ट अपने कार्यान्वयन में बेहद पुराना है और डीबग करने के लिए एक दुःस्वप्न हो सकता है। मैंने बस अपने सर्वर पर काम करने के लिए तीन दिन बिताए। इसमें कई मुद्दे हैं और अच्छी तरह से बनाए रखा नहीं है। मेरा विश्वास करो आप अपने कुछ मुद्दों में भाग लेंगे। Php-gettext (gettext एमुलेटर), कुछ अन्य कार्यान्वयन या अपनी खुद की लाइब्रेरी लिखने से बेहतर बंद करें। –

-1

क्यों नहीं तुम सिर्फ यह बहु dimesional सरणी के रूप में इस तरह के इस

<?php 

$lang = array(
    'EN'=> array(
     'NO_PHOTO'=>'No photo\'s avaiable', 
     'NEW_MEMBER'=>'This user is new', 
    ), 
    'MY'=> array(
     'NO_PHOTO'=>'Tiada gambar', 
     'NEW_MEMBER'=>'Ini adalah pengguna baru', 
    ) 
); 

?> 
+11

यह आवश्यक से अधिक स्मृति का उपयोग करेगा --- क्योंकि यह * हर * अनुरोध * प्रत्येक * अनुरोध के लिए लोड हो रहा है। इसे कई फाइलों में तोड़ना और एकल उपयुक्त लोड करना बेहतर होगा। – brianreavis

18

यह शायद सबसे अच्छा होगा एक समारोह है कि अपनी भाषा मानचित्रण संभालती है परिभाषित करने के लिए के रूप में बनाने के ...। इस तरह, यदि आप बदलना चाहते हैं कि यह बाद में कैसे काम करता है, तो आप $lang[...] का उपयोग करने वाले मामलों के लिए सैकड़ों स्क्रिप्ट को फेंकने के लिए मजबूर नहीं होते हैं और उन्हें किसी और चीज़ से प्रतिस्थापित करते हैं।

कुछ इस तरह काम करेंगे और अच्छा & तेज होगा:

function lang($phrase){ 
    static $lang = array(
     'NO_PHOTO' => 'No photo\'s available', 
     'NEW_MEMBER' => 'This user is new' 
    ); 
    return $lang[$phrase]; 
} 

यकीन बनाओ सरणी static समारोह के अंदर घोषित किया जाता है तो यह हर बार समारोह में कहा जाता है पुनः आवंटन प्राप्त करता है। यह विशेष रूप से महत्वपूर्ण है जब $lang वास्तव में बड़ा है। (जैसे en.php, fr.php, आदि) और require() उपयोगकर्ता के लिए उपयुक्त एक

echo lang('NO_PHOTO'); 

कई भाषाओं से निपटने के लिए, बस इस समारोह से अधिक फ़ाइलों में परिभाषित किया गया है:

इसका इस्तेमाल करने के लिए।

+2

एफवाईआई, यह समाधान फ्रैग्सवर्थ के सुझाव से कम है: 'गेटटेक्स्ट'। गेटटेक्स्ट निश्चित रूप से इस तरह की चीज़ के लिए बेहतर मार्ग है। हालांकि, अगर आप अपनी खुद की मूल प्रणाली को रोल करना चाहते हैं तो आप ऐसा करेंगे। – brianreavis

+0

beutifulleeee, ty! – themis

+0

हाय, मुझे समाधान पसंद है! मैं सी # से आया हूं और मुझे संदेह है कि PHP में स्थिर चर कैसे काम करते हैं।जब आप सी # में स्थिर चर घोषित करते हैं, उदाहरण के लिए एक सरणी, यह स्मृति में रखी जाती है और आपको केवल इसे एक बार लोड करने की आवश्यकता होती है और यह मान अलग-अलग उपयोगकर्ता थ्रेड के बीच बनी रहती है। लेकिन PHP में यह प्रत्येक निष्पादन में मूल्य को खो देता है जहां तक ​​मुझे पता है, और यदि आप चीजों को स्मृति में रखना चाहते हैं तो आपको एपीसी जैसे विकल्पों का उपयोग करना होगा। फिर क्यों @brianreavis आप इसे हर समय "पुनः आवंटित" करने के लिए स्थैतिक बनाने की सलाह देते हैं? धन्यवाद! –

10

यह बेहतर काम कर सकते हैं:

function _L($phrase){ 
static $_L = array(
    'NO_PHOTO' => 'No photo\'s available', 
    'NEW_MEMBER' => 'This user is new' 
); 

    return (!array_key_exists($phrase,$_L)) ? $phrase : $_L[$phrase]; 
} 

Thats मैं अब के लिए करते हैं। यदि भाषा नहीं मिली है, तो यह त्रुटि के बजाय वाक्यांश वापस कर देगा।

आपको ध्यान रखना चाहिए कि एक सरणी में ~ 65500 से अधिक आइटम नहीं हो सकते हैं। बस इतना अच्छा होना चाहिए, बस कह रहा है।

यहाँ कुछ कोड है कि मैं उपयोगकर्ता की भाषा के लिए जाँच करने के लिए उपयोग:

<?php 
function setSessionLanguageToDefault() { 
    $ip=$_SERVER['REMOTE_ADDR']; 
    $url='http://api.hostip.info/get_html.php?ip='.$ip; 
    $data=file_get_contents($url); 
    $s=explode (':',$data); 
    $s2=explode('(',$s[1]); 

    $country=str_replace(')','',substr($s2[1], 0, 3)); 

    if ($country=='us') { 
     $country='en'; 
    } 

    $country=strtolower(ereg_replace("[^A-Za-z0-9]", "", $country)); 
    $_SESSION["_LANGUAGE"]=$country; 
} 

if (!isset($_SESSION["_LANGUAGE"])) { 
    setSessionLanguageToDefault(); 
} 

if (file_exists(APP_DIR.'/language/'.$_SESSION["_LANGUAGE"].'.php')) { 
    include(APP_DIR.'/language/'.$_SESSION["_LANGUAGE"].'.php'); 
} else { 
    include(APP_DIR.'/language/'.DEFAULT_LANG.'.php'); 
} 

?> 

इसके तक पूरा नहीं हुआ है, लेकिन अच्छी तरह से मैं इस एक बहुत मदद कर सकता है लगता है।

1

जैसा कि अन्य उत्तरों वास्तव में सभी सवालों का जवाब नहीं देते हैं, मैं इसके जवाब में और एक समझदार विकल्प की पेशकश करता हूं।

1) I18n अंतर्राष्ट्रीयकरण के लिए छोटा है और इसमें कुछ समानताएं हैं I-eighteen-n।

2) मेरी ईमानदार राय में gettext समय की बर्बादी है।

3) आपका दृष्टिकोण अच्छा दिखता है। आपको भाषा चर के लिए क्या देखना चाहिए। WoltLab Community Framework 2.0 दो-तरफा भाषा प्रणाली लागू करता है। एक बार ऐसे भाषा चर होते हैं जो डेटाबेस में सहेजे जाते हैं और टेम्पलेट के अंदर एक केवल वेरिएबल के नाम का उपयोग करता है जिसे बाद में वर्तमान भाषा (यदि उपलब्ध हो) में चर की सामग्री के साथ प्रतिस्थापित किया जाएगा। सिस्टम का दूसरा भाग कई भाषाओं में उपयोगकर्ता द्वारा उत्पन्न सामग्री को सहेजने का एक तरीका प्रदान करता है (कई भाषाओं में इनपुट आवश्यक)।

मूल रूप से आपके पास इंटरफ़ेस टेक्स्ट होता है जिसे उपयोगकर्ता द्वारा परिभाषित डेवलपर और सामग्री द्वारा परिभाषित किया जाता है। सामग्री के बहुभाषी पाठ को भाषा चर में सहेजा जाता है और भाषा चर का नाम तब विशिष्ट सामग्री तालिका में टेक्स्ट फ़ील्ड के मान के रूप में उपयोग किया जाता है (क्योंकि एकल-भाषा सामग्री भी संभव है)।

डब्ल्यूसीएफ की संरचना दुख की बात है कि ढांचे के बाहर कोड का पुन: उपयोग करना बहुत मुश्किल है लेकिन आप इसे प्रेरणा के रूप में उपयोग कर सकते हैं। सिस्टम का दायरा पूरी तरह से निर्भर करता है कि आप अपनी साइट के साथ क्या हासिल करना चाहते हैं। यदि यह आपके से बड़ा होने जा रहा है तो निश्चित रूप से डब्ल्यूसीएफ सिस्टम पर नजर डालें। यदि यह कुछ समर्पित भाषा फाइलों की छोटी है (de.php, en।PHP, आदि), जिसमें से वर्तमान भाषा के लिए सही एक शामिल है, करेंगे।

+0

* 2) मेरी ईमानदार राय में गेटटेक्स्ट समय की बर्बादी है। * - दरअसल! – almosnow

1

दुर्भाग्य से गेटटेक्स्ट अच्छा काम नहीं करता है और विभिन्न ओएस (विंडोज या लिनक्स) जैसी विभिन्न स्थितियों में समस्याएं हैं और इसे काम करना बहुत मुश्किल है।

इसके अलावा इसके लिए आपको पर्यावरण चर और डोमेन के बहुत सारे सेट की आवश्यकता है और इसका कोई अर्थ नहीं है।

यदि कोई डेवलपर बस एक पाठ का अनुवाद प्राप्त करना चाहता है तो उसे केवल .mo फ़ाइल पथ सेट करना चाहिए और अनुवाद जैसे "फ़ंक्शन" ("हैलो", "en_EN") के साथ अनुवाद प्राप्त करना चाहिए; गेटटेक्स्ट के साथ यह संभव नहीं है।

0

आप ऐसा कर सकते हैं:

class T { 
const language = "English"; 
const home = "Home"; 
const blog = "Blog"; 
const forum = "Forum"; 
const contact = "Support"; 
} 

आप प्रत्येक भाषा के लिए इस तरह की एक फ़ाइल के लिए होगा।

There is no place like <?=T::home?>. 

नकारात्मक पक्ष यह है कि आप एक नया निरंतर जोड़ने के लिए, आप हर भाषा के फ़ाइल के लिए यह करना है कि है: पाठ का उपयोग करें। यदि आप एक भूल जाते हैं, तो आपका पृष्ठ उस भाषा के लिए टूट जाता है। यह थोड़ा बुरा है, लेकिन यह कुशल है क्योंकि इसे एक बड़ी सहयोगी सरणी बनाने की आवश्यकता नहीं है और संभवतः मूल्य भी रेखांकित हो जाते हैं।

शायद पहुँच सुधार किया जा सकता है, जैसे:

class T { 
    const home = "home"; 

    public static function _ ($name) { 
     $value = @constant("self::$name"); 
     return $value ? $value : $name; 
    } 

    // Or maybe through an instance: 
    public function __get ($name) { 
     $value = @constant("self::$name"); 
     return $value ? $value : $name; 
    } 
} 
echo "There is no " . T::_("place") . " like " . T::_("home"); 
$T = new T(); 
echo "There is no " . $T->place . " like " . $T->home; 

हम अभी भी सरणी से बचने और constant पर भरोसा देखने, जो मुझे लगता है सीधे स्थिरांक का उपयोग कर से ज्यादा महंगा है क्या करना है। जब तक कुंजी नहीं मिलती है तो ऊपर की तरफ लुकअप का उपयोग कर सकते हैं।

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