5 Eylül 2017

Laravel-Vue ikilisinde dil dosyası problemi

ile hasan

Laravel-Vue ikilisini ne kadar övsem az. O nedenle bu kısmı es geçip yaşadığım dil sorununu nasıl aştığımı anlatmak istiyorum.

Laravel’de blade template kullananlar çok dilli bir projeyle ilgileniyorsa lang() veya daha sade haliyle __() fonksiyonunu biliyordur. Kısaca anlatalım. resources/lang klasörü altında “tr”, “en” gibi dil klasörleri oluşturup bunların içine ayrı ayrı kullanabileceğimiz dil dosyaları oluşturuyoruz. Örneğin resources/lang/en/menu.php dosyasının içeriği şu şekilde oluyor.

<?php
return [
'dashboard'=>'Dashboard',   
'system' => 'System', 
'customers'=>'Customers'
];

Bu içeriği şu şekilde çağırıyoruz.

{{ __('menu.dashboard') }}
//veya
@lang('menu.dashboard')

PHP’de işler böyle.. Peki Vue kullandığımızda artık iş PHP’den çıktığı için Javascript’le başbaşa kalıyoruz. O zaman bu dil dosyalarını nasıl kullanabiliriz?

Bunun için çeşitli yaklaşımlar mevcut ancak ben bugün şunu deneyip kullandım. Gayet sade bir çözüm olduğunu düşünüyorum.

var appMenu = new Vue({
            el: '#app-menu',
            data: {
                menuitems:{!! $menuitems !!}},
                lang:{
                    menu:{!! json_encode(__('menu')) !!},
                    something:{!! json_encode(__('something')) !!}
                }
            },
            methods:{
                __:function(key)
                {

                    if (key.match(/\./))
                    {
                        var str = key.split(".")

                        if (typeof this.lang[str[0]] !== "undefined" && typeof this.lang[str[0]][str[1]] !== "undefined")
                            return this.lang[str[0]][str[1]]
                        else
                            return key

                    }
                    else
                        return key;

                }
            }
        });

Kullanımına örnek olarak;

<li v-for="item in menuitems">
@{{__(item.name)}}
</li>

Böylece Blade template’ine çok benzer bir şekilde __() fonksiyonu ile translate yapabiliriz. Bu fonksiyonu her Vue nesnesine tekrar tekrar yazmamak için Mixins yapısı kullanılabilir sanıyorum. Kısaca araştırdım ama uygulamadım. Vue’ya henüz o kadar hakim değilim. Ayrıca bana tek bir yerde bu şekilde kullanmak lazım olduğu için mixins’e ihtiyaç duymadım. İlgilisi bakabilir.