recherche

Maison  >  Questions et réponses  >  le corps du texte

En PHP, IntCalendar génère des paramètres régionaux incorrects.

<p>J'ai le code suivant, qui, je crois, est censé afficher fr_FR comme paramètres régionaux, mais pour une raison quelconque, il affiche en_US_POSIX (quel que soit le fuseau horaire). Qu'ai-je fait de mal? </p> <pre class="brush:php;toolbar:false;">$loc = IntlCalendar::createInstance(new DateTimeZone('Europe/Paris')); echo $loc->getLocale(Locale::VALID_LOCALE);</pre> <p>Liens de référence : https://www.php.net/manual/en/intlcalendar.createinstance.php et https://www.php.net/manual/en/intlcalendar.getlocale.php<br /> ;<br />On dirait que ce n'est pas la bonne approche (bien que le code soit valide) - existe-t-il un moyen plus approprié de trouver les paramètres régionaux « par défaut » pour un fuseau horaire donné ? </p><p><br /></p>
P粉553428780P粉553428780492 Il y a quelques jours582

répondre à tous(2)je répondrai

  • P粉464088437

    P粉4640884372023-07-29 09:18:13

    Vous définissez votre fuseau horaire sur celui de Paris. Mais vous n'avez pas défini les paramètres régionaux. Ce sont des choses différentes. Les paramètres régionaux définissent la langue et les conventions de formatage, tandis que le fuseau horaire définit les règles de conversion de l'UTC en heure locale et inversement. Ce que vous définissez s’applique aux Américains à Paris. C'est un cas d'utilisation valable, surtout en août !

    Veuillez essayer le code suivant :


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

    répondre
    0
  • P粉054616867

    P粉0546168672023-07-29 09:01:21

    Vous pouvez commencer par obtenir le pays associé (et le code du pays) à partir d'un fuseau horaire donné :

    $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'];
    

    Vous pouvez ensuite combiner ces informations avec les ressources disponibles dans la bibliothèque ICU pour obtenir la langue la plus probable pour un code de pays donné :

    // 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);
    }
    

    Veuillez noter que cela ne s'applique pas à tous les utilisateurs. Il s'agit d'un bon point de départ par défaut, mais vous devez toujours demander à l'utilisateur sa préférence linguistique.

    $possibleLocale = getLanguage($countryCode) . '_' . $countryCode; // fr_FR 

    répondre
    0
  • Annulerrépondre