P粉4640884372023-07-29 09:18:13
您將時區設定為巴黎的時區。但您沒有設定區域設定。它們是不同的東西。區域設定定義了語言和格式約定,而時區則設定了將 UTC 轉換為本地時間和再次轉換回去的規則。您定義的內容適用於在巴黎的美國人。這是一個有效的用例,尤其是在八月!
請嘗試以下程式碼:
$loc = IntlCalendar::createInstance( new DateTimeZone( 'Europe/Paris' ), 'fr_FR' );
echo $loc->getLocale( Locale::VALID_LOCALE );
P粉0546168672023-07-29 09:01:21
您可以從給定時區取得關聯的國家(以及國家代碼)開始:
$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'];
然後,您可以將該資訊與 ICU 庫中可用的資源結合起來,以獲取給定國家代碼的最可能語言:
// 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); }
請注意,這並不適用於每個使用者。這是一個不錯的預設起點,但您應該始終詢問使用者的語言偏好。
$possibleLocale = getLanguage($countryCode) . '_' . $countryCode; // fr_FR