ThinkPHP tidak mempunyai sokongan I18N/L10N yang komprehensif seperti beberapa kerangka yang lebih besar. Walau bagaimanapun, anda boleh melaksanakannya dengan berkesan menggunakan gabungan teknik dan berpotensi memanfaatkan perpustakaan luaran. Strategi teras melibatkan memisahkan rentetan yang diterjemahkan dari kod anda dan menggunakan mekanisme untuk memilih terjemahan yang sesuai berdasarkan lokasi pengguna.
Inilah pendekatan yang sama:
en.php
, es.php
, fr.php
) dalam direktori khusus (misalnya, application/lang
). Setiap fail akan mengandungi array bersekutu di mana kunci mewakili pengenal unik untuk rentetan dan nilai anda mewakili teks yang diterjemahkan. Sebagai contoh, en.php
:<code class="php"><?php return [ 'hello' => 'Hello', 'welcome' => 'Welcome to our website!', 'login' => 'Login', ];</code>
Pengesanan bahasa: Tentukan bahasa pilihan pengguna. Ini boleh dilakukan melalui beberapa kaedah:
$_SERVER['HTTP_ACCEPT_LANGUAGE']
untuk mendapatkan bahasa pilihan penyemak imbas. Ini sering tidak boleh dipercayai, tetapi titik permulaan yang baik./en
, /es
).Lang
ThinkPhp (jika tersedia dalam versi anda) atau fungsi tersuai. Contoh menggunakan fungsi tersuai:<code class="php">function loadLanguage($locale = 'en') { $langFile = APP_PATH . 'lang/' . $locale . '.php'; if (file_exists($langFile)) { return require $langFile; } return []; // Fallback to default language } $lang = loadLanguage(getLocale()); // getLocale() is a helper function to detect the locale</code>
<code class="php">echo $lang['hello']; // Outputs "Hello" (or the translation in the selected language)</code>
Ingatlah untuk mengendalikan kesilapan yang berpotensi dengan anggun jika kunci terjemahan hilang.
'submit'
, gunakan 'submit_form'
. ThinkPhp tidak mempunyai i18n terbina dalam tarikh dan pemformatan nombor. Anda perlu menggunakan pelanjutan Intl
PHP. Pastikan ia didayakan dalam konfigurasi PHP anda.
Kelas IntlDateFormatter
dan NumberFormatter
dalam lanjutan Intl
adalah penting. Inilah contoh:
<code class="php">use IntlDateFormatter; use NumberFormatter; // ... (Language detection as before) ... $formatter = new IntlDateFormatter($locale, IntlDateFormatter::LONG, IntlDateFormatter::NONE); echo $formatter->format(time()); // Formats the current date according to the locale $numberFormatter = new NumberFormatter($locale, NumberFormatter::DECIMAL); echo $numberFormatter->format(1234.56); // Formats the number according to the locale</code>
Ingatlah untuk menyesuaikan pemalar gaya IntlDateFormatter
(misalnya, IntlDateFormatter::SHORT
, IntlDateFormatter::MEDIUM
) untuk memadankan format tarikh/masa yang anda inginkan. Begitu juga, laraskan gaya NumberFormatter
seperti yang diperlukan.
Tidak ada sambungan ThinkPHP yang khusus, khusus yang hanya tertumpu pada I18N/L10N. Pendekatan yang digariskan di atas biasanya mencukupi. Walau bagaimanapun, anda boleh memanfaatkan perpustakaan PHP yang ada seperti:
Ingatlah bahawa untuk aplikasi yang lebih mudah, pendekatan manual yang diterangkan dalam bahagian pertama mungkin mencukupi. Untuk projek yang lebih besar dengan banyak terjemahan, pendekatan yang lebih berstruktur menggunakan gettext
atau perpustakaan yang sama mungkin lebih baik. Berhati -hati menimbang kerumitan integrasi terhadap manfaat sebelum memilih perpustakaan tertentu.
Atas ialah kandungan terperinci Bagaimanakah saya melaksanakan pengantarabangsaan (I18N) dan penyetempatan (L10N) dalam ThinkPHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!