• 21-01-2014, 19:25:19
    #1
    Merhaba arkadaşlar.
    Resellerclub apileri ile bir sistem yazıyorum.
    Apiden gelen bazı değerler doğal olarak ingilizce ve bende bu değerleri çevirip Türkçe olacak şekilde ayarlamak için bir fonksiyon yazdım.
    .po ve .mo dosyaları ile dil desteği verme olayını çok kullandım fakat bir türlü alışıp ısınamadım bu duruma. Yeni eklenen her kelime için sürekli 3. bir programa ihtiyaç duymak beni rahatsız etti.

    Yazdığım fonksiyon dil dosyalarında değerler arttığı zaman aşırı bir yavaşlamaya sebep olabilir mi diye sormak istedim. Eğer aşırı derecede bir yavaşlamaya neden olmayacaksa kullanacağım fakat aşırı yavaşlamaya neden olacaksa mecburen .po lara geri döneceğim.

    Çeviri Fonksiyonu
    function cevir($metin){
        global $dilmetin;
        $metin = trim($metin);
        if(!empty($dilmetin[$metin])){
            return $dilmetin[$metin];
        }else{
            $sonuc = degiskenara($metin);
            if(empty($sonuc)){
                return $metin;
            }else{
                return $sonuc;
            }
        }
    }
    
    function degiskenara($gelen){
        global $dilmetin;
    
        $array = array_keys($dilmetin);
        $matches  = preg_grep ('#{(.*?)}#is', $array);
        foreach ($matches as $key => $value) {
            preg_match_all('#{(.*?)}#is', $value, $output, PREG_PATTERN_ORDER);
            $order   = $output[0];
            $replace = '(.*?)';
            $yeni[$key] = str_replace($order, $replace, $value);
            if(preg_match('/'.$yeni[$key].'$/',$gelen,$cikis)){
                $cikti =  $dilmetin[$matches[$key]];
                $cikartik = array_splice($cikis, 1, count($cikis));
                return str_replace($order, $cikartik, $cikti);
            }
        }
        return false;
    }
    Örnek Dil Array
    $dilmetin = array(
    	'Active'	=>	'Aktif',
    	'InActive'	=>	'Pasif',
    	'Renewal of {domain} for {yil} year'       => '{domain} için {yil} yıllık domain yenilemesi',
    	'Registration of {domain} for {yil} year'  => '{domain} için {yil} yıllık domain kaydı',
            'Required parameter missing: {deger}'      =>  'Gerekli parametre eksik: {deger}',
    );
    Örnek Kullanım
    echo cevir("Active").'<br>';
    echo cevir("Registration of abc123.com for 1 year").'<br>';
    echo cevir("Renewal of abc123.com for 1 year").'<br>';
    echo cevir("Required parameter missing: customer-id").'<br>';
    Çıktı:
    Aktif
    abc123.com için 1 yıllık domain kaydı
    xyz987.net için 1 yıllık domain yenilemesi
    Gerekli parametre eksik: customer-id


    Sanırım kodlar ile ne yapmak istediğim anlaşılmıştır.
    Bu işlemi gettext dışında nasıl yapabilirim?
    Üstte yazdığım fonksiyon kullanışlımıdır sizce?
    En çok merak ettiğimde performasını tabikide.
    çoğul kelimelerde sıkıntı çıkaracak birşey.
    örneğin üsteki dizide sadece 1 yıllık ingilizce kelimeler yer alıyor.
    fakat 1 den büyük olunca years olacağından dizide bulamayacak ve girilen ingilizce değeri olduğu gibi geri döndürecek. buda sıkıntı olacak benim açımdan.
    çoğul kelime döndürebilme ihtimaline karşı bir tane daha ekleme yaparak years yazmam gerekiyor.

    Yada bunları kaldır çöpe at deyipte bu işe yarayan güzel bir class, function hazır var al kullan diyebilir misiniz yada tek çare gettext mi?
  • 21-01-2014, 22:17:20
    #2
    Üyeliği durduruldu
    //tr.php
    $lang = ['renewal' => 'Renewal of %s domain for %d year' ...];
    printf($lang['renewal'], 'r10.net', 10); //Renewal for r10.net domain for 10 year

    Gibi bir sistem kurabilirsin, resellerclub dan gelen değerleri bilmiyorum ama

    Edit...

    Ya da array("Renewal of (\w+) domain for (\d+) year" => '$1 domaini için $2 yıl') gibi bir şeyle eşleştirip direk preg_replace yapabilirsin
  • 21-01-2014, 23:37:41
    #3
    Hyperion adlı üyeden alıntı: mesajı görüntüle
    //tr.php
    $lang = ['renewal' => 'Renewal of %s domain for %d year' ...];
    printf($lang['renewal'], 'r10.net', 10); //Renewal for r10.net domain for 10 year

    Gibi bir sistem kurabilirsin, resellerclub dan gelen değerleri bilmiyorum ama

    Edit...

    Ya da array("Renewal of (\w+) domain for (\d+) year" => '$1 domaini için $2 yıl') gibi bir şeyle eşleştirip direk preg_replace yapabilirsin
    ResellerClub'tan gelen değerler echo olarak bastırdığım değerler hocam.
    yani

    Registration of abc123.com for 1 year
    Registration of abc123.com for 5 years
    Renewal of abc123.com for 9 years
    Renewal of abc123.com for 1 years
    Required parameter missing: token
    Required parameter missing: customer-id
    Required parameter missing: order-id
    Required parameter missing: reseller-id

    gibi belli kalıplarda gelen değerler genelde hocam.


    Gelen Örnek Değerler.
    Registration of abc123.com for 1 year
    Registration of xyzklam.com for 2 years
    Required parameter missing: reseller-id

    Ekrana Basması Gereken Sonuçlar
    abc123.com için 1 yıllık domain kaydı
    xyzklam.com için 2 yıllık domain kaydı
    Gerekli parametre eksik: reseller-id
    Alıntı
    Ya da array("Renewal of (\w+) domain for (\d+) year" => '$1 domaini için $2 yıl') gibi bir şeyle eşleştirip direk preg_replace yapabilirsin
    Üsteki gelen örnek değerleri en son dediğiniz sistemdeki gibi nasıl değiştirebilirim örnek verebilir misiniz hocam.
  • 22-01-2014, 02:26:26
    #4
    Çoklu dil sağlamaya çalışıyorsanız sistemi çeviriyle uğraştırmak son derece gereksiz bir olay olur. Ortalama bir sitedeki toplam statik metinler olsa olsa 50-100 tane olur zaten. Oturup sağlamak istediğiniz her dil için bu metinleri çevirip bahsettiğiniz değişkenler için {degisken} tarzı bir format belirleyip bir dosyaya kaydetmek ve basit bir fonksiyonla bu metinleri gerekli yerde göstermek daha mantıklı olur. Fonksiyonun en temel hali:

    function text()
    {
        // fonksiyona gönderilen tüm parametreler
        $args = func_get_args();
    
        // ilk parametre array'den ÇIKARILIP $textCode değişkenine atanır.
        // çünkü ilk parametre, istenilen metnin dil dosyasında belirtilen kodudur
        $textCode = array_shift($args);
    
        // getCurrentLanguageCode TEMSİLİ FONKSİYONDUR
        // sitedeki aktif dil için belirlenmiş kodu döndürür
        // 'tr', 'en', 'de', 'fr' gibi
        $language = include 'dilDosyalarininBulunduguKlasor/' . getCurrentLanguageCode() . '.php';
    
        $text = $language[$textCode];
    
        // yerine konulması gereken parametre varsa
        if (count($args) > 0)
        {
            // her bir parametre...
            foreach ($args as $arg)
            {
                // ...metindeki soru işareti ile değiştirilir
                str_replace(' ? ', ' ' . $arg . ' ', $text);
            }
        }
    
        return $text;
    }
    Bir dil dosyasının da örnek hali:
    <?php
    
    return array(
        'selamlamaMetni' => 'Merhaba, ?'
    );
    <?php
    
    $veritabanindanGelenIsim = 'Hkan';
    
    // Ekrana "Merhaba, Hkan" stringini yazdırır
    echo text('selamlamaMetni', $veritabanindanGelenIsim);
    Bilgi: Dikkat çektiyse dil dosyasında doğrudan return yaptım array'i. Bu şekilde, fonksiyondaki $language değişkenine dosyada return edilen array atanıyor direk. Geri kalan her şeyi kod içinde yorum satırlarıyla açıklamaya çalıştım.

    Bilgi: Fonksiyonu direk kullanmanızı önermem. Zira fonksiyon her çağırıldığında dil dosyasını tekrar değişkene atıyor. String buffer konularında nasıl bir yönetimi var PHP'nin bilmiyorum ama bu yöntemin performans düşüşü sağlayacağını düşünüyorum. Ordaki yöntem yerine, fonksiyondan hemen önce gerekli dosyaları include dile değişkene atayıp fonksiyondan global yordamıyla ile erişilmesi daha mantıklı olur.

    Kolay gelsin.
  • 22-01-2014, 10:14:03
    #5
    Hkan adlı üyeden alıntı: mesajı görüntüle
    Çoklu dil sağlamaya çalışıyorsanız sistemi çeviriyle uğraştırmak son derece gereksiz bir olay olur. Ortalama bir sitedeki toplam statik metinler olsa olsa 50-100 tane olur zaten. Oturup sağlamak istediğiniz her dil için bu metinleri çevirip bahsettiğiniz değişkenler için {degisken} tarzı bir format belirleyip bir dosyaya kaydetmek ve basit bir fonksiyonla bu metinleri gerekli yerde göstermek daha mantıklı olur. Fonksiyonun en temel hali:

    function text()
    {
        // fonksiyona gönderilen tüm parametreler
        $args = func_get_args();
    
        // ilk parametre array'den ÇIKARILIP $textCode değişkenine atanır.
        // çünkü ilk parametre, istenilen metnin dil dosyasında belirtilen kodudur
        $textCode = array_shift($args);
    
        // getCurrentLanguageCode TEMSİLİ FONKSİYONDUR
        // sitedeki aktif dil için belirlenmiş kodu döndürür
        // 'tr', 'en', 'de', 'fr' gibi
        $language = include 'dilDosyalarininBulunduguKlasor/' . getCurrentLanguageCode() . '.php';
    
        $text = $language[$textCode];
    
        // yerine konulması gereken parametre varsa
        if (count($args) > 0)
        {
            // her bir parametre...
            foreach ($args as $arg)
            {
                // ...metindeki soru işareti ile değiştirilir
                str_replace(' ? ', ' ' . $arg . ' ', $text);
            }
        }
    
        return $text;
    }
    Bir dil dosyasının da örnek hali:
    <?php
    
    return array(
        'selamlamaMetni' => 'Merhaba, ?'
    );
    <?php
    
    $veritabanindanGelenIsim = 'Hkan';
    
    // Ekrana "Merhaba, Hkan" stringini yazdırır
    echo text('selamlamaMetni', $veritabanindanGelenIsim);
    Bilgi: Dikkat çektiyse dil dosyasında doğrudan return yaptım array'i. Bu şekilde, fonksiyondaki $language değişkenine dosyada return edilen array atanıyor direk. Geri kalan her şeyi kod içinde yorum satırlarıyla açıklamaya çalıştım.

    Bilgi: Fonksiyonu direk kullanmanızı önermem. Zira fonksiyon her çağırıldığında dil dosyasını tekrar değişkene atıyor. String buffer konularında nasıl bir yönetimi var PHP'nin bilmiyorum ama bu yöntemin performans düşüşü sağlayacağını düşünüyorum. Ordaki yöntem yerine, fonksiyondan hemen önce gerekli dosyaları include dile değişkene atayıp fonksiyondan global yordamıyla ile erişilmesi daha mantıklı olur.

    Kolay gelsin.
    Öncelikle cevabınız için teşekkür ederim hocam.
    Fakat sorunum şöyle.
    Sizin verdiğiniz örnekte veritabanı demişsiniz ve direk lazım olan değeri çekmişsiniz.

    Fakat benim işlemimde değerler api den geliyor ve direk değer değil bir metin geliyor. Yani her gelen metin içinde bana lazım olan değerler geliyor.

    Alıntı
    Registration of abc123.com for 1 year
    Renewal of abc123.com for 1 year
    Registration of xyzklam.com for 2 years
    Required parameter missing: reseller-id
    Yukarıdaki gibi metinler döndürüyor.
    Ve metinlerin içindeki domain adı, yıl yada eksik parametre gibi değerler bana lazım olan yerler. Api direk bunları değişken olarak vermiyor. Eğer vermiş olsaydı dediğiniz gibi çok mantıklı olurdu. Dediğiniz sistemi kullanmak için her gelen metni regex ile kontrol ettirip lazım olan değerleri kesip almam gerekiyor.

    İstek yollandığım zaman üste yazdığım herhangi bir sonuç gelebilir. Tam olarak geri dönebilecek sonuç bile belli değil.
  • 22-01-2014, 11:17:11
    #6
    Kimlik doğrulama veya yönetimden onay bekliyor.
    bknz: gettext
  • 22-01-2014, 11:24:40
    #7
    saintx adlı üyeden alıntı: mesajı görüntüle
    bknz: gettext
    konuda gettext'i bildiğimi ve kullandığımıda yazdım hocam.
    fakat gettext alternatifi birşey arıyorum kendime.
    po'larla mo'larla uğraşmak istemediğim için.
  • 22-01-2014, 11:38:11
    #8
    S_HA_DO_W adlı üyeden alıntı: mesajı görüntüle
    konuda gettext'i bildiğimi ve kullandığımıda yazdım hocam.
    fakat gettext alternatifi birşey arıyorum kendime.
    po'larla mo'larla uğraşmak istemediğim için.
    görmemişim hocam kusura bakmayın
  • 22-01-2014, 16:36:58
    #9
    Anladım şimdi demek istediğinizi. O durumda bahsettiğiniz gibi regular expressions'tan yararlanmanız gerekiyor.