setlocale în PHP

Setează limba și regiunea (locale) folosite de funcțiile care depind de țară: sortare, clasificarea literelor, formate.

Sintaxă
setlocale(int $category, $locales, ...$rest): string|false

Ce face setlocale

O setare regională (locale), de exemplu ro_RO.UTF-8, spune programelor cum se scriu numerele, cum se sortează textele și cum se numesc lunile într-o anumită limbă. setlocale o schimbă pentru o categorie: LC_COLLATE (sortare), LC_CTYPE (litere), LC_MONETARY, LC_NUMERIC, LC_TIME sau LC_ALL (toate).

Poți da mai multe nume, iar PHP îl folosește pe primul care există pe server. Funcția returnează numele setat sau false dacă niciunul nu există. "0" ca nume doar citește setarea curentă.

Din PHP 8, transformarea numerelor zecimale în text nu mai depinde de locale (punctul rămâne punct). Setarea este pentru tot procesul, deci poate afecta și alte cereri pe serverele cu mai multe fire de execuție.

Parametri

Parametru Descriere
$category Categoria: LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, LC_NUMERIC, LC_TIME, LC_MESSAGES.
$locales Numele setării sau un tablou de nume încercate în ordine. "0" citește setarea curentă, "" o ia din mediul sistemului.
$rest Opțional. Alte nume încercate, dacă primul nu există.

Ce returnează

Numele setării aplicate sau false.

Exemple

Exemplul 1: Setarea limbii române, cu variante de rezervă

Numele disponibile diferă de la un sistem la altul. Pe serverele Linux trebuie să fie generată setarea românească (de exemplu cu locale-gen ro_RO.UTF-8).

<?php
$rezultat = setlocale(LC_ALL, "ro_RO.UTF-8", "ro_RO.utf8", "ro_RO", "Romanian");
var_dump($rezultat);

var_dump(setlocale(LC_ALL, "0"));
var_dump(setlocale(LC_ALL, "xx_YY"));

Rezultat

string(11) "ro_RO.UTF-8"
string(11) "ro_RO.UTF-8"
bool(false)

Exemplul 2: Numerele zecimale nu sunt afectate în PHP 8

<?php
setlocale(LC_ALL, "ro_RO.UTF-8");

echo 3.5 . "\n";
echo number_format(1234.5, 2, ",", ".");

Rezultat

3.5
1.234,50

Greșeli frecvente

  • Nu verifici rezultatul și presupui că setarea a fost aplicată. Dacă locale-ul nu este instalat pe server, setlocale returnează false și totul rămâne pe setarea „C”.
  • Folosești setlocale pentru a afișa numele lunilor în română cu date. date afișează mereu în engleză; folosește IntlDateFormatter din extensia intl.

Comenzi înrudite

  • localeconv: Returnează formatele numerice ale setării regionale curente: separator zecimal, separator de mii, simbol monetar.
  • strcoll: Compară două texte după regulile de sortare ale limbii setate cu setlocale.
  • nl_langinfo: Returnează o informație din setarea regională curentă: numele lunilor și zilelor, formatul datei, codarea.