Elysion Şöyle yapabilirsiniz:
languages
+----+------+-----------+-------------+-------+
| id | code | name | native_name | rtl |
+----+------+-----------+-------------+-------+
| 1 | tr | Türkçe | Türkçe | false |
| 2 | en | İngilizce | English | false |
| 3 | de | Almanca | Deutsch | false |
| 4 | ar | Arapça | عربي | true |
+----+------+-----------+-------------+-------+
translation_keys
+----+-----------------------------+
| id | key |
+----+-----------------------------+
| 1 | Merhaba! |
| 2 | Giriş yapın ya da kaydolun. |
+----+-----------------------------+
translations
+----+---------+--------+-----------------------------+
| id | lang_id | key_id | val |
+----+---------+--------+-----------------------------+
| 1 | 1 | 1 | Merhaba! |
| 2 | 2 | 1 | Hello! |
| 3 | 2 | 2 | Log in or register. |
| 4 | 3 | 2 | Anmelden oder Registrieren. |
+----+---------+--------+-----------------------------+
translation_keys tablosu sisteminizdeki tüm çeviri anahtarlarını içerecek, yani __('key') olarak kullanılanlar. Yeni bir dil eklediğinizde dil için bir translations kopyası oluşturacaksınız:
$lang = Language::find(5);
$keys = TranslationKey::pluck('key', 'id');
$insertData = [];
foreach($keys as $id => $key) {
$insertData[] = [
'lang_id' => $lang->id,
'key_id' => $id,
'val' => $key,
];
}
Translation::insert($insertData);
Artık bu dil için translations tablosunu düzenletecek bir sayfa oluşturabilirsiniz. Eğer tek sayfada tüm dilleri güncelleyebileceğiniz excel gibi bir tablo yapısı kurmak isterseniz:
$langs = Language::with('translations')
->get();
$keys = TranslationKey::pluck('key', 'id');
<table>
<thead>
<tr>
<th>Anahtar</th>
@foreach($langs as $lang)
<th>{{ $lang->name }}</th>
@endforeach
</tr>
<thead>
<tbody> @foreach($keys as $id => $key)
<tr>
<td>{{ $key }}</td>
@foreach($langs as $lang)
<td>
<input name="trans[{{ $lang->id }}][{{ $id }}]" value="{{ $lang->translations->firstWhere('key_id', $id)?->val }}"/>
</td>
@endforeach
</tr>
@endforeach
<tbody>
</table>
Diller ile işiniz bitince bunları dosyaya çevireceksiniz. Mesela ben lang/tr.json, lang/en.json şeklinde kullanıyorum. Öyleyse:
$langs = Language::with('translations.key')
->get();
foreach($langs as $lang) {
$contents = $lang->translations
->map(function($translation) {
return [
$translation->key->key => $translation->val,
];
})
->flatMap(fn($v) => $v)
->toJson();
file_put_contents(lang_path("{$lang->code}.json"), $contents);
}
gibi...