Changeset 123009 in spip-zone


Ignore:
Timestamp:
Mar 20, 2020, 7:19:31 AM (3 weeks ago)
Author:
Charles Razack
Message:

Prendre la langue de l'environnement pour formater le prix, au lieu de la langue principale du site (abelass). On ajoute donc dans la configuration la possibilité de préciser la langue régionale pour chaque langue configurée dans le multilinguisme.

Location:
_plugins_/prix
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/prix

    • Property subgit:lock:0f1cf397b0fb04ee560217dcc5b28daa4d5ee476 deleted
    • Property subgit:lock:eb5a3f2133a8252f75047e51e9990e31b6fbfae7 set to 2020-03-20T08:19:41.294
  • _plugins_/prix/formulaires/configurer_prix.html

    r122938 r123009  
    3737                                </div>
    3838
    39                                 [(#REM) Langue principale ]
    40                                 #SET{name,langue_defaut}
    41                                 #SET{erreurs,#ENV**{erreurs/#GET{name}}}
    42                                 #SET{defaut,#REM|prix_langue_defaut}
    43                                 #SET{valeur,#ENV**{#GET{name}}|sinon{#GET{defaut}}}
    44                                 <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
    45                                         <label for="champ_#GET{name}"><:prix:cfg_locale_label:></label>
    46                                         <p class="explication"><:prix:cfg_locale_explication:></p>
    47                                         [<span class='erreur_message'>(#GET{erreurs})</span>]
    48                                         <select class="select select2 chosen" name="#GET{name}" id="champ_#GET{name}">
    49                                                 <option value=""[ (#GET{valeur}|non)selected="selected"]><:prix:cfg_choisir_option:></option>
    50                                                 <BOUCLE_langues(DATA) {source table, #REM|prix_lister_langues}>
    51                                                 <option value="#CLE"[ (#CLE|=={#GET{valeur}}|oui)selected="selected"]>#VALEUR</option>
    52                                                 </BOUCLE_langues>
    53                                         </select>
     39                        </div>
     40
     41                        <fieldset>
     42
     43                                <legend class="legend"><:prix:cfg_locales_legend:></legend>
     44
     45                                <p class="explication"><:prix:cfg_locales_explication:></p>
     46
     47                                <div class="editer-groupe">
     48
     49                                        [(#REM)
     50                                                Configurer la locale pour chaque langue de spip utilisée sur le site
     51                                                On obtient un tableau associatif dans la clé 'locales' : code langue de spip => locale
     52                                        ]
     53                                        #SET{langues_spip,#LISTE{#CONFIG{langue_site}}|array_merge{#CONFIG{langues_multilingue}|explode{","}}|array_unique|array_filter}
     54                                        #SET{langues_intl,#REM|prix_lister_langues}
     55                                        <BOUCLE_langues_spip(DATA) {source table, #GET{langues_spip}}>
     56                                        #SET{name,locales\[#VALEUR\]}
     57                                        #SET{erreurs,#ENV**{erreurs/#GET{name}}}
     58                                        #SET{defaut,#VALEUR|prix_langue_vers_locale}
     59                                        #SET{valeur,#ENV**{locales/#VALEUR}|sinon{#GET{defaut}}}
     60                                        <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
     61                                                <label for="champ_#GET{name}">[(#VALEUR|traduire_nom_langue)]</label>
     62                                                [<span class='erreur_message'>(#GET{erreurs})</span>]
     63                                                <select class="select select2 chosen" name="#GET{name}" id="champ_#GET{name}">
     64                                                        <BOUCLE_locales(DATA) {source table, #GET{langues_intl}} {cle == ^#VALEUR} {par cle}>
     65                                                        <option value="#CLE"[ (#CLE|=={#GET{valeur}}|oui)selected="selected"]>#VALEUR</option>
     66                                                        </BOUCLE_locales>
     67                                                </select>
     68                                        </div>
     69                                        </BOUCLE_langues_spip>
     70
    5471                                </div>
    5572
    56                         </div>
     73                        </fieldset>
    5774
    5875                <p class="boutons"><span class="image_loading">&nbsp;</span><input type="submit" class="submit" value="<:bouton_enregistrer:>" /></p>
  • _plugins_/prix/lang/prix_fr.php

    r122943 r123009  
    1111        'cfg_choisir_option' => 'Veuillez choisir une option',
    1212        'cfg_devise_label' => 'Devise par défaut',
    13         'cfg_locale_explication' => 'Langue à utiliser pour formater les prix. C’est par défaut la langue du site, mais vous pouvez préciser une langue régionale si nécessaire (anglais australien, anglais des états-unis, etc.)',
     13        'cfg_locales_legend' => 'Formatage des prix',
     14        'cfg_locales_explication' => 'Pour chaque langue utilisée sur le site, veuillez préciser la région quand plusieurs options sont possibles.',
    1415        'cfg_locale_label' => 'Langue par défaut',
    1516        'cfg_titre_parametrages' => 'Configuration',
  • _plugins_/prix/paquet.xml

    r122938 r123009  
    22        prefix="prix"
    33        categorie="outil"
    4         version="1.2.0"
     4        version="1.2.1"
    55        etat="dev"
    66        compatibilite="[3.2.0;3.2.*]"
  • _plugins_/prix/prix_fonctions.php

    r122834 r123009  
    117117 *
    118118 * @uses prix_devise_defaut
    119  * @uses prix_langue_defaut
     119 * @uses prix_locale_defaut
    120120 *
    121121 * @param Float $prix
     
    123123 * @param String $devise
    124124 *     Code alphabétique à 3 lettres de la devise
    125  * @param String $langue
    126  *     Code de langue
     125 * @param String $locale
     126 *     Identifiant d'une locale (fr-CA) ou code de langue spip (fr_tu)
    127127 * @param Array $options
    128128 *     Tableau d'options :
     
    142142 *     Retourne une chaine contenant le prix formaté avec une devise
    143143 */
    144 function filtres_prix_formater_dist($prix, $devise = '', $langue = '', $options = array()) {
     144function filtres_prix_formater_dist($prix, $devise = '', $locale = '', $options = array()) {
    145145        prix_loader();
    146146
     
    151151        $devise = $devise ?: prix_devise_defaut();
    152152
    153         // Langue à utiliser
    154         $langue = $langue ?: prix_langue_defaut();
     153        // Locale à utiliser
     154        $locale = $locale ?: prix_locale_defaut();
    155155
    156156        // De préférence, on utilise la librairie Intl de Commerceguys
     
    158158                // Options : langue, style, etc.
    159159                $options_formatter = array(
    160                         'locale'           => $langue,
     160                        'locale'           => $locale,
    161161                        'currency_display' => 'code', // pour l'accessibilité
    162162                );
     
    165165                }
    166166
    167                 // Définitions des formats numériques depuis resources/numberFormat.
    168167                $numberFormatRepository = new CommerceGuys\Intl\NumberFormat\NumberFormatRepository;
    169                 // Définitions des devises depuis resources/currency.
    170168                $currencyRepository = new CommerceGuys\Intl\Currency\CurrencyRepository;
    171                 // Formatage des devises
    172169                $currencyFormatter = new CommerceGuys\Intl\Formatter\CurrencyFormatter($numberFormatRepository, $currencyRepository, $options_formatter);
    173170                $prix_formate = $currencyFormatter->format($prix, $devise);
     
    175172        // Sinon on se rabat sur la librairie Intl de php
    176173        } elseif (extension_loaded('intl')) {
    177                 $formatter = new NumberFormatter( $langue, NumberFormatter::CURRENCY );
     174                $formatter = new NumberFormatter( $locale, NumberFormatter::CURRENCY );
    178175                $prix_formate = numfmt_format_currency($formatter, $prix, $devise);
    179176
     
    208205
    209206        // On veut la langue de l'utilisateur pour les noms
    210         $langue = $GLOBALS['spip_lang'];
    211         $langue = substr($langue, strpos($langue, '_'));
     207        $langue_spip = $GLOBALS['spip_lang'];
     208        $locale = substr($langue_spip, strpos($langue_spip, '_'));
    212209
    213210        foreach ($codes_devises as $code => $nom) {
    214                 $devise = $currencyRepository->get($code, $langue);
     211                $devise = $currencyRepository->get($code, $locale);
    215212                $devises[$code] = array(
    216213                        'code'     => $code, // ça ne mange pas de pain de le remettre
     
    219216                        'fraction' => $devise->getFractionDigits(),
    220217                        'symbole'  => $devise->getSymbol(),
    221                         'langue'   => $devise->getLocale(),
     218                        'locale'   => $devise->getLocale(),
    222219                );
    223220        }
     
    227224
    228225/**
    229  * Liste toutes les langues avec leur code ISO.
    230  *
    231  * @note
    232  * Les codes de langues peuvent différer de ceux de SPIP, qui ne sont pas ISO
     226 * Liste les langues avec leur identifiant de locale.
     227 *
     228 * @see https://www.php.net/manual/fr/class.locale.php
    233229 *
    234230 * @return Array
    235  *     Tableau associatif : code => nom
     231 *     Tableau associatif : locale => nom
    236232 */
    237233function prix_lister_langues() {
     
    240236        $langues = array();
    241237
    242         // Définitions des langues depuis resources/language.
    243238        $languageRepository = new CommerceGuys\Intl\Language\LanguageRepository;
    244         $codes_langues = $languageRepository->getlist();
     239        $repo_locales = $languageRepository->getlist();
    245240
    246241        // Prendre la langue de l'utilisateur pour les noms
    247         $langue = $GLOBALS['spip_lang'];
    248         $langue = substr($langue, strpos($langue, '_'));
    249 
    250         foreach ($codes_langues as $code => $nom) {
    251                 $language = $languageRepository->get($code, $langue);
    252                 $langues[$code] = $language->getName();
     242        $langue_spip = $GLOBALS['spip_lang'];
     243        $locale_utilisateur = prix_langue_vers_locale($langue_spip);
     244
     245        foreach ($repo_locales as $locale => $nom) {
     246                $language = $languageRepository->get($locale, $locale_utilisateur);
     247                $langues[$locale] = $language->getName();
    253248        }
    254249
     
    280275
    281276/**
    282  * Retourne le code de langue par défaut.
    283  *
    284  * Celle configurée, sinon celle du site, sinon du français de france.
     277 * Retourne la locale d'après la langue du contexte
    285278 *
    286279 * @return String
    287  *      Code de langue
    288  */
    289 function prix_langue_defaut() {
     280 *      Identifiant de la locale
     281 */
     282function prix_locale_defaut() {
    290283
    291284        include_spip('inc/config');
    292285
    293         // Par défaut on prend celle configurée
    294         if ($langue_config = lire_config('prix/langue_defaut')) {
    295                 $langue = $langue_config;
    296         // Sinon on prend la langue du site (possiblement moins précise).
    297         // Il ne faut que les premières lettres pour être sûr
    298         // d'avoir quelque chose d'exploitable (fr_fem → fr).
    299         } elseif ($langue_site = lire_config('langue_site')) {
    300                 $langue = substr($langue_site, strpos($langue_site, '_'));
    301         // En dernier recours, du français de france
     286        $langue_spip = $GLOBALS['spip_lang'];
     287        $locales_config = lire_config('prix/locales', array());
     288
     289        // Normalement l'admin a configuré la locale correspondante à chaque code langue de spip
     290        if (!empty($locales_config[$langue_spip])) {
     291                $locale = $locales_config[$langue_spip];
     292        // Sinon tant pis, on donne juste le code pays tiré du code langue de spip
    302293        } else {
    303                 $langue = 'fr-FR';
    304         }
    305 
    306         return $langue;
     294                $locale = prix_langue_vers_locale($langue_spip);
     295        }
     296
     297        return $locale;
     298}
     299
     300/**
     301 * Donne la locale pour un code langue de SPIP
     302 *
     303 * On se contente d'extraire le code pays,
     304 * il s'agit des 2 à 3 lettres précédentes le tiret.
     305 *
     306 * @todo Vérifier s'il y a des exceptions
     307 * @see https://blog.smellup.net/106
     308 *
     309 * @param string $langue_spip
     310 * @return string
     311 */
     312function prix_langue_vers_locale($langue_spip) {
     313        $code_pays = strtolower(substr($langue_spip, strpos($langue_spip, '_')));
     314        return $code_pays;
    307315}
    308316
Note: See TracChangeset for help on using the changeset viewer.