Dalam PHP, IntCalendar mengeluarkan tempat yang salah.
P粉553428780
2023-07-28 12:49:22
<p>Saya mempunyai kod berikut, yang saya percaya sepatutnya mengeluarkan fr_FR sebagai tempat, tetapi atas sebab tertentu ia mengeluarkan en_US_POSIX (tanpa mengira zon waktu). Apa yang saya buat salah? </p>
<pre class="brush:php;toolbar:false;">$loc = IntlCalendar::createInstance(new DateTimeZone('Eropah/Paris'));
echo $loc->getLocale(Locale::VALID_LOCALE);</pre>
<p>Pautan rujukan: https://www.php.net/manual/en/intlcalendar.createinstance.php dan https://www.php.net/manual/en/intlcalendar.getlocale.php<br /> ;<br />Nampaknya ini bukan pendekatan yang betul (walaupun kod itu sah) - adakah terdapat cara yang lebih sesuai untuk mencari tempat "lalai" untuk zon waktu tertentu? </p><p><br /></p>
Anda tetapkan zon waktu anda kepada zon waktu Paris. Tetapi anda tidak menetapkan tempat. Mereka adalah perkara yang berbeza. Tempatan mentakrifkan bahasa dan konvensyen pemformatan, manakala zon waktu menetapkan peraturan untuk menukar UTC kepada waktu tempatan dan kembali lagi. Perkara yang anda takrifkan terpakai kepada rakyat Amerika di Paris. Ini adalah kes penggunaan yang sah, terutamanya pada bulan Ogos!
Sila cuba kod berikut:
$loc = IntlCalendar::createInstance( new DateTimeZone( 'Europe/Paris' ), 'fr_FR' ); echo $loc->getLocale( Locale::VALID_LOCALE );
Anda boleh bermula dengan mendapatkan negara yang berkaitan (dan kod negara) dari zon waktu tertentu:
Anda kemudian boleh menggabungkan maklumat ini dengan sumber yang tersedia di perpustakaan ICU untuk mendapatkan bahasa yang paling mungkin untuk kod negara tertentu:
Sila ambil perhatian bahawa ini tidak terpakai kepada setiap pengguna. Ini adalah titik permulaan lalai yang baik, tetapi anda harus sentiasa meminta pengguna untuk pilihan bahasa mereka.
$possibleLocale = getLanguage($countryCode) . '_' . $countryCode; // fr_FR