Codeigniter web sitesini çok dilli yapmanın en iyi yolu. lang dizilerinden çağrı yapmak lang oturumuna bağlıdır?


81

Saatleri ve saatleri araştırıyorum, ancak bunu yapmanın net ve etkili bir yolunu bulamadım: /

İngilizce kod imzalayan bir web sitem var ve şimdi bir Lehçe dil eklemem gerekiyor. Ziyaretçi seçimine bağlı olarak sitemi 2 dilde yapmanın en iyi yolu nedir?

her dil için dizi dosyaları oluşturmanın ve bunları görünüm dosyalarında çağırmanın herhangi bir yolu var mı, dil seçiminden Oturum'a bağlıdır? Veritabanını kullanmak istemiyorum.

Takdir yardımcı olur! Son teslim tarihim doluyor: / teşekkürler !!


1
Burada yayınlanan tüm cevaplar harika ancak bunları kullanarak sayfalarınızın nakit ödeme seçeneğini kaybedersiniz, çünkü önbelleğe alınacak bir denetleyicisi ve belirlediğiniz son dilde olacaktır. buna bir çözüm var mı sonra farklı bir denetleyici kullanarak her dil için.

Yanıtlar:


93

CodeIgniter'in Dil kütüphanesini gördünüz mü ?

Dil Sınıfı, uluslararasılaştırma amacıyla dil dosyalarını ve metin satırlarını alma işlevleri sağlar.

CodeIgniter sistem klasörünüzde, dil dosyası kümelerini içeren bir dil bulacaksınız. Hata ve diğer mesajları diğer dillerde görüntülemek için gerektiğinde kendi dil dosyalarınızı oluşturabilirsiniz.

Dil dosyaları genellikle sistem / dil dizininizde saklanır. Alternatif olarak, uygulama klasörünüzün içinde dil adlı bir klasör oluşturabilir ve orada saklayabilirsiniz. CodeIgniter, ilk olarak uygulama / dil dizininize bakacaktır. Dizin yoksa veya belirtilen dil orada bulunmuyorsa, CI bunun yerine genel sistem / dil klasörünüze bakacaktır.

Senin durumunda...

  • bir polish_lang.phpve english_lang.phpiçinde yaratmalısınapplication/language/polish
  • daha sonra anahtarlarınızı bu dosyanın içinde oluşturun (ör. $lang['hello'] = "Witaj";
  • sonra kontrolörünüze yükleyin $this->lang->load('polish_lang', 'polish');
  • daha sonra satırı şöyle getirin $this->lang->line('hello');: Bu fonksiyonun dönüş değerini bir değişkende saklayın, böylece onu görünümünüzde kullanabilirsiniz.

İngilizce dili ve ihtiyacınız olan diğer tüm diller için adımları tekrarlayın.


hızlı cevap için teşekkürler, evet bunu gördüm. ama aslında net değil: / ihtiyacımı nasıl yapacağım, dil dosyalarının nerede yaratılacağı, hangi format, ne tür bir yapı, nasıl arama yapılacağı vb. hakkında ... Codeigniter'da oldukça yeniyim. bu yüzden açık bir öğretici veya sth arıyordum. : /
tasarımcı-kodlama

1
heyooo harika, iyi çalışıyor: D yardım için çok teşekkürler! cankurtaran sensin! :) teşekkürler
tasarımcı-kodlama

2
Bu, düzenlenemeyen metinler için bir çözümdür, ancak bir veritabanında depolanan ve alınan çok dilli içeriği kapsamaz. CI ile yapılan özel içerik yönetim sistemine sahip çok dilli bir sitenin bundan daha fazlasına ihtiyacı olacaktır. URL’deki bir dil bölümü ve / veya tek bir dilde tek bir içeriği tanımlayan benzersiz bir takma ad bölümü yardımıyla kendim yaptım. Hala bunu nasıl daha iyi yöneteceğimi bulamadım. Bu yüzden bu konuya girdim.
Luis Martin

@Randell çalışıyor ama onclick ile başka bir dile nasıl tercüme edileceğini detaylandırabilir misiniz .... yani oturumlarda saklamak mı? nasıl

@Nadh, sorunuzu yeni bir ileti dizisine göndermek en iyisidir, böylece tartışmaları kısa ve öz tutabiliriz.
Randell

22

Ayrıca dili oturuma eklemek için, her dil için bazı sabitler tanımlardım, sonra oturum kitaplığının config / autoload.php içinde otomatik olarak yüklendiğinden emin olun veya ihtiyacınız olduğunda onu yükleyin. Kullanıcıların istedikleri dili oturuma ekleyin:

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

O zaman bu şekilde istediğiniz zaman yakalayabilirsiniz:

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

evet bu benim başka bir sorunumdu. bana zaten yardım ettin: Harika teşekkürler! Ayrıca ziyaretçinin dil seçimini hatırlamak için çerez kullanmayı düşünüyordum.
tasarımcı kodlaması

1
bu oturumları nerede tanımlamalıyım? Bunları her sayfa için denetleyicilerde tanımlamanın iyi olmadığını düşünüyorum. global bir dosyada tanımladığım bir yol olmalı ve tüm siteyi etkiliyor. Teşekkürler!!
tasarımcı-kodlamaya çalışıyor

Her nasılsa, bunu yapmanın daha iyi bir yolu var. Ama bu tamamen yeni bir soru. Ancak bu, sadece başlamanız için de yapılabilir.
Randell

7

Denetleyicide, oluşturucuyu yaptığınızda aşağıdaki satırları ekleyin

yani sonra

parent :: Controller ();

satırların altına ekle

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

lang_translate_helper.php yardımcı dosyasını aşağıdaki işlevi ile oluşturun ve onu system \ application \ helpers dizinine koyun

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

dillerin her biri için, system \ application \ languages ​​altında en, nl, fr, vb. gibi dil kısaltmalarıyla bir dizin oluşturun.

$ lang dizi holding çiftlerini içerecek yukarıdaki (ilgili) dizinde dil dosyası oluşturun label => language_value aşağıda verildiği gibi

nl_site_lang.php

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

en_site_lang.php

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

Aynı dilde birden çok dosyayı gereksinime göre farklı şekilde depolayabilirsiniz, örneğin arka ucu yönetmek için ayrı bir dil dosyası istiyorsanız (yönetici bölümü) denetleyicide $ this-> lang-> load ('nl_admin', ' nl ');

nl_admin_lang.php

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

ve son olarak etiketi istenen dilde yazdırmak için aşağıdaki görünümdeki etiketlere erişin

etiket ('hoş geldiniz', $ this);

VEYA

etiket ('merhaba kelime', $ this);

merhaba & word'deki boşluğa dikkat edin, bu şekilde de kullanabilirsiniz :)

dil dosyasında tanımlanmış bir etiket yoksa, basitçe işlev etiketine aktardığınız şeyi yazdıracaktır.


1

Randell'in cevabını destekliyorum.

Ancak, her zaman http://www.maxmind.com/app/php veya http://www.ipinfodb.com/ gibi bir GeoIP entegre edilebilir . Ardından sonuçları kod işaretleyici oturum sınıfıyla kaydedebilirsiniz.

İpinfodb.com api'yi kullanmak istiyorsanız ip2locationlite.class.php dosyasını kod imzalayıcı uygulama kitaplığı klasörünüze ekleyebilir ve ardından uygulamanız için ihtiyacınız olan geoip mantığını yapmak için bir model işlevi oluşturabilirsiniz, örneğin:

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
Dili IP'ye göre tespit etmek pek iyi sonuç vermiyor. VPN'leri, gezginleri, göçmenleri veya sadece Kanada veya Çin gibi birden çok dili olan ülkeleri düşünün. Tarayıcı dilini kullanmak daha iyidir.
PiTheNumber

1

Daha kolay kullanım için CI bunu güncelledi, böylece sadece kullanabilirsiniz

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

ve metni çevirmek için

lang('language line');

ve bunu etiketin içinde bükmek istiyorsanız, isteğe bağlı parametreyi kullanın

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

Bu çıktı verecek

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

İyi bir okuma için http://ellislab.com/codeigniter/user-guide/helpers/language_helper.html


1

Wiredesignz'ın MY_Language sınıfını büyük bir başarıyla kullandım.

Hiçbir yerde bir iz bulamadığım için onu github'da yayınladım.

https://github.com/meigwilym/CI_Language

Yaptığım tek değişiklik, yeni v2 değişikliklerine uygun olarak sınıfı CI_Lang olarak yeniden adlandırmak.


İnsanlar neden küresel kullanım ihtiyacı hissediyor? Kolaydır ancak çok büyük sorunlar yaratabilir.
Starlays

0

Gerçek dosyaları yönetirken, gerçekten dikkatli olmadığınız sürece işler oldukça kolay bir şekilde senkronize edilmeyebilir. Bu nedenle String adında (beta) ücretsiz bir hizmet başlattık , dil dosyalarınızı kolayca takip etmenize ve çevirmenlerle işbirliği yapmanıza olanak tanıyan .

Mevcut dil dosyalarını (PHP dizisi, PHP Define, ini, po veya .strings formatlarında) içe aktarabilir veya kendi bölümlerinizi sıfırdan oluşturabilir ve doğrudan sistem aracılığıyla içerik ekleyebilirsiniz.

String tamamen ücretsizdir, bu yüzden lütfen kontrol edin ve bize ne düşündüğünüzü söyleyin.

Aslında Codeigniter üzerine de inşa edilmiştir! Betaya http://mygengo.com/string adresinden göz atın


Bu aslında iyi bir nokta; CI'nin dil dosyalarının bakımı zaman içinde kolay değildir.
sourcejedi


0

Config.php'de böyle bir kod kullanıyorum:

$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;
}

.... ve sonra olağan CI iç mekanizmasını kullanıyorum

o, neredeyse unut! görünümlerde kullanıcı tarafından tercih edilen, çerez 'dilini' dile göre ayarlayan düğmeleri kullanıyorum.

Bu nedenle, önce bu kod kullanıcının kullanıcı aracısında (tarayıcı) ayarlanan "tercih edilen dili" tespit etmeye çalışır. Ardından kod, tanımlama bilgisi 'dilini' okumaya çalışır. Ve son olarak - anahtar, CI uygulaması için dili belirler


-1

böyle bir işlev yapabilirsin

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

6
Bu kötü programlamanın bir örneğidir, alınma. Bir işlevde sabitleri TANIMLAMAYIN. Bu yüzden sabit deniyor, değeri değişmiyor, bu yüzden sadece bir kez tanımlanacak. İkincisi, kod isset($lang[$language][$word]) == FALSEbunun gibi yeterli olacaktır isset($lang[$language][$word]), çünkü isset yalnızca true ve false döndürür. Üçüncüsü, bir şeyin yanlış olup olmadığını değerlendirdiğinizde DAİMA türü=== doğrulamak için kullanın .
machineaddict

-1

Dostum, merak etmeyin, kod işaretleyicide kurulu herhangi bir uygulamanız varsa ve biraz dil paketi eklemek istiyorsanız, sadece aşağıdaki adımları izleyin:

1. application / language / arapça klasörüne dil dosyaları ekleyin (ci'de yerleşik sma2'ye arapça dili eklerim)

2. application / modules / settings / views / setting.phpsetting.php içinde adlandırılan dosyaya gidin . Burada diziyi buluyorsunuz

<?php /*

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

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

  'spanish' => 'Español'

Şimdi uygulamayı kaydedin ve çalıştırın. İyi çalıştı.


setting.phpherhangi bir kitaplık veya yardımcı kullandıysanız, adında herhangi bir dosya yok, lütfen önce paylaşın.
Ali Qorbani
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.