在PHP中,IntCalendar輸出錯誤的區域設定。
P粉553428780
P粉553428780 2023-07-28 12:49:22
0
2
533

我有以下程式碼,我相信它應該輸出 fr_FR 作為區域設置,但出於某種原因它輸出 en_US_POSIX(無論時區如何)。我做錯了什麼?

$loc = IntlCalendar::createInstance(new DateTimeZone('Europe/Paris')); echo $loc->getLocale(Locale::VALID_LOCALE);

參考連結:https://www.php.net/manual/en/intlcalendar.createinstance.php 與https://www.php.net/manual/en/intlcalendar.getlocale.php
;
看起來這不是正確的方法(儘管代碼是有效的)- 是否有更適合的方法來找到給定時區的“預設”區域設定?


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
      最新下載
      更多>
      網站特效
      網站源碼
      網站素材
      前端模板
      關於我們 免責聲明 Sitemap
      PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!