在PHP中,IntCalendar輸出錯誤的區域設定。
P粉553428780
P粉553428780 2023-07-28 12:49:22
0
2
651
<p>我有以下程式碼,我相信它應該輸出 fr_FR 作為區域設置,但出於某種原因它輸出 en_US_POSIX(無論時區如何)。我做錯了什麼? </p> <pre class="brush:php;toolbar:false;">$loc = IntlCalendar::createInstance(new DateTimeZone('Europe/Paris')); echo $loc->getLocale(Locale::VALID_LOCALE);</pre> <p>參考連結:https://www.php.net/manual/en/intlcalendar.createinstance.php 與https://www.php.net/manual/en/intlcalendar.getlocale.php<br /> ;<br />看起來這不是正確的方法(儘管代碼是有效的)- 是否有更適合的方法來找到給定時區的“預設”區域設定? </p><p><br /></p>
P粉553428780
P粉553428780

全部回覆(2)
P粉464088437

您將時區設定為巴黎的時區。但您沒有設定區域設定。它們是不同的東西。區域設定定義了語言和格式約定,而時區則設定了將 UTC 轉換為本地時間和再次轉換回去的規則。您定義的內容適用於在巴黎的美國人。這是一個有效的用例,尤其是在八月!

請嘗試以下程式碼:


#
$loc = IntlCalendar::createInstance( new DateTimeZone( 'Europe/Paris' ), 'fr_FR' );
echo $loc->getLocale( Locale::VALID_LOCALE ); 
P粉054616867

您可以從給定時區取得關聯的國家(以及國家代碼)開始:

$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 
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板