Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?
Çok dilli bir proje yapmaktayım.
3 dil mevcut. İstediğim şekilde artırabilecek bir yöntem kafama yatmadı. Veritabanı yapım da bir id,code olan tablo ve çevirilerin yer aldığı ikinci bir tablom var.

Başka bir yapıyı taklit etmek istemiştim ama sonra vazgeçtim.
Bu id'ye sahip üç adet urun_id'si aynı olan tablo var. Böylece o id içinde ki tr,ru,en yerelleştirmelerini çağırabiliyorum içeriklerini.
Bunu diğerleri için yapacacağım. 3 adet form var, işte baslik ,rubaslik, enbaslik. Bunları foreach'e çekmeyi düşündüm dillere göre başlarına ekleyebilmesi için
İlk dil, gibi olaylar var büyük oranda trans ve session'a göre ön planda o dilin içerikleri olmalı.
Lisan adında bir tablo oluşturup local'i oradan almalıyımd iye düşünmüştüm sonrasında işin içinden çıkamadım. ManytoMany kullanmak istedim bu seferde pivot erişimi oluyordu ancak benim yapıma uygun gelmedi.
Bunu nasıl yapabilirim, yöntemler nelerdir veya kullandığınız şekliyle ? Dediğim işlemler için translatable şeklinde bir paket var ancak kurcalasamda kayıt çıkış işlemleri konusunda takılınca kendi yöntemlerime geçtim.
Yani böyle üç dilin dışına çıkamıyorum gibi istesem aynı işlemleri tekrar etmek durumundayım. Hardcode oldu biraz.
Ben translatable kullanıyorum, şimdiye kadar bir problem yaşamadım, her türlü dil ihtiyacımı da giderdi.
Peki, formları nasıl gönderiyorsun? Tek seferde hepsini mi yoksa tek tek mi? Formlarda rubaslik , enbaslik yapmak zorunda da kaldım. Hepsini "baslik" olarak döndürdüğümde tek bir form verisi olduğu için üç kere döndürüyor, . Kod kalabalığı olması yanında controller da her dil için ayrı kaydettiriyorum fonksiyon içinde.
->translateOrNew($locale)->baslik
gibi kullanımlar var tam kafama oturmuş değil,
Bunu yapıyorum üç adet güzelce kaydediyor ancak, diğer diller de işin içine girince formdan gelen veriler girince kafam karışıyor.
 foreach (['en', 'ru', 'fr''] as $locale) {
 $article->translateOrNew($locale)->baslik= "Title {$locale}";
 $article->translateOrNew($locale)->icerik = "Text {$locale}";
 }
Temel olarak "form çıkışını" - "controller da ki yapıyı" sorduktan sonra dili artırmak istersem panelden her birini tek tek tanımlayacağım için mümkün olamayacak yani şöyle kullanıyorum ben.
 foreach (['tr', 'ru', 'en'] as $dil) {
 $urun = new Urun;
 $urun->translateOrNew($dil)->baslik = $request->baslik;
 $urun->translateOrNew($dil)->aciklama = $request->aciklama;

 if ($request->resim) {
 $dosya = $request->file('resim');
 $dosyaadi = uniqid() . $dosya->getClientOriginalName();
 $dosya->move('galeri/urun_resim', $dosyaadi);
 $urun->translateOrNew($dil)->resim = $dosyaadi;
 }
 $resimler = $request->resim;
 if($resimler){
 foreach($resimler as $resim){
 $urunresim = new UrunResim;

 $dosyaadi = $resim->getClientOriginalName() . uniqid();
 $resim->move('galeri/urun_resim', $dosyaadi);
 $urunresim->resim = $dosyaadi;
 $urunresim->urun_id = $urun->translateOrNew($dil)->id;
 $urunresim->save();
 }
 }

 $urun->translateOrNew($dil)->kategori_id = $request->kategori;
 $urun->translateOrNew($dil)->title = $request->title;
 $urun->translateOrNew($dil)->desc = $request->desc;
 $urun->translateOrNew($dil)->meta = $request->meta;
 $urun->translateOrNew($dil)->sira = $request->sira;
 $urun->save();

 }
Bu tek birisi için üç adet aynı veriyi döndürüyor. Bunu üç dil için üç kat artırmam gerekiyor anlattığım şekilde olursa. 5 dil seçenekli üç dil olması gerekiyor. Artırma daha iyi olur tabi.
Ek olarak bu lang içerisinde ki dosyayı arayüze nasıl çekebilirim daha sonra panelden değiştirebilmek için artık kaygılanıyorum yapıyı aşar mıyım gibi. Yapan bir kişi var .
https://www.youtube.com/watch?v=gFPP2voJZ2Y O özelliği buradayapan birini gördüm.
  • mgsmus

    Seviye 1379
  • Düzenlendi
/**
 * Menü linkini kaydeder
 *
 * @param MenuRequest|Request $request
 * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
 */
public function store(MenuRequest $request) {
 
 // Öncelikle çok dilli olmayan seçenekleri oluşturuyorum
 $data = [
 'code' => current(array_filter($request->input('title'))), // Burada en az bir dil girileceği için ilk girilen dilin, genellikle Türkçe oluyor, başlığını alıyorum
 'mega' => $request->input('mega')
 ];

 // _locales() burada config('translatable.locales'); döndüren basit bir yardımcı fonksiyon, dizi dönderiyor.
 // Bu kısımda foreach içerisinde çoklu dil olan alanları içeren veri bölümünü oluşturuyorum
 foreach(_locales() as $locale) {
 $data[$locale] = [
 'title' => $request->input("title.$locale"),
 'url' => $request->input("url.$locale"),
 'rel' => $request->input("rel.$locale"),
 ];
 }

 Menu::create($data);

 return redirect()->route('admin.menu.index')->with('success', 'Menü linki eklendi');
}

Şablonlarda da aynı mantıkla alanları oluşturuyorum.
@extends('backend._layout.master')

@section('page-header')
 <div class="page-header">
 <h1 class="page-title">Menü Ekle</h1>
 <p class="description">Ana menüye yeni bir link ekleyin</p>
 </div>
@stop

@section('page-content')
 {!! Form::open(['route'=>'admin.menu.store']) !!}
 
 <div class="panel panel-bordered">
 <div class="panel-body">

 <div class="nav-tabs-horizontal nav-tabs-inverse" data-plugin="tabs">
 <ul class="nav nav-tabs nav-tabs-line" role="tablist">
 @foreach(_locales() as $locale)
 <li class="nav-item" role="presentation">
 <a class="nav-link {{ $loop->first ? 'active':null }}" data-toggle="tab" href="#lang-tab-{{ $locale }}" aria-controls="lang-tab-{{ $locale }}" role="tab" aria-expanded="{{ $loop->first ? 'true':'false' }}">
 {!! flag_img($locale) !!}
 </a>
 </li>
 @endforeach
 </ul>
 <div class="tab-content">
 @foreach(_locales() as $locale)
 <div class="tab-pane p-t-20 {{ $loop->first ? 'active':null }}" id="lang-tab-{{ $locale }}" role="tabpanel" aria-expanded="{{ $loop->first ? 'true':'false' }}">

 <div class="form-group">
 {!! Form::label("title[$locale]",'Başlık *') !!}
 {!! Form::text("title[$locale]",null,['class'=>'form-control']) !!}
 </div>

 <div class="form-group">
 {!! Form::label("url[$locale]",'Link *') !!}
 {!! Form::text("url[$locale]",'#',['class'=>'form-control','required']) !!}
 <span class="text-help">Dış bağlantılar <code>http://</code> ile başlamalı</span>
 </div>

 <div class="form-group">
 {!! Form::label("rel[$locale]",'Özellikler (rel)') !!}
 {!! Form::text("rel[$locale]",null,['class'=>'form-control']) !!}
 <span class="text-help">Yeni sayfada açılması için <code>external</code>, sayfa değerini korumak için <code>nofollow</code> yazabilirsiniz.</span>
 </div>

 </div>
 @endforeach
 </div>
 </div>


 </div>
 </div>

 @include('backend._components.default-form-buttons',['cancel_url' => route('admin.menu.index')])

 {!! Form::close() !!}
@stop
Hmm, Olması gerektiği kadar pratik. Deniyorum şuan. Viewler de fonksiyonu tanımadı. View'e hiç fonksiyon tanıtma ihtiyacı hissetmemiştim, haliyle nasıl olabilir bilmiyorum ? Call to undefined function _locales() Bunları düzenlemek için de aynı yöntemi mi kullanmak gerekiyor malum name="baslik[$tlocale]" olduğu için ikinci bir foreach ile diğer dilleri döndürmek sorun olmaz sanırım.
Bu arada bu fonksiyonu ve kullanımı hiç bir yerde görmedim, dökümantasyona bile koymamışlar.
_locales() benim kendi yazdığım bir yardımcı fonksiyon. Nasıl yapıldığını şurada anlattım:
https://laravel.gen.tr/d/1735/6

Bahsi geçen konuda app/Support/helpers.php dosyası içerisinde yardımcı fonksiyonları tanımlıyorum.
/**
 * Translatable içindeki tüm dilleri ya da aktif uygulama dilini getirir
 *
 * @param bool $current True belirtildiğinde mevcut uygulama dilinin getirilmesini sağlar
 * @return array|string
 */
function _locales($current = false)
{
 if($current) {
 return app()->getLocale();
 }

 return config('translatable.locales');
}
Çoklu dil gereken tüm alanlarda benim _locales() ile yaptığım gibi foreach ile yapmanız gerekiyor. Buradaki amaç, yeni dil eklemek istediğimde sadece config/translatable.php içerisindeki locales dizisine dili eklemem yeterli olmalı.

Yeni dil ekleneceği zaman:
- config/translatable.php içerisine dili ekliyorum
- Mevcut temanın bir kopyasını alıp ilgili dile çeviriyorum. Bende genellikle views içerisinde tr, en, de gibi klasörler olur, her dilin kendine ait şablonu var.
- resources/lang içerisindeki dil klasörlerinden birini kopyalayıp yeni dil için oluşturuyorum.

2-3 saat içerisinde bitmiş oluyor.
Translatable paketinin dokümantasyonunda geçen bir paket var, TranslatableBootForms diye. Adamwathan (Larvel'in contributor'ü) 'ın yaptığı BootForms paketiyle bilrikte çalışıyor. BootForms paketini kullandıktan sonra açıkçası pek kullanma gereği duymadım ancak fikir almak için kullanabilirsin.
mgsmus çok yardımcı oldu desteğin için eyvallah, sanırım bu şey collective paketi olmadan olmuyor. Array to String to Array conversion hatası vermişti. name[{{$locale}}] gibi şeyleri kesinlikle kabul etmiyor zaten.
Proje de ki modelleri ilkel yöntemle yaptım ama bir dahakine bunu kullanırım artık. Dökümanda ki bootform'u farketmemiştim bu arada bilgi için teşekkürler. Bunu yapmadan önce bu yöntemi biliyor olsaydım iyi olurdu
Tekrar konuyu açacağım ama ertelemiştim bunu denediğimde array string conversionbenzeri bir hataveriyor, view sebebiyle local işini view algılamıyor bile. Döngü dönüyor içerisinde $locale tanımlandığındabu şekilde patlıyor.
Bunun nedeni collective diye tahmin ediyordum ama değilmiş. Proje günlere sarktı ilkel yönteme devam ettiğim için yakınıyorum şuan. Diğer özellikler vs. Proje angarya işlerle uğraşmaktan bitmiyor. Düzenleme düzenleme..
Bir daha tevbe.
Beceriksiz miyim neyim ? O eşiği aştım ,null, koymak gerekiyormuş. Yoksa patlıyor collective olmadan nasıl yapılabilir ki bu? Nul'un karşılığı nedir ? Düzenleme için ikinci bir for gerkir mi? Bu da gelen veriyi çoklamak demek. Sonuç olarak verileri yazdırmak için başka foreach gerekiyor _locale de gerekli bir fonksiyon.
Konunun Collective paketi ile ilgisi nedir anlayamadım. Ben sadece formda foreach ile otomatik olarak alanları nasıl oluşturduğumu göstermek istedim. Kodlarınızı görürsem daha çok yardımcı olabilirim.
Sorunları hallettim, collective ile alakası yokmuş. İlk seferinde $locale gelince patlıyordu bana collective kaynaklı olduğunu düşündürttü her niyeyse, kullanım amacını biliyorum ama patladığı için onu denedim. Sorduğum da şuydu, ben collective'a aykırı şeklde value eklemeye çalıştığım için value görmüyordu syntax'ı farklı olduğu için kullanımı öğrendiğimden sorun kalmadı zira dene-yanıl. Ana projenin deadline 'ı geçtiği için ben de hardcode hızlı olur düşüncesiyle girişince gümledi. O yüzden biraz panik havasıyla yazdım. O patlama da collective kaynaklı düşünüyordum dediğim gibi translatable ayarlarına gireyim dedim o da oradan düzeldi, arada kalan hataları da halletmiştim. Sorun yok şuan
Proje bitmeliydi şimdiye hardcode yazıp geçeyim desemde view'lerle başedemedim şimdi bu yönteme geçiyorum ki istersem yüz tane dil ekleyebileyim
10 ay sonra
Merhaba, Öncelikle paylaştığınız bilgiler için teşekkür ederim.

Bende bu paketi kullandım fakat, Edit ve Update işlemini nasıl yapacağımı anlayamadım. Dökümantasyon bilgiler mevcut ama bir türlü çıkamadım işin içinden.
Bootform var fakat paket kullanmak istemedim ? Bunun için nasıl bir yol izlediniz
translatable adında iki paket var, bunlardan hangisi?

github url verir misin @mgsmus
https://github.com/dimsav/laravel-translatable paketi.
$pages = Page::where('id', $id)->first();
{{ Form::text("name[$locale]", $pages->{'name:'.$locale.''}, array('class' => $errors->has("name[$locale]") ? 'form-control error' : 'form-control')) }}
$pages->translate($locale)->name
veya bu şekilde veriyi input içerisine alabiliyorum. Emin olamadım yaptıklarımdan. Tüm verileri nasıl bind edeceğim ve update edeceğim. Ben @mgsmus'un yaptığı gibi yaptım fakat bu noktada kaldım.

https://github.com/Propaganistas/Laravel-Translatable-Bootforms bu paketi kullanmama gerek var mı sizce ?
@sineld
Benim kullandığım
https://github.com/dimsav/laravel-translatable

@baylinux
// Güncelleme formunda mevcut veriyi şu şekilde yazdırabilirsiniz
@foreach(config('translatable.locales') as $locale)
 {!! Form::text("name[{$locale}]", $page->translateOrNew($locale)->name) !!}
@endforeach

// Controller içerisinde ise mevcut bir kaydı güncellemek için benim izlediğim yol aşağıda.
// Üstteki cevaplarda verdiğim kayıt ekleme ile aynı mantık
public function update(Request $request, $id)
{
 // Önce güncellenecek kaydı alıyorum
 $page = Page::findOrFail($id);

 // Daha sonra yeni veriyi tutacak bir dizi oluşturuyorum.
 // İlk girdiğim değerler çeviri olmayan, direk ana tabloya girilen değerler. Örneğin code alanı.
 // Buradaki mantık size kalmış.
 $data = [
 'code' => current(array_filter($request->input('title'))), // Burada ilk girilen, boş olmayan title değerini aldım. Bende genellikle ilk dil Türkçe olduğu için Türkçe title oluyor.
 ];

 // Daha sonra çeviri alanlarını $data dizisine ekliyorum
 // Dizinin bu bölümündeki veri çeviri tablosuna ekleniyor.
 // Bu kısımda veriyi temizleme, boş dillerin eklenmesini engelleme vs size kalmış
 foreach(config('translatable.locales') as $locale) {
 $data[$locale] = [
 'title' => $request->input("title.{$locale}"),
 'content' => $request->input("content.{$locale}"),
 'slug' => $request->input("slug.{$locale}"),
 'meta_title' => $request->input("meta_title.{$locale}"),
 'meta_description' => $request->input("meta_description.{$locale}"),
 ];

 // Burada diğer çok dilli işlemleri yaptırabilirsiniz...
 }

 // Şimdi elimde translatable için uygun yapıya sahip bir $data dizisi var
 // Bununla kaydı güncelliyorum
 $page->update($data);

 // Yönlendirme vs...
 return redirect()->route('admin.pages.index')->with('success', 'Kayıt güncellendi');
}
Yani elinizde yeni kayıt oluşturmak ya da mevcut kaydı güncellemek için örneğin şöyle bir veri yapısının oluşması gerekiyor:
$data = [
 'code' => 'Merhaba Dünya',
 'published_at' => '2018-04-19 03:39:12', 
 'tr' => [
 'title' => 'Merhaba Dünya',
 'slug' => 'merhaba-dunya'
 ],
 'en' => [
 'title' => 'Hello World',
 'slug' => 'hello-world'
 ]
];


pages tablosu
+----+---------------+---------------------+
| id | code | published_at |
+----+---------------+---------------------+
| 1 | Merhaba Dünya | 2018-04-19 03:39:12 |
+----+---------------+---------------------+

page_translations tablosu
+----+---------+--------+---------------+---------------+
| id | page_id | locale | title | slug |
+----+---------+--------+---------------+---------------+
| 1 | 1 | tr | Merhaba Dünya | merhaba-dunya |
| 2 | 1 | en | Hello World | hello-world |
+----+---------+--------+---------------+---------------+
@mgsmus bu pakette Pluralization göremedim ben.Onu nasıl yapıyorsun.
Localize meselesinde asıl ehemmiyetli konu bu aslında.Çok karışık olabiliyor bazen.Laravelin localizationunda bu var mesela.

Birde şunu istiyorum.Mesela ben bir dil dosyasını talep ettiğimde default olarak yazdığım dosyada otomatik olarak gelsin istiyorum.
mesela static değişmeyen datalar mesela.bunlara nasıl çözüm getiriyorsunuz.
Pakette pluralization yok, Laravel'in str_plural() şeklinde helper yöntemi mevcut ama yazdıklarımda ya da paketle ilgili olarak pluralization ile alakalı bir kısım göremedim. Nereden bahsediyorsunuz?

İkinci parağrafta sorduğunuzu biraz daha açıklayabilir misiniz?
mgsmus yazdıPakette pluralization yok, Laravel'in str_plural() şeklinde helper yöntemi mevcut ama yazdıklarımda ya da paketle ilgili olarak pluralization ile alakalı bir kısım göremedim. Nereden bahsediyorsunuz?

İkinci parağrafta sorduğunuzu biraz daha açıklayabilir misiniz?
İşte tam üzerine bastın onu soruyorum.Diyorum ki laravelin localizationundan bu paketin artısı nedir? mesela pluralization yok dedin.
Ama laravelin kendisinde bu var.Sorum basit; sen paket kullanıyorsan demek ki var bir bildiğin.

İkinci kısımdaki sorum su ; mesela static tanımlı değerler var ama tek bir dosyaya bağlı değil.
Mesela button => kaydet gibi...

Kalkıpta bunu her dosyada tanımlamıyorsunuz değil mi? yoksa tanımlıyormusunuz? ben diyorum ki bu tur aynı değere sahip (dil olarakta farketmiyor) kelimeler default dosyada tanımlansın mesela..neyi çağırırsam çağırayım gelsin mesela bunlar...

Yada sen nasıl yapıyorsun bunu ?