codeigniter वेबसाइट को बहु भाषा बनाने का सबसे अच्छा तरीका है। लैंग सरणियों से कॉल करना लैंग सत्र पर निर्भर करता है?


81

मैं घंटे और घंटे पर शोध कर रहा हूं, लेकिन मुझे इसे बनाने का कोई स्पष्ट, कुशल तरीका नहीं मिला: /

मेरे पास अंग्रेजी में एक कोडिग्निटर बेस वेबसाइट है और मुझे अब एक पोलिश भाषा जोड़ना है। आगंतुक चयन के आधार पर मेरी साइट को 2 भाषा में बनाने का सबसे अच्छा तरीका क्या है?

क्या प्रत्येक भाषा के लिए सरणी फ़ाइलें बनाने और उन्हें देखने के लिए फ़ाइलों को कॉल करने का कोई तरीका है, सत्र चयन पर निर्भर करता है? मैं डेटाबेस का उपयोग नहीं करना चाहता।

सराहना में मदद करता है! मैं समय सीमा से बाहर चल रहा हूँ: / धन्यवाद !!


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

जवाबों:


93

क्या आपने CodeIgniter की भाषा लाइब्रेरी देखी है ?

भाषा वर्ग अंतर्राष्ट्रीयकरण के प्रयोजनों के लिए भाषा फ़ाइलों और पाठ की पंक्तियों को पुनः प्राप्त करने के लिए कार्य प्रदान करता है।

अपने CodeIgniter सिस्टम फोल्डर में आपको लैंग्वेज फाइल्स वाले सेट नामक भाषा मिलेगी। आप अन्य भाषाओं में त्रुटि और अन्य संदेश प्रदर्शित करने के लिए आवश्यकतानुसार अपनी भाषा की फ़ाइलें बना सकते हैं।

भाषा फ़ाइलों को आमतौर पर आपके सिस्टम / भाषा निर्देशिका में संग्रहीत किया जाता है। वैकल्पिक रूप से आप अपने एप्लिकेशन फ़ोल्डर के अंदर भाषा नामक एक फ़ोल्डर बना सकते हैं और उन्हें वहां संग्रहीत कर सकते हैं। CodeIgniter आपके एप्लिकेशन / भाषा निर्देशिका में सबसे पहले दिखेगा। यदि निर्देशिका मौजूद नहीं है या निर्दिष्ट भाषा वहां स्थित नहीं है तो CI आपके वैश्विक सिस्टम / भाषा फ़ोल्डर में दिखेगा।

आपके मामले में...

  • आपको एक polish_lang.phpऔर english_lang.phpअंदर बनाने की जरूरत हैapplication/language/polish
  • फिर उस फ़ाइल के अंदर अपनी चाबियाँ बनाएँ (जैसे $lang['hello'] = "Witaj";
  • फिर इसे अपने नियंत्रक में लोड करें $this->lang->load('polish_lang', 'polish');
  • फिर लाइन को लाइक करें जैसे $this->lang->line('hello');कि इस फंक्शन के रिटर्न वैल्यू को वेरिएबल में स्टोर करें ताकि आप इसे अपने व्यू में इस्तेमाल कर सकें।

अंग्रेजी भाषा और अन्य सभी भाषाओं के लिए चरणों को दोहराएं जिनकी आपको आवश्यकता है।


त्वरित उत्तर के लिए धन्यवाद, हां मैंने यह देखा है। लेकिन यह वास्तव में स्पष्ट नहीं है: / के बारे में कैसे मेरी जरूरत बनाने के लिए, जहाँ lang फ़ाइलों को बनाने के लिए, क्या प्रारूप, किस तरह की संरचना, कैसे कॉल करने के लिए, आदि ... मैं codeigniter पर बहुत नया हूँ। यही कारण है कि मैं स्पष्ट ट्यूटोरियल या sth की तलाश में था। : /
डिजाइनर-कोशिश-कोडिंग

1
अरे, यह बहुत अच्छा है, अच्छी तरह से काम कर रहा है: डी मदद के लिए बहुत बहुत धन्यवाद! आप हैं! :) धन्यवाद
डिजाइनर-कोशिश-कोडिंग

2
यह गैर-संपादन योग्य पाठ के लिए समाधान है, लेकिन यह डेटाबेस से संग्रहीत और पुनर्प्राप्त किसी भी बहुभाषी सामग्री को कवर नहीं करता है। सीआई के साथ बनाई गई कस्टम सामग्री प्रबंधन प्रणाली के साथ एक बहुभाषी साइट को इससे अधिक की आवश्यकता होगी। मैंने URL और / या एक अद्वितीय उपनाम खंड में भाषा खंड की सहायता से अपना स्वयं का बनाया है, जो एकमात्र भाषा में एकमात्र सामग्री की पहचान करता है। मुझे अभी भी यह समझ में नहीं आया है कि इसे बेहतर तरीके से कैसे प्रबंधित किया जाए। इसलिए मैं इस धागे में बंध गया।
लुइस मार्टिन

@ रेंडेल यह काम कर रहा है, लेकिन क्या आप विस्तार से बता सकते हैं कि ऑन्ग्लिक द्वारा अन्य भाषा में अनुवाद कैसे किया जाए .... मेरा मतलब सत्रों में संग्रहित करना है? कैसे

@ याद रखें, अपने प्रश्न को नए धागे पर पोस्ट करना सबसे अच्छा है, इसलिए हम चर्चाओं को संक्षिप्त रख सकते हैं।
रैंडेल

22

सत्र में भाषा जोड़ने के लिए, मैं प्रत्येक भाषा के लिए कुछ स्थिरांक को परिभाषित करूंगा, फिर सुनिश्चित करें कि आपके पास सत्र पुस्तकालय ऑटोलैड है जो config / autoload.php में है, या जब भी आपको इसकी आवश्यकता होती है, आप इसे लोड करते हैं। सत्र में उपयोगकर्ताओं को वांछित भाषा जोड़ें:

$this->session->set_userdata('language', ENGLISH);

फिर आप इसे कभी भी इस तरह से पकड़ सकते हैं:

$language = $this->session->userdata('language');

हाँ यह मेरा एक और मुद्दा था। तुमने पहले ही मेरी मदद कर दी: डी महान ठग! मैं आगंतुक के चयन को याद रखने के लिए कुकी का उपयोग करने के बारे में भी सोच रहा था।
डिजाइनर-कोशिश-कोडिंग

1
मुझे इन सत्रों को कहां परिभाषित करना चाहिए? मुझे लगता है कि प्रत्येक पृष्ठ के लिए नियंत्रकों में इन्हें परिभाषित करना अच्छा नहीं है। एक ऐसा तरीका होना चाहिए जिसे मैं एक वैश्विक फ़ाइल में परिभाषित करता हूं और यह सभी साइट को प्रभावित करता है। धन्यवाद!!
डिजाइनर-कोशिश-कोडिंग

किसी तरह, ऐसा करने का एक बेहतर तरीका है। लेकिन यह बिल्कुल नया सवाल है। लेकिन यह आपको शुरू करने के लिए भी किया जा सकता है।
रैंडेल

7

नियंत्रक में निम्नलिखित पंक्तियों को जोड़ते हैं जब आप क्यूंस्ट्रक्टर बनाते हैं

यानी, के बाद

जनक :: नियंत्रक ();

लाइनों के नीचे जोड़ें

    $this->load->helper('lang_translate');
    $this->lang->load('nl_site', 'nl'); // ('filename', 'directory')

निम्नलिखित फंक्शन के साथ सहायक फाइल lang_translate_helper.php बनाएं और इसे डायरेक्टरी सिस्टम \ एप्लीकेशन \ हेल्पर्स में डालें

function label($label, $obj)
{
    $return = $obj->lang->line($label);
    if($return)
        echo $return;
    else
        echo $label;
}

भाषा के प्रत्येक के लिए, सिस्टम \ अनुप्रयोग की भाषाओं के तहत en, nl, fr, इत्यादि जैसी भाषाओं के साथ एक निर्देशिका बनाएं

उपरोक्त (संबंधित) निर्देशिका में भाषा फ़ाइल बनाएँ जिसमें $ लैंग ऐरे को जोड़े हुए लेबल => language_value के रूप में नीचे दिया गया होगा

nl_site_lang.php

$lang['welcome'] = 'Welkom';
$lang['hello word'] = 'worde Witaj';

en_site_lang.php

$lang['welcome'] = 'Welcome';
$lang['hello word'] = 'Hello Word';

आप आवश्यकता के अनुसार अलग-अलग भाषाओं के लिए एक से अधिक फ़ाइलों को संग्रहीत कर सकते हैं, उदाहरण के लिए, यदि आप बैकएंड (एडमिनिस्ट्रेटर सेक्शन) के प्रबंधन के लिए अलग भाषा फ़ाइल चाहते हैं, तो आप इसे नियंत्रक के रूप में $ $> -लंग-> लोड ('nl_admin', 'के रूप में उपयोग कर सकते हैं) nl ');

nl_admin_lang.php

$lang['welcome'] = 'Welkom';
$lang['hello word'] = 'worde Witaj';

और अंत में लेबल को वांछित भाषा में प्रिंट करने के लिए, नीचे दी गई जानकारी के अनुसार लेबल एक्सेस करें

लेबल ('स्वागत है', यह $);

या

लेबल ('हैलो शब्द', यह $);

हैलो और शब्द में जगह नोट करें आप इसे इस तरह से उपयोग कर सकते हैं :)

जब कोई भाषा फ़ाइल में परिभाषित नहीं किया जाता है, तो यह बस उसे प्रिंट करेगा जो आपने फ़ंक्शन लेबल को दिया था।


1

मैं दूसरे रैंडेल का जवाब।

हालाँकि, कोई भी हमेशा किसी जियोआईपी जैसे http://www.maxmind.com/app/php या http://www.ipinfodb.com/ को एकीकृत कर सकता है । तब आप कोडिनाइटर सत्र वर्ग के साथ परिणाम बचा सकते हैं।

यदि आप ipinfodb.com api का उपयोग करना चाहते हैं, तो आप ip2locationlite.class.php फ़ाइल को अपने कोडाइन्गाइटर एप्लिकेशन लाइब्रेरी फ़ोल्डर में जोड़ सकते हैं और फिर जो भी जियो लॉजिक आपके एप्लिकेशन के लिए आवश्यक है, उसे करने के लिए एक मॉडल फ़ंक्शन बनाएँ:

function geolocate()
{
    $ipinfodb = new ipinfodb;
    $ipinfodb->setKey('API KEY');

    //Get errors and locations
    $locations = $ipinfodb->getGeoLocation($this->input->ip_address());
    $errors = $ipinfodb->getError();

   //Set geolocation cookie
   if(empty($errors))
   {
       foreach ($locations as $field => $val):
            if($field === 'CountryCode')
            {
                $place = $val;
            }
       endforeach;
   }
   return $place;
}

3
आईपी ​​पर आधारित भाषा का पता लगाने से बहुत अच्छा काम नहीं होता है। वीपीएन, यात्रियों, प्रवासियों या बस कनाडा या चीन जैसी कई भाषाओं वाले देशों के बारे में सोचें। ब्राउज़र भाषा का उपयोग करना बेहतर है।
PiNNumber

1

आसान उपयोग के लिए CI ने इसे अपडेट किया है ताकि आप बस उपयोग कर सकें

$this->load->helper('language');

और पाठ का अनुवाद करने के लिए

lang('language line');

और यदि आप इसे लेबल के अंदर बदलना चाहते हैं तो वैकल्पिक पैरामीटर का उपयोग करें

lang('language line', 'element id');

यह आउटपुट करेगा

// becomes <label for="form_item_id">language_key</label>

अच्छे पढ़ने के लिए http://ellislab.com/codeigniter/user-guide/helpers/language_helper.html


1

मैंने बहुत सफलता के साथ Wiredesignz के MY_Language वर्ग का उपयोग किया है।

मैंने अभी इसे जीथब पर प्रकाशित किया है, क्योंकि मैं कहीं भी इसका पता नहीं लगा सकता।

https://github.com/meigwilym/CI_Language

नए v2 परिवर्तनों के अनुसार, मेरा केवल परिवर्तन वर्ग का नाम बदलकर CI_Lang करने के लिए है।


लोगों को वैश्विक उपयोग की आवश्यकता क्यों महसूस होती है? यह आसान है लेकिन भारी समस्याएं पैदा कर सकता है।
Starlays

0

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

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

स्ट्रिंग पूरी तरह से स्वतंत्र है इसलिए कृपया इसे देखें और हमें बताएं कि आप क्या सोचते हैं।

यह वास्तव में Codeigniter पर भी बनाया गया है! Http://mygengo.com/string पर बीटा देखें


यह वास्तव में एक अच्छा बिंदु है; सीआई की भाषा फाइलें समय के साथ बनाए रखना आसान नहीं है।
sourcejedi


0

मैं config.php में ऐसे कोड का उपयोग कर रहा हूं:

$lang = 'ru'; // this language will be used if there is no any lang information from useragent (for example, from command line, wget, etc...

if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);
$tmp_value = $_COOKIE['language'];
if (!empty($tmp_value)) $lang = $tmp_value;
switch ($lang)
{
    case 'ru':
        $config['language'] = 'russian';
        setlocale(LC_ALL,'ru_RU.UTF-8'); 
        break;
        case 'uk':
        $config['language'] = 'ukrainian';
        setlocale(LC_ALL,'uk_UA.UTF-8'); 
                break;
        case 'foo':
        $config['language'] = 'foo';
        setlocale(LC_ALL,'foo_FOO.UTF-8'); 
                break;
        default:
        $config['language'] = 'english';
        setlocale(LC_ALL,'en_US.UTF-8'); 
        break;
}

.... और फिर मैं CI के सामान्य आंतरिक मैकेनिज्म का उपयोग कर रहा हूं

ओ, लगभग भूल जाओ! विचारों में मैं बटन का उपयोग कर रहा हूं, जो उपयोगकर्ता के द्वारा पसंद की गई भाषा के साथ कुकी 'भाषा' सेट करता है।

इसलिए, पहले इस कोड को user के useragent (ब्राउज़र) में बसे "पूर्वगामी भाषा" का पता लगाने का प्रयास करें। फिर कोड कुकी 'भाषा' को पढ़ने की कोशिश करें। और अंतिम - CI के लिए स्विच सेट भाषा


-1

आप इस तरह से फंक्शन कर सकते हैं

function translateTo($language, $word) {  
   define('defaultLang','english');  
   if (isset($lang[$language][$word]) == FALSE)  
      return $lang[$language][$word];  
   else  
      return $lang[defaultLang][$word];  
}

6
यह खराब प्रोग्रामिंग का उदाहरण है, कोई अपराध नहीं। किसी फ़ंक्शन में स्थिरांक परिभाषित नहीं करते हैं। इसलिए इसे स्थिरांक कहा जाता है, यह मूल्य नहीं बदलता है, इसलिए इसे केवल एक बार परिभाषित किया जाएगा। दूसरा, कोड isset($lang[$language][$word]) == FALSEकेवल इस तरह पर्याप्त होगा isset($lang[$language][$word]), क्योंकि isset रिटर्न केवल सही और गलत है। और तीसरा, जब आप मूल्यांकन करते हैं कि कुछ गलत है ===तो टाइप को सत्यापित करने के लिए हमेशा उपयोग करें ।
माचिनडाइक्ट

-1

मित्र, चिंता न करें, यदि आपके पास कोडिनेटर में कोई एप्लिकेशन स्थापित है और आप इन चरणों का पालन करने के लिए कुछ भाषा पैक जोड़ना चाहते हैं:

1. फ़ोल्डर अनुप्रयोग / भाषा / अरबी में भाषा फ़ाइलें जोड़ें (मैं ci में निर्मित sma2 में अरबी लैंग जोड़ें)

2. एप्लिकेशन / मॉड्यूल / सेटिंग्स / विचार / सेटिंगsetting.php में नामित फ़ाइल पर जाएं । पीडीएफ । यहाँ आप सरणी पाते हैं

<?php /*

 $lang = array (
  'english' => 'English',

  'arabic' => 'Arabic',  // i add this here

  'spanish' => 'Español'

अब एप्लिकेशन को सेव और रन करें। यह ठीक काम किया है।


setting.phpयदि आपके पास किसी भी पुस्तकालय या सहायक का उपयोग किया गया है तो कोई भी फ़ाइल नाम नहीं है कृपया इसे पहले साझा करें।
अली कोरबानी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.