Rumah > Soal Jawab > teks badan
P粉4640884372023-07-29 09:18:13
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 );
P粉0546168672023-07-29 09:01:21
Anda boleh bermula dengan mendapatkan negara yang berkaitan (dan kod negara) dari zon waktu tertentu:
$userTimezone = new DateTimeZone('Europe/Paris'); $location = $userTimezone->getLocation(); /* array(4) { ["country_code"]=> string(2) "FR" ["latitude"]=> float(48.866659999999996) ["longitude"]=> float(2.3333299999999895) ["comments"]=> string(0) "" } */ $countryCode = $location['country_code'];
Anda kemudian boleh menggabungkan maklumat ini dengan sumber yang tersedia di perpustakaan ICU untuk mendapatkan bahasa yang paling mungkin untuk kod negara tertentu:
// From @ausi's answer in https://stackoverflow.com/a/58512299/1456201 function getLanguage(string $country): string { $subtags = \ResourceBundle::create('likelySubtags', 'ICUDATA', false); $country = \Locale::canonicalize('und_'.$country); $locale = $subtags->get($country) ?: $subtags->get('und'); return \Locale::getPrimaryLanguage($locale); }
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