Çoklu Dil PHP uygulamaları Programlama

10 Cevap php

Ben bir PHP uygulama geliştiriyorum ve diğer ülkelerdeki kullanıcılar için çoklu dil desteği için en iyi yolu hakkında merak ediyorum.

PHP ile uzman değilim ama diğer diller için desteği ile bir şey geliştirdik hiç.

Ben sabitler, örnek bir PHP dosyası içine dilini koyarak düşünüyordum:

en.php içerebilir:

define('HZ_DB_CONN_ERR', 'There was an error connecting to the database.');

ve fr.php içerebilir:

define('HZ_DB_CONN_ERR', 'whatever the french is for the above...');

Sonra bir işlevi diyebiliriz ve otomatik olarak doğru dil içeri geçti

hz_die('HZ_DB_CONN_ERR', $this);

Bu konuda gidiş iyi bir yolu var mı?

- Morristhebear.

10 Cevap

Tuhaf. İnsanlar bariz çözüm göz ardı edilecek gibi görünüyor. Yerele özgü dosyalar senin fikrin gayet iyi. En.php var:

define('LOGIN_INCORRECT','Your login details are incorrect.');
...

Daha sonra, (Ben birçok nedenden dolayı öneririm) bir küresel config / sabitler dosyası var varsayarak, bu gibi bir kod vardır:

if ($language == 'en') {
  reqire_once 'en.php';
} else if ($language == 'de') {
  require_once 'de.php';
}

Siz sayısı ve döviz ekran, karşılaştırma / vb (yani Almanca, Fransızca ve İngilizce tüm farklı harmanlama yöntemleri var), sıralama için fonksiyonları tanımlayabilirsiniz

İnsanlar genelde PHP bu gibi şeyler o kadar dinamik bir dildir unutmak:

if ($language == 'en') {
  function cmp($a, $b) { ... }
} else if ($language == 'de') {
  function cmp($a, $b) { ... }
}

tamamen yasal aslında. Bunları kullanın.

Sen gettext ya da daha fazla Zend_Translate yanı sıra gettext destekleyen bir şey kullanabilirsiniz.

Edit:

Sadece hassasiyet için, Zend_Translate gettext modülü olmadan gettext destekler. Burada görebilirsiniz the many different types of input it supports.

Ayrıca önerildiği gibi diziler kullanırsanız, ayrıca Zend_Translate ile kullanabilirsiniz. Bugün ve gettext, xml veya başka bir şey yarın diziler kullanırsanız noktası olmak, sadece Zend_Translate için ayarlarımızı değiştirmek zorunda.

Gerçekten aşağıdaki yaklaşımı seviyorum:

bir dosya çevirmen kendisidir:

class Translator{
    private static $strs = array();
    private static $currlang = 'en';

    public static function loadTranslation($lang, $strs){
        if (empty(self::$strs[$lang]))
            self::$strs[$lang] = array();

        self::$strs[$lang] = array_merge(self::$strs[$lang], $strs);        
    }

    public static function setDefaultLang($lang){
        self::$currlang = $lang;        
    }

    public static function translate($key, $lang=""){
        if ($lang == "") $lang = self::$currlang;
        $str = self::$strs[$lang][$key];
        if (empty($str)){
            $str = "$lang.$key";            
        } 
        return $str;       
    }    

    public static function freeUnused(){
        foreach(self::$strs as $lang => $data){
            if ($lang != self::$currlang){
                $lstr = self::$strs[$lang]['langname'];
                self::$strs[$lang] = array();
                self::$strs[$lang]['langname'] = $lstr;                
            }            
        }        
    }

    public static function getLangList(){
        $list = array();
        foreach(self::$strs as $lang => $data){
            $h['name'] = $lang;
            $h['desc'] = self::$strs[$lang]['langname'];
            $h['current'] = $lang == self::$currlang;
            $list[] = $h;
        }
        return $list;        
    }

    public static function &getAllStrings($lang){
        return self::$strs[$lang];
    }

}

function generateTemplateStrings($arr){
    $trans = array();
    foreach($arr as $totrans){
        $trans[$totrans] = Translator::translate($totrans);
    }
    return $trans;    
}

dil dosyaları basitçe include() d olabilir ve bu gibi bakabilirsiniz:

en.php:

Translator::loadTranslation('en', array(
  'textfield_1'          => 'This is some Textfield',
  'another_textfield '   => 'This is a longer Text showing how this is used',
));

de.php:

Translator::loadTranslation('de', array(
  'textfield_1'          => 'Dies ist ein Textfeld',
  'another_textfield '   => 'Dies ist ein längerer Text, welcher aufzeigt, wie das hier funktioniert.',
));

Eğer sen birini yapın böyle bir dize çevirebilir app:

$string = Translator::translate('textfield_1')

veya dizeleri bile bir demet:

$strings = generateTemplateStrings(array('textfield_1', 'another_textfield'));

Dil dosyaları sadece dahil edilebilir, çünkü çok kolay yığını ve, diyelim ki, önce ve sonra yeni dizeleri eklemek veya çalışmaz zaten tanımlanmış olanlar (yerine ya submodüller dosyaları dahil küresel bir dosyayı ekleyebilirsiniz define()-yöntemi).

Saf PHP Çünkü, hatta opcode-önbelleğe çok kolay olabilir.

Geri dil dosyasına çevrilen CSV dosyası dönüştürme: Ben bile bir dosyadan çevrilmemiş dizeleri içeren ve daha iyi CSV dosyaları oluşturmak etrafında komut dosyaları var.

Ben 2004 yılından beri verimli kullanımı bu çözüm var ve ben bu ile çok çok mutluyum.

Tabii ki, hatta örneğin pluralizing için sözleşmeler ile uzatabilirsiniz. Intl-uzatma akla geliyor - sayı biçimlerini yerelleştirme olsa başka araçlar kullanarak yapmak gerekiyor şeydir.

Lütfen yaklaşımlar ve çözümler için tüm insanlar sayesinde. Ben aynı uzaklaştırmak şüphe ile geldi, ve ben bu kullanmak için conlude olabilir, hatta gerçekçi olmak, çok şık diğer kütüphaneler ile yöntemleri veya bazı kullanmayan tek sorunu ile, gibi, daha gerçekçi "yöntemi tanımlamak" ve üretken düşünme, diğer dillerde olmayan programlama becerileri dudes yalak alabilirsiniz mantain ve anlamak çok kolaydır, bu yüzden.

Senin yanında, bazı TRADUCTIONS almak için bu büyük multilanguage dağıtmak gerek yok gibi sadece gerekli traducted dizeleri yükleme gibi diziler yöntemi, daha az bellek kullanıyor daha iyi düşünün.

Bu yeniden olamaz, şey hakkında; iyi, sabitler tanımlıyorsanız, bilinen bir eğer gerekmez veya değiştirilmemelidir çünkü, yani tanımlı dizeler ve değişken olanlar için bir bölüm kullanabilirsiniz gerekirse.

Ben bu dosyalar görünüyor tanımlamak yolu gibi değil, mükemmel bir geçerli uygulamaları olduğunu, ziyaretçilerin deyim uygulanan yol hakkında hiç endişeli olmadığını sayımı almak ve kolayca bazı TRADUCTIONS alabilirsiniz edeceğiz kalmamasıdır addmint.

Sen çok daha kolay uluslararası uygulamalar yazma yapmak CakePHP veya CodeIgniter gibi bir çerçeve bakmak isteyebilirsiniz. Sayı biçimleri ve tarih biçimleri gibi şeyler de dikkate alınması gerekir - Bu sadece düşünmek zorunda dizeleri değil

Sizin çözüm sürece sadece çeviri için tasarlanmıştır olarak iyi çalışması gerekir. Diğerleri de söylediğim gibi, bu tür para birimi ve tarih biçimleri gibi birçok diğer yerel tabanlı değişkenler vardır.

Uygulama yerel geçirmez hale getirmek için sağlam bir yaklaşım Zend_Locale combined with Zend_Translate kullanmak olacaktır.

Zend_Locale allows you to easily detect the user's locale, or set it if you wish. This class is useful for automatically setting the correct currency format, örneğin.

Zend_Translate allows you to easily translate text using several different formats,

  • Dizi
  • CSV
  • Gettext
  • Ini
  • Tbx
  • TMX
  • Qt
  • Xliff
  • XmlTm

Sizin yaklaşım kullanıcının tercih etti, hangi dili bağlı olarak farklı constantfiles dahil durumda, uygulanabilir olduğunu.

Ayrıca sabit kısmını atlayın ve sadece ad çökmeleri önlemek için sürekli => çeviri ile büyük bir hashtable tanımlayabilirsiniz.

Dosya: en.php

$constants = Array(
 'CONSTANT_KEY' => 'Translated string'
);

Dosya: functions.php

function getConstant($key, $fallback) {
   // ... return constant or fallback here.
}

Bu verilerin büyük miktarda gelir Ancak, bu yaklaşım korumak zor olacaktır. Örneğin, daha iyi bir amaca hizmet edebilecek birkaç başka yaklaşımlar vardır tüm sabitler her İstek üzerine / konu tüm bu tercüme veri tutmak zorunda kalmamak için, tüm site için küresel memoryspace depolandığı, ideal bir çözümdür bellek. Bu çeşit php modül yaklaşım gerektirir. Önerilen burada birisi olarak Gettext bu yaklaşımı kullanabilirsiniz.

Yararlı kaynaklar bulmak için PHP lokalizasyonu için google.

Sizin için bir ipucu, tercüme dize döndüren bir işlev oluşturmak olduğunu ve hashtable değilse, o zaman çeviri ihtiyacı size bildirmek için arkasında bir * gibi bir şey ile istenen karma tuşu.

İşte bunu nasıl:

parent_script.php:

$lang_pick = "EN";    //use your own method to set language choice

require_once('trans_index.php'); 

echo $txt['hello'];


trans_index.php:

    $text = array();

    $text['hello'] = array (
     "EN"=> "Hello",
     "FR"=> "Bonjour",
     "DE"=> "Guten Tag",
     "IT"=> "Ciao"
    );                          //as many as needed



foreach($text as $key => $val) {

$txt[$key] = $text[$key][$lang_pick];

}

Bu sizin ihtiyaçlarınız için çok basit olabilir, ama çok uygulanabilir buluyorum. Ayrıca, çok kolay metnin çoklu versiyonları korumak için yapar.

Sen benim en sevdiğim dil kullanabilirsiniz PHP Multi Language Class - LangQuery

Gördüğüm en kolay biridir.

Size dil verilerinizi kaydedebilirsiniz. Ini dosyaları tarafından sadece onu aramak daha

include("LangQuery.php");

$L=new LangQuery();

// Write Hello World
echo($L('hello_world'));

// Write Hello World Easier - In-line Echo Feature
// You don't have to write echo. Just add '>'
$L('>hello_world');

// Use in Strings
echo("Hello Universe. {$L('hello_world')} Hello Europe");

// Write my age with parameter
$L(">my_age",25);

// Write my name and age with parameters
$L(">my_name_age","Recep",25);