• 06-11-2018, 21:49:25
    #1
    Multi Dil desteği ve (.PO .MO) dosyaları
    Herkese merhaba.

    Arkadaşlar PHP' de bir multilang desteği için script yazıyorum. Aklıma wordpress'in Türkçe dil desteği geldi.

    Kendisi .PO ve .MO adında
    tr_TR.PO tr_TR.MO
    şeklinde dosyalardan inglizce terimin veya kelimenin karşılığına Türkçesini yazmışlar.


    msgstr ""
    "Merhaba,\n"
    "\n"
    "###SITENAME### sitesindeki kişisel verilerinizi silme isteğiniz tamamlandı.\n"
    "\n"
    "Bu konuyla ilgili herhangi bir sorunuz veya endişeniz varsa lütfen site yöneticisine başvurun.\n"
    "\n"
    "Daha fazla bilgi için gizlilik politikamızı da okuyabilirsiniz: ###PRIVACY_POLICY_URL###\n"
    "\n"
    "Saygılarımızla,\n"
    "###SITENAME###\n"
    "###SITEURL###"
    
    #. translators: Do not translate SITENAME, SITEURL; those are placeholders.
    #: wp-includes/user.php:3080
    msgid ""
    "Howdy,\n"
    "\n"
    "Your request to erase your personal data on ###SITENAME### has been completed.\n"
    "\n"
    "If you have any follow-up questions or concerns, please contact the site administrator.\n"
    "\n"
    "Regards,\n"
    "All at ###SITENAME###\n"
    "###SITEURL###"
    msgstr ""
    "Merhaba,\n"
    "\n"
    "###SITENAME### sitesindeki kişisel verilerinizi silme isteğiniz tamamlandı.\n"
    "\n"
    "Bu konuyla ilgili herhangi bir sorunuz veya endişeniz varsa lütfen site yöneticisine başvurun.\n"
    "\n"
    "Saygılarımızla,\n"
    "###SITENAME###\n"
    "###SITEURL###"

    Şimdi anlaşılan o ki yaptıkları scriptler o kelimeleri bulup oradan değiştiriyor. Bu çok iyi çünkü verileri database de saklamak zorunda da kalmıyorsun böylelikle.

    hatta
    ###SITEURL###
    gibi özel değişkenler bile tanımlayabiliyorsun görünene göre.

    Ancak bir türlü bulamadım. Bu PO MO nasıl çalışır? PHP bunu nasıl okur? İçinden veriyi nasıl çeker? Buna dair bir uygulamada bulamadım.

    Dedim ki bunu bilse bilse r10 ailesi bilir

    PO - MO dosyasını nasıl çekeceğiz? İçindeki verileri nasıl SWITCH edeceğiz?

    Saygılar.
  • 06-11-2018, 21:53:39
    #2
    takip
  • 06-11-2018, 21:56:16
    #3
    Poedit programıyla bu dosyaları düzenleyebilirsin. Anlaşılır arayüzü var zaten.

    http://www.php.net/manual/en/book.gettext.php adresini incelersen basit bir şekilde anlatımı var.
  • 06-11-2018, 22:09:17
    #4
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Prototype adlı üyeden alıntı: mesajı görüntüle
    Multi Dil desteği ve (.PO .MO) dosyaları
    Herkese merhaba.

    Arkadaşlar PHP' de bir multilang desteği için script yazıyorum. Aklıma wordpress'in Türkçe dil desteği geldi.

    Kendisi .PO ve .MO adında
    tr_TR.PO tr_TR.MO
    şeklinde dosyalardan inglizce terimin veya kelimenin karşılığına Türkçesini yazmışlar.


    msgstr ""
    "Merhaba,n"
    "n"
    "###SITENAME### sitesindeki kişisel verilerinizi silme isteğiniz tamamlandı.n"
    "n"
    "Bu konuyla ilgili herhangi bir sorunuz veya endişeniz varsa lütfen site yöneticisine başvurun.n"
    "n"
    "Daha fazla bilgi için gizlilik politikamızı da okuyabilirsiniz: ###PRIVACY_POLICY_URL###n"
    "n"
    "Saygılarımızla,n"
    "###SITENAME###n"
    "###SITEURL###"
    
    #. translators: Do not translate SITENAME, SITEURL; those are placeholders.
    #: wp-includes/user.php:3080
    msgid ""
    "Howdy,n"
    "n"
    "Your request to erase your personal data on ###SITENAME### has been completed.n"
    "n"
    "If you have any follow-up questions or concerns, please contact the site administrator.n"
    "n"
    "Regards,n"
    "All at ###SITENAME###n"
    "###SITEURL###"
    msgstr ""
    "Merhaba,n"
    "n"
    "###SITENAME### sitesindeki kişisel verilerinizi silme isteğiniz tamamlandı.n"
    "n"
    "Bu konuyla ilgili herhangi bir sorunuz veya endişeniz varsa lütfen site yöneticisine başvurun.n"
    "n"
    "Saygılarımızla,n"
    "###SITENAME###n"
    "###SITEURL###"
    Şimdi anlaşılan o ki yaptıkları scriptler o kelimeleri bulup oradan değiştiriyor. Bu çok iyi çünkü verileri database de saklamak zorunda da kalmıyorsun böylelikle.

    hatta
    ###SITEURL###
    gibi özel değişkenler bile tanımlayabiliyorsun görünene göre.

    Ancak bir türlü bulamadım. Bu PO MO nasıl çalışır? PHP bunu nasıl okur? İçinden veriyi nasıl çeker? Buna dair bir uygulamada bulamadım.

    Dedim ki bunu bilse bilse r10 ailesi bilir

    PO - MO dosyasını nasıl çekeceğiz? İçindeki verileri nasıl SWITCH edeceğiz?

    Saygılar.
    Po Mo kullanacagına lang.php kullanabılırsın hocam en.php tr.php dıye bunları yonlendırme ıle verebılırsın orneklerı mevcut google php multi language (yada türkçe olarak ) sorgularsan bir çok örneği mevcut aynı yapı mantığı
  • 06-11-2018, 22:28:46
    #5
    subasioguz adlı üyeden alıntı: mesajı görüntüle
    Poedit programıyla bu dosyaları düzenleyebilirsin. Anlaşılır arayüzü var zaten.

    http://www.php.net/manual/en/book.gettext.php adresini incelersen basit bir şekilde anlatımı var.
    Bir inceleyim hocam ben bulamamıştım. Teşekkürler



    Selotek adlı üyeden alıntı: mesajı görüntüle
    Po Mo kullanacagına lang.php kullanabılırsın hocam en.php tr.php dıye bunları yonlendırme ıle verebılırsın orneklerı mevcut google php multi language (yada türkçe olarak ) sorgularsan bir çok örneği mevcut aynı yapı mantığı
    Hocam çok haklısın php de yapılabilir ama bu .PO .MO nun başka bir mantığı var. Hatta "locale" suna bilmen için belirli w3 ler de var. POMO da bu noktada devreye giriyor ki işte onu öğrenmek istiyorum aslında.


    Biraz araştırdım, tıpkı bizim php de yaptığımız gibi
    $_GET
    veya
    $_SESSION
    kullanarak POMO dan çekiyor ama bunun bir global standartları var.

    Yani yaptığın script vesaire her ne ise 3. bir dil eklemeye olanak vermiyorsa buna
     Localization
    denmiyor imiş. Bunu da yeni öğrendim mesela.

    Bir de
    Internationalization
    var ki bu da text'in de ötesinde bir değişim gerektiriyor sanırım.

    https://www.w3.org/International/questions/qa-i18n

    Bir de bu tarz işlerde
    Accept-Language
    (Otomatik algılama) kullanımı hakkında w3 ün bir yazısı var.

    https://www.w3.org/International/que...t-lang-locales

    Burada da diyor ki, otomatik dil algılamasını kullanmanız faydalı olabilir ancak bu otomatik algılama sonradan sonraya konum bilgisi için kullanılmaya başladığından başka bir ülkeye giden kişi için o dili kullanmaya zorlamış olursun diyor. o yüzden bunu kullanabilirsin ama her zaman için diller arası "switch" esnekliğini de barındırmalısın diyor.

    3 aşağı 5 yukarı teknik bilgileri öğrendim şimdi şu PO MO yu tam olarak çözmekte sıra :P



    Arkadaşlar yanlışım var ise gene düzeltin; araştırmalarım sonucu:

    Bizim klasik metodlarımızdan öte, daha global bir şeyler yapmak istiyorsak bu sistem şart.

    .Po.Mo dosyalarını kullanabilmek için de gettext
    http://php.net/manual/tr/book.gettext.php
    'in sunucunuzda kurulu olması gerekiyor. Bunun içinde
    http://www.gnu.org/software/gettext/gettext.html
    bu application kuruluyor. Sonrasında her şey bahsettiğim gibi işliyor. Ancak harici bir kütüphanenin PHP ye kurulması gereği beni soğuttu.

    Ki bu işi gerçek anlamda
    (I18n)
    yapmak isteyen başka kişileri de soğutmuş ki adamlar I
    18n.php
    class ları yazmışlar.

    Şimdi diyeceksiniz ki, en başta da bunu demedik mi zaten diye

    Ama bunlar da bizim yaptıklarımızın ötesinde. Tıpkı PO MO gibi çalışma mantığı var.
    .ini
    kullananlar olmuş.
    .JSON
    kullananlar olmuş vesaire vesaite. Ama mantık olarak herkes aynı yolu benimsemiş.

    Şimdi bir tane class buldum. Onu test edeceğim. İzlenimlerimi yazarım. Gerçekten bu tarz aksiyonlara girmenin bir faydası var mı yoksa klasik metodlar yeterli mi bu soruya da cevap bulmuş oluruz diye umut ediyorum.
  • 06-11-2018, 23:51:41
    #6
    Üyeliği durduruldu
    Prototype adlı üyeden alıntı: mesajı görüntüle
    Bir inceleyim hocam ben bulamamıştım. Teşekkürler





    Hocam çok haklısın php de yapılabilir ama bu .PO .MO nun başka bir mantığı var. Hatta "locale" suna bilmen için belirli w3 ler de var. POMO da bu noktada devreye giriyor ki işte onu öğrenmek istiyorum aslında.


    Biraz araştırdım, tıpkı bizim php de yaptığımız gibi
    $_GET
    veya
    $_SESSION
    kullanarak POMO dan çekiyor ama bunun bir global standartları var.

    Yani yaptığın script vesaire her ne ise 3. bir dil eklemeye olanak vermiyorsa buna
     Localization
    denmiyor imiş. Bunu da yeni öğrendim mesela.

    Bir de
    Internationalization
    var ki bu da text'in de ötesinde bir değişim gerektiriyor sanırım.

    https://www.w3.org/International/questions/qa-i18n

    Bir de bu tarz işlerde
    Accept-Language
    (Otomatik algılama) kullanımı hakkında w3 ün bir yazısı var.

    https://www.w3.org/International/que...t-lang-locales

    Burada da diyor ki, otomatik dil algılamasını kullanmanız faydalı olabilir ancak bu otomatik algılama sonradan sonraya konum bilgisi için kullanılmaya başladığından başka bir ülkeye giden kişi için o dili kullanmaya zorlamış olursun diyor. o yüzden bunu kullanabilirsin ama her zaman için diller arası "switch" esnekliğini de barındırmalısın diyor.

    3 aşağı 5 yukarı teknik bilgileri öğrendim şimdi şu PO MO yu tam olarak çözmekte sıra :P



    Arkadaşlar yanlışım var ise gene düzeltin; araştırmalarım sonucu:

    Bizim klasik metodlarımızdan öte, daha global bir şeyler yapmak istiyorsak bu sistem şart.

    .Po.Mo dosyalarını kullanabilmek için de gettext
    http://php.net/manual/tr/book.gettext.php
    'in sunucunuzda kurulu olması gerekiyor. Bunun içinde
    http://www.gnu.org/software/gettext/gettext.html
    bu application kuruluyor. Sonrasında her şey bahsettiğim gibi işliyor. Ancak harici bir kütüphanenin PHP ye kurulması gereği beni soğuttu.

    Ki bu işi gerçek anlamda
    (I18n)
    yapmak isteyen başka kişileri de soğutmuş ki adamlar I
    18n.php
    class ları yazmışlar.

    Şimdi diyeceksiniz ki, en başta da bunu demedik mi zaten diye

    Ama bunlar da bizim yaptıklarımızın ötesinde. Tıpkı PO MO gibi çalışma mantığı var.
    .ini
    kullananlar olmuş.
    .JSON
    kullananlar olmuş vesaire vesaite. Ama mantık olarak herkes aynı yolu benimsemiş.

    Şimdi bir tane class buldum. Onu test edeceğim. İzlenimlerimi yazarım. Gerçekten bu tarz aksiyonlara girmenin bir faydası var mı yoksa klasik metodlar yeterli mi bu soruya da cevap bulmuş oluruz diye umut ediyorum.
    hadi bakalım farkı bir yol olmuş olur en azından bizler için ama bu kadar zamanım olmadığı için ci kodlamasıyla yaptıgım için zaten yeterince basit gelmekte dahada komplike birşeye girmeyi düşünmedim ama farklı bir proje üzerinde çalışılabilir merakla beklemekteyim
    detaylarınızı
  • 07-11-2018, 01:38:23
    #7
    Selamlar,

    Şuan geliştirmeye devam ettiğim CMS üzerinde bahsettiğiniz yapıyı bende kurdum ve veritabanı ile çalıştım. Cache üzerinden performans kaybı yaşamadan hızlı işlem yapabildiğim için bu durum beni çok rahatsız etmedi. Ancak yine .net ile geliştirdiğimiz farklı bir projede bunu xml üzerinden yapmıştık. Xml'de mantık tr_TR.xml dosyasında
    <lang>
      <item id="changedlng">Dil Değiştirildi</item>
      <item id="Language">Dil</item>
      <item id="Languages">Diller</item>
      <item id="Country">Ülke</item>
      <item id="Countries">Ülkeler</item>
      <item id="City">Şehir</item>
      <item id="Cities">Şehirler</item> </lang>
    şeklindeydi ve bunu T adında bir methodla örneğin T("changedLng") çağrıldığında bu node var ise değeri yok ise parametre olarak alınan "changedLng" id'sini döner. Localization kısmında ise tarayıcı header'ından gelen dil koduna göre örneğin en_GB adında xml dosyası var ise verileri ordan okur yok ise default atanan xml'den çalıştırır.

    Php tarafında çok fazla tecrübem yok ancak benzeri bir yapı ile bahsettiğiniz olayı çözebilirsiniz. Bunun için xml yerine json veya herhangi bir şekilde formatına uygun .txt .lang vb kendinize özel bir dosya oluşturabilirsiniz. İçersinde ##{{}} benzeri özel yapılar oluşturarak aynı dosyada ki değerleri şablona uygun replace edebilirsiniz..
  • 07-11-2018, 23:13:21
    #8
    caneralcilioglu adlı üyeden alıntı: mesajı görüntüle
    Selamlar,

    Şuan geliştirmeye devam ettiğim CMS üzerinde bahsettiğiniz yapıyı bende kurdum ve veritabanı ile çalıştım. Cache üzerinden performans kaybı yaşamadan hızlı işlem yapabildiğim için bu durum beni çok rahatsız etmedi. Ancak yine .net ile geliştirdiğimiz farklı bir projede bunu xml üzerinden yapmıştık. Xml'de mantık tr_TR.xml dosyasında
    <lang>
      <item id="changedlng">Dil Değiştirildi</item>
      <item id="Language">Dil</item>
      <item id="Languages">Diller</item>
      <item id="Country">Ülke</item>
      <item id="Countries">Ülkeler</item>
      <item id="City">Şehir</item>
      <item id="Cities">Şehirler</item> </lang>
    şeklindeydi ve bunu T adında bir methodla örneğin T("changedLng") çağrıldığında bu node var ise değeri yok ise parametre olarak alınan "changedLng" id'sini döner. Localization kısmında ise tarayıcı header'ından gelen dil koduna göre örneğin en_GB adında xml dosyası var ise verileri ordan okur yok ise default atanan xml'den çalıştırır.

    Php tarafında çok fazla tecrübem yok ancak benzeri bir yapı ile bahsettiğiniz olayı çözebilirsiniz. Bunun için xml yerine json veya herhangi bir şekilde formatına uygun .txt .lang vb kendinize özel bir dosya oluşturabilirsiniz. İçersinde ##{{}} benzeri özel yapılar oluşturarak aynı dosyada ki değerleri şablona uygun replace edebilirsiniz..
    Aynen hocam mantık aynı.


    ________________


    Arkadaşlar yukarıda bahsettiğim gibi gettext i kurmak vesaite hem meşakatli hem de bir geliştiricinin istemeyeceği bir durum...

    Bu nedenle bu sorunları aşmak adına (Aynı mantıkla çalışan) Class yazdıklarından bahsetmiştim.

    İçlerinden en beğendiğimi epey araştırdım.

    ".ini"
    ve
    ".json"
    üzerinde çalışabiliyor.

    Ağaç mantığı ile değişkenler atamanıza olanak sağlıyor.

    Otomatik dil algılaması yapabiliyor.

    Manuel olarak (?lang=en) gibi dil ayarlaması yapmanıza olanak veriyor.

    Gene manuel olarak SESSION üstünde bir "lang" değeri kayıt etmişseniz onu da destekliyor.

    Yukarıda yazdığım sıraya göre son yazılan bir öncekine baskın geliyor.

    Bununla birlikte algıladığı diller arasında sizin dil dosyanız yok ise, otomatik destek sağlıyor ( Fallback ) mesela ingilizceyi ayarlarsan default olarak onu gösteriyor.

    Ayrıca diyelim ki İnglizceyi geliştirmeye başladınız ama bazı değişkenler eksik. Böyle bir durumda eksik olan yeri default dilden çekme özelliği de var.

    Belirli koşullarda (şartlar kullanarak) bir dil'i zorlayabiliyorsun. Mesela adam Türk ama Amerika da, ona illa ingilizce dil gösterebiliyorsun.

    En güzeli de yeni diller ekleyebiliyor veya çıkarabiliyorsun.

    Bir başka beğendiğim nokta ise (CACHE) özelliği mevcut.

    Yani bir kişi default olmayan bir dil seçtiğinde (HER SEFERİNDE FONKSİYON ÇALIŞIP .JSON çalışmıyor. Ön bellekten çekiyor. Eğer .json dosyası değişirse otomatik olarak cache'i yeniliyor.

    Tabi eklemezsek ayıp olur, çalışma mantığı tıpkı gettext deki gibi. PO MO yerine json kullanıyorsun veya .ini .yml gibi formatları destekliyor.

    Ben çok beğendim.

    İsterseniz bir inceleyin.

    Konuyu açmaktaki amacıma da kısmen de olsa ulaştım. Biraz klasik metodlara benzeyen biraz da gettext 'İ andıran, Yani Hybirt bir sistem kullanmış olacağım ki bu da benim için yeterli

    Şimdi SESSION 'u COOKIE' e çevirmeyi deniyeceğim. Bir lang tercih kaydı için boştan yere sunucuyu yormaya gerek yok, browserde kalsın kişinin tercihi...

    Bu arada bu saydıklarımı Wordpress'e entegre ettim az önce.

    Bunun için wp nin (endpoint) özelliğini kullanıp ornek.com/merhaba-dunya/en gibi bir url yapısı oluşturdum.

    Fork ladığım projeyi paylaşayım isterseniz orijinaline ulaşırsınız. Çünkü eğer yapabilirsem COOKIE li versiyonunu da oraya yüklerim.

    https://github.com/ionurboz/php-i18n

    Bu da en.json dan basit bir örnek:

    	"site": {
    	   "title": "Site Title"
    	},
    	
        "header": {
            "navbar": {
               "products": "Products",
               "productsmarketplace": "Marketplace"
            }
        }
    }
    Esenlikler.
  • 04-11-2019, 11:38:18
    #9
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Prototype adlı üyeden alıntı: mesajı görüntüle
    Aynen hocam mantık aynı.


    ________________


    Arkadaşlar yukarıda bahsettiğim gibi gettext i kurmak vesaite hem meşakatli hem de bir geliştiricinin istemeyeceği bir durum...

    Bu nedenle bu sorunları aşmak adına (Aynı mantıkla çalışan) Class yazdıklarından bahsetmiştim.

    İçlerinden en beğendiğimi epey araştırdım.

    ".ini"
    ve
    ".json"
    üzerinde çalışabiliyor.

    Ağaç mantığı ile değişkenler atamanıza olanak sağlıyor.

    Otomatik dil algılaması yapabiliyor.

    Manuel olarak (?lang=en) gibi dil ayarlaması yapmanıza olanak veriyor.

    Gene manuel olarak SESSION üstünde bir "lang" değeri kayıt etmişseniz onu da destekliyor.

    Yukarıda yazdığım sıraya göre son yazılan bir öncekine baskın geliyor.

    Bununla birlikte algıladığı diller arasında sizin dil dosyanız yok ise, otomatik destek sağlıyor ( Fallback ) mesela ingilizceyi ayarlarsan default olarak onu gösteriyor.

    Ayrıca diyelim ki İnglizceyi geliştirmeye başladınız ama bazı değişkenler eksik. Böyle bir durumda eksik olan yeri default dilden çekme özelliği de var.

    Belirli koşullarda (şartlar kullanarak) bir dil'i zorlayabiliyorsun. Mesela adam Türk ama Amerika da, ona illa ingilizce dil gösterebiliyorsun.

    En güzeli de yeni diller ekleyebiliyor veya çıkarabiliyorsun.

    Bir başka beğendiğim nokta ise (CACHE) özelliği mevcut.

    Yani bir kişi default olmayan bir dil seçtiğinde (HER SEFERİNDE FONKSİYON ÇALIŞIP .JSON çalışmıyor. Ön bellekten çekiyor. Eğer .json dosyası değişirse otomatik olarak cache'i yeniliyor.

    Tabi eklemezsek ayıp olur, çalışma mantığı tıpkı gettext deki gibi. PO MO yerine json kullanıyorsun veya .ini .yml gibi formatları destekliyor.

    Ben çok beğendim.

    İsterseniz bir inceleyin.

    Konuyu açmaktaki amacıma da kısmen de olsa ulaştım. Biraz klasik metodlara benzeyen biraz da gettext 'İ andıran, Yani Hybirt bir sistem kullanmış olacağım ki bu da benim için yeterli

    Şimdi SESSION 'u COOKIE' e çevirmeyi deniyeceğim. Bir lang tercih kaydı için boştan yere sunucuyu yormaya gerek yok, browserde kalsın kişinin tercihi...

    Bu arada bu saydıklarımı Wordpress'e entegre ettim az önce.

    Bunun için wp nin (endpoint) özelliğini kullanıp ornek.com/merhaba-dunya/en gibi bir url yapısı oluşturdum.

    Fork ladığım projeyi paylaşayım isterseniz orijinaline ulaşırsınız. Çünkü eğer yapabilirsem COOKIE li versiyonunu da oraya yüklerim.

    https://github.com/ionurboz/php-i18n

    Bu da en.json dan basit bir örnek:

    	"site": {
    	   "title": "Site Title"
    	},
    	
        "header": {
            "navbar": {
               "products": "Products",
               "productsmarketplace": "Marketplace"
            }
        }
    }
    Esenlikler.
    Hocam sayfa yenilenmeden dil değişimi yapmak mümkün mü? ben kurdum i18n yi ama dil değişimi switch konusunda bilgim yok. istediğim sayfa yenilenmeden isteyen kişinin dili değiştirebilmesi.