Saya telah membangun kerangka kerja pribadi saya yang dimulai sebagai cara untuk mempelajari pola MVC dan sekarang telah berkembang menjadi sesuatu yang saya sukai lebih dari sebagian besar kerangka kerja di luar sana (yang mungkin karena saya menambahkan apa yang saya suka dan mengubah apa yang saya don suka tapi tetap saja) dan baik atau buruk saya menggunakannya di beberapa proyek.
Masalah yang saya miliki sekarang adalah bahwa saya tidak dapat menemukan cara yang layak untuk mengakses fungsionalitas i18n saya (bukan benar-benar i18n itu hanya terjemahan, tidak termasuk dukungan i18n penuh, setidaknya belum).
Cara kerjanya adalah saya menggunakan file konfigurasi sebagai file bahasa karena saya pikir itu akan cukup nyaman untuk menggunakan Config
kelas untuk memuatnya karena dalam kerangka saya file konfigurasi dimuat secara dinamis - tidak dimuat kecuali diperlukan, Anda dapat melihat di sini
class Config {
private static $settings = array();
private function __construct() {
}
public static function load($file) {
$path = PROJECT_PATH . '/config/' . $file . '.php';
if (is_file($path)) {
$settings = require($path);
} else {
throw new Exception('Configuration file [' . $file . '] doesn\'t exist', 500);
}
self::$settings[$file] = $settings;
return true;
}
public static function get($file = null) {
if ($file === null) {
return self::$settings;
} elseif (isset(self::$settings[$file]) || self::load($file)) {
return self::$settings[$file];
}
}
}
Di mana satu file konfigurasi akan terlihat seperti ini
<?php return array(
'setting0' => 'value',
'setting1' => 'value',
....
);
Itu memungkinkan PHP untuk men-cache file-file itu dan memuatnya menjadi sangat cepat.
Sekarang ke terjemahan, seperti yang saya katakan itu adalah file konfigurasi dalam direktori yang berbeda bernama lang
, tapi saya tidak bisa seenaknya memanggil Config::get('lang/en/myLangFile')
setiap kali saya perlu mengakses terjemahan, jadi saya menemukan (menemukan, ya) Translations
kelas, yang mewakili file terjemahan tunggal
class Translations {
protected $data = [];
public function __construct(array $translations) {
$this->data = $translations;
}
public function __get($name) {
return isset($this->data[$name]) ? $this->data[$name] : $name;
}
}
Sekarang sangat nyaman dan indah untuk mengakses terjemahan
$t = new Translations([...]);
echo $t->translationKey;
Saya memiliki Lang
kelas yang digunakan untuk mengatur bahasa pilihan pengguna di antara hal-hal kecil lainnya jadi saya pikir saya akan menggunakannya sebagai pabrik untuk Translations
kelas saya
class Lang {
public static function get($file) {
return new Translations(Config::get('lang/' . self::$lang . '/' . $file));
}
}
Jadi sekarang yang harus saya lakukan untuk mendapatkan beberapa terjemahan adalah
$t = Lang::get('myLangFile');
echo $t->translationKey;
Jika Anda bertanya-tanya mengapa saya memiliki begitu banyak hal statis itu karena kelas-kelas ini tidak masuk akal untuk dipakai dan saya tidak suka pola desain tunggal, saya lebih suka memiliki "kelas statis" walaupun mereka tidak didukung dalam PHP (namun?).
Sejauh ini bagus, saya sudah mendapatkan terjemahannya, tetapi mari kita bahas masalahnya (akhirnya).
Ketika sebuah view di-render, kemungkinan besar akan mencetak beberapa teks kepada pengguna dan untuk itu saya perlu memiliki objek terjemahan yang tersedia di dalam, tetapi cukup merepotkan untuk meneruskannya dari controller karena saya harus pergi dan letakkan itu pada setiap metode dan itu akan menjadi neraka, apalagi jika saya melakukan itu maka beberapa controller lain memanggil tampilan yang sama tanpa terjemahan yang benar, hal-hal yang akan rusak, yang masuk akal tetapi menambah kompleksitas program.
Apa yang telah saya lakukan hingga saat ini adalah di atas setiap tampilan yang saya buat objek terjemahan saya
<?php $t = Lang::get('myLangFile') ?>
<div><?= $t->helloWorld ?></div>
Ini bekerja dan menjamin saya pandangan saya akan bekerja terlepas dari siapa yang memanggil mereka dan pada dasarnya hampir tidak ada biaya dalam hal kinerja karena instantiating Translations
tidak akan menyalin array yang berisi informasi kecuali jika perubahan diperkenalkan karena kode dalam konstruktor hanya tugas, jadi saya kira tidak ada masalah dengan itu tetapi itu hanya mengganggu saya untuk beberapa alasan bahwa itu bukan hal yang benar untuk dilakukan.
Selain itu saya perlu menggunakan Translations
kelas dalam model atau validator sesekali dan saya perlu instantiate di sana juga, jadi dalam satu eksekusi saya mungkin instantiating Translations
objek yang sama beberapa kali. Untuk mengatasi masalah ini, saya harus mulai memasukkan benda-benda ke dalam registri dan saya pikir ini akan menjadi terlalu jauh.
Saya ingin melihat apa saja pemikiran tentang pendekatan ini karena saya bisa dibutakan oleh saya sendiri dan mungkin mendapatkan beberapa saran dan hal berguna. Terima kasih sebelumnya kepada siapa saja yang memilih untuk meluangkan waktu dengan masalah saya!