28 Ağustos 2010 Cumartesi

Eklentilere Çoklu Dil Desteği Ekleme

Yazdığınız eklentiler ya da tasarladığınız temaların daha çok kişiye ulaşabilmesini sağlamak için onların kolaylıkla başka dillere çevrilmesine imkan vermeniz, artık şart oldu. WordPress dil desteği için GNU Gettext Portable Object Base Translation (POT) denilen bir sistem kullanır. Bu sistemde çeşitli dillere çevrilecek olan metinler .pot uzantılı dosyalara aktarılır. Bu dosyalar derlenerek kullanılır. Kullandığınız eklenti ve temalarda da bu tür dosyalarla karşılaşmışsınızdır (.pot, .po, .mo uzantılı olabilir). Daha önceden eklentileri nasıl Türkçeleştireceğinizi yazmıştım. Bu yazımda da Türkçe olarak yazdığınız bir eklentiye nasıl çoklu dil desteği ekleyebileceğinizi anlatacağım. Böylece eklentinizi WordPress eklenti dizininde yayımlayabilir, daha çok kişinin kullanmasına olanak sağlayabilirsiniz. Merak etmeyin, eklentiniz beğenildiğinde çeşitli ülkelerden kişiler çevirisini yapacaklar ve size göndereceklerdir. Haydi işe başlayalım.

Türkçe Eklentimizi Yazıyoruz

Konuya anlatmak için basit bir Türkçe eklenti yazalım. Eklentimiz, yan menüde kullanıcının belirlediği bir resmi, alt yazısıyla beraber gösteren bir bileşen olsun. Daha önceden WordPress 2.8 için bileşen nasıl yazılır anlatmıştım. Aşağıdaki bileşen kodlarını anlayabilmeniz için lütfen o yazımı dikkatlice okuyunuz. Fazla uzatmadan, bileşenin Türkçe olarak oluşturulmuş kodlarını aşağıya ekliyorum.

Kodu Al
PHP:
  1. /*
  2. Plugin Name: Resim Göster
  3. Plugin URI: http://www.yakupgovler.com/?p=1039
  4. Description: Yan menünüzde resim gösterir.
  5. Version: 1.0
  6. Author: Yakup GÖVLER
  7. Author URI: http://www.yakupgovler.com
  8. */
  9. class yg_show_image extends WP_Widget {
  10. function yg_show_image() {
  11. //Load Language
  12. //load_plugin_textdomain( 'yg-show-img', false, dirname(plugin_basename(__FILE__)) . '/lang' );
  13. $widget_ops = array('description' => 'Yan menünüzde resim gösterir.');
  14. //Create widget
  15. $this->WP_Widget('ygshowimage', 'Resim Göster', $widget_ops);
  16. }
  17. function widget($args, $instance) {
  18. extract($args, EXTR_SKIP);
  19. echo $before_widget;
  20. $title = empty($instance['title']) ? 'Bir Resim' : apply_filters('widget_title', $instance['title']);
  21. //Set a default title if not
  22. $imgurl = esc_url($instance['imgurl']);
  23. $imgtext = esc_attr($instance['imgtext']);
  24. if ( !empty( $title ) ) {
  25. echo $before_title . $title . $after_title;
  26. };
  27. echo '
    ';
  28. echo ' . $imgurl . '" title="'.$imgtext.'" alt="'.$imgtext.'" />
    '
    ;
  29. echo ''.$imgtext.'
    ';
  • echo $after_widget;
  • } //end of widget
  • //Update widget options
  • function update($new_instance, $old_instance) {
  • $instance = $old_instance;
  • //get old variables
  • $instance['title'] = esc_attr($new_instance['title']);
  • $instance['imgurl'] = esc_url($new_instance['imgurl']);
  • $instance['imgtext'] = esc_attr($new_instance['imgtext']);
  • return $instance;
  • } //end of update
  • //Widget options form
  • function form($instance) {
  • $instance = wp_parse_args( (array) $instance, array( 'title' => 'Bir Resim', 'imgurl'=>'', 'imgtext'=>'' ) );
  • $title = esc_attr($instance['title']);
  • $imgurl = esc_url($instance['imgurl']);
  • $imgtext = esc_attr($instance['imgtext']);
  • ?>
  • class="widefat" id="get_field_id('title'); ?>" name="get_field_name('title'); ?>" type="text" value="" />
  • class="widefat" id="get_field_id('imgurl'); ?>" name="get_field_name('imgurl'); ?>" type="text" value="" />
  • class="widefat" id="get_field_id('imgtext'); ?>" name="get_field_name('imgtext'); ?>" type="text" value="" />
  • } //end of form
  • }
  • add_action( 'widgets_init', create_function('', 'return register_widget("yg_show_image");') );
  • //Register Widget
  • ?>
  • Bileşenin Türkçe olarak yazılmış halini indirmek için tıklayınız. Bileşeni sitenize kurup, etkinleştirdiğinizde, bileşen Yönetim Paneli/Görünüm/Bileşenler bölümünde aşağıdaki gibi görünecektir. Gördüğünüz gibi bileşene dair her şey Türkçe olarak çıktı. Şimdi Türkçe olan kısımları öyle bir değiştireceğiz ki kolaylıkla dil dosyası eklenebilir hale gelecek.

    Load_plugin_textdomain(), _e() ve __() Fonksiyonları

    Eklentilere çoklu dil eklemek için bu üç fonksiyon kullanılır. Fonksiyonları kullanımları ve amaçları şöyle: Load_plugin_textdomain() Fonksiyonu: Bu fonksiyon eklentinize ait dil dosyalarından sitede yüklü olan WordPress diline uygun dil dosyasını yükler. Bunu yaparken, wp-config.php dosyasında bulunan define ('WPLANG', 'tr_TR'); satırında yazılı olan dil kodunu (tr_TR bölümü) kullanır. Kullanımı: load_plugin_textdomain( 'yg-show-img', false, dirname( plugin_basename(__FILE__) ) . '/lang' ); 'yg-show-img' : Dil dosyamızın kök adı, buna WordPress domain diyor.. Oluşturacağımız .po uzantılı dosyanın adı yg-show-img.po olacak. Bunu Türkçeye çevirdiğimizde ise yg-show-img-tr_TR.po olarak farklı kaydedeceğiz. false: Kesin dosya adresi vereceğimizi bildirir. dirname( plugin_basename(__FILE__) ): Eklenti dosyamızın bulunduğu klasör adresini verir. Biz bu adresin sonuna dil dosyalarımızı içerisine koyacağımız 'lang' klasörünün adını da ekleyerek, fonksiyona dil dosyasını nerede bulacağını söylüyoruz. Bu fonksiyonu eklentimizin işe başladığı ilk yere ekleyeceğiz yani her zaman ilk çağırılan fonksiyona ya da eklenti dosyamızın en başına ekliyoruz. _e() Fonksiyonu: Bu fonksiyon kendisine verilen domain'e ait dil dosyasından bir satırı yazdırmanızı sağlar. Kullanımı: _e('Image URL', 'yg-show-img'); 'Image URL': Dil dosyasındaki Image URL satırını almasını söyler. load_plugin_textdomain fonksiyonun yüklediği dil dosyasına göre ekranda görünen ifade değişir. Örneğin bu kod Türkçe dil dosyasını lang klasörüne koyduğumuzda 'Resmin Adresi' ifadesini ekrana yazacaktır. Dikkat etmeniz gereken bu ifadenin başına 'echo' komutunu koymadık. 'yg-show-img': Dil dosyasının domain adı yani kök adı. Bu load_plugin_textdomain fonksiyonuna girdiğim ad ile aynı olmalıdır. Aksi halde dil değişimi görülmez. Aynı durum __() fonksiyonu için de geçerlidir. __() Fonksiyonu: Dil dosyasından ilgili satırı alıp, değer olarak döndürür. Yani _e() fonksiyonu gibi ekrana yazdırmaz. Bu daha çok bir değişkene dile bağlı bir ifadeyi aktarmak için kullanılır. Örneğin bileşenimize bir başlık ya da açıklama belirlerken bu fonksiyonu kullanırız. Kullanımı: 'title' => __('An Image', 'yg-show-img'); İfadesi dil dosyasından 'An Image' satırını değer olarak döndürür ve 'title' dizi değişken elemanına aktarır. Türkçe dil dosyası olduğunda bu değer 'Bir Resim' olarak aktarılacaktır. 'yg-show-img' ise dil dosyamızın domain'i.

    Eklentimizi Çoklu Dil Desteğine Hazırlıyoruz

    Bu kadar ön bilgiden sonra artık eklentimizi çoklu dil desteği ekleyebileceğimiz hale getireceğiz. Bunun için yapmamız gereken, eklentimizin her zaman çalışan fonksiyonuna load_plugin_textdomain fonksiyonunu eklemek, Türkçe ifadeleri, ekrana yazdırılması gerekenleri _e() fonksiyonu ile değişken olarak dönmesi gerekenleri __() fonksiyonu ile İngilizce olarak değiştirmek. Aşağıdaki kodlar bu değişimin ve ekleme işleminin yapılmış halidir. Yukarıdaki kod ile aşağıdakini karşılaştırarak, aradaki farkları görebilirsiniz.

    Kodu Al
    PHP:
    1. /*
    2. Plugin Name: Show Image
    3. Plugin URI: http://www.yakupgovler.com/?p=981
    4. Description: Widget displays an image.
    5. Version: 1.0
    6. Author: Yakup GÖVLER
    7. Author URI: http://www.yakupgovler.com
    8. */
    9. class yg_show_image extends WP_Widget {
    10. function yg_show_image() {
    11. //Load Language
    12. load_plugin_textdomain( 'yg-show-img', false, dirname(plugin_basename(__FILE__)) . '/lang' );
    13. $widget_ops = array('description' => __('Show an image on your sidebar.', 'yg-show-img') );
    14. //Create widget
    15. $this->WP_Widget('ygshowimage', __('Show Image', 'yg-show-img'), $widget_ops);
    16. }
    17. function widget($args, $instance) {
    18. extract($args, EXTR_SKIP);
    19. echo $before_widget;
    20. $title = empty($instance['title']) ? __('An Image', 'yg-show-img') : apply_filters('widget_title', $instance['title']);
    21. //Set a default title if not
    22. $imgurl = esc_url($instance['imgurl']);
    23. $imgtext = esc_attr($instance['imgtext']);
    24. if ( !empty( $title ) ) {
    25. echo $before_title . $title . $after_title;
    26. };
    27. echo '
      ';
    28. echo ' . $imgurl . '" title="'.$imgtext.'" alt="'.$imgtext.'" />
      '
      ;
    29. echo ''.$imgtext.'
      ';
  • echo $after_widget;
  • } //end of widget
  • //Update widget options
  • function update($new_instance, $old_instance) {
  • $instance = $old_instance;
  • //get old variables
  • $instance['title'] = esc_attr($new_instance['title']);
  • $instance['imgurl'] = esc_url($new_instance['imgurl']);
  • $instance['imgtext'] = esc_attr($new_instance['imgtext']);
  • return $instance;
  • } //end of update
  • //Widget options form
  • function form($instance) {
  • $instance = wp_parse_args( (array) $instance, array( 'title' => __('An Image','yg-show-img'), 'imgurl'=>'', 'imgtext'=>'' ) );
  • $title = esc_attr($instance['title']);
  • $imgurl = esc_url($instance['imgurl']);
  • $imgtext = esc_attr($instance['imgtext']);
  • ?>
  • class="widefat" id="get_field_id('title'); ?>" name="get_field_name('title'); ?>" type="text" value="" />
  • class="widefat" id="get_field_id('imgurl'); ?>" name="get_field_name('imgurl'); ?>" type="text" value="" />
  • class="widefat" id="get_field_id('imgtext'); ?>" name="get_field_name('imgtext'); ?>" type="text" value="" />
  • } //end of form
  • }
  • add_action( 'widgets_init', create_function('', 'return register_widget("yg_show_image");') );
  • //Register Widget
  • ?>
  • Bileşenimizi bu haliyle indirmek için tıklayınız. Bileşenimiz Türkçe WordPress kurulu sitemizde aşağıdaki gibi görülecek. Eklentimiz için bir dil dosyası oluşturmadığımız için _e() ve __() fonksiyonları içerisine yazdığımız cümleler aynen kullanılırlar. Eklentimiz artık dil dosyası oluşturmaya hazır. Eklentimiz için dil dosyası oluşturmayı öğrenmek için Eklentilere Çoklu Dil Desteği Ekleme - 2 yazımdan devam ediniz.

    Hiç yorum yok:

    Yorum Gönder