Tijdelijke locale

Gepost door Richard van Velzen op 25-08-2011 16:26.

Dit is een simpel snippet dat ik dagelijks gebruik. In meertalige applicaties komt het vaak voor dat je zo nu en dan even moet schakelen met de locale (bijvoorbeeld een Engelstalige tekst in een Nederlandse pagina).

Vooral als je dit zo vaak doet dat je de weg kwijtraakt, en niet meer weet welke locale je na het anderstalige stuk nodig hebt, kan dit uitkomst bieden. Het biedt simpelweg de mogelijkheid om tijdelijk een andere locale toe te passen.

De code spreekt redelijk voor zich, volgens mij, er zijn drie argument:

  1. $func - het eerste argument is altijd een functie waarbinnen de andere locale moet worden toegepast
  2. $locale - de locale, vanzelfsprekend. Volgt dezelfde regels als setlocale( ) zelf.
  3. $category - wederom, hetzelfde als bij setlocale( )

Veel plezier en succes! Commentaar en kritiek is uiteraard welkom :-)

Bestanden van dit script

locale_test.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
require 'locale.php';

$output = function () {
    return trim(strftime('%A'));
};

setlocale(LC_ALL, 'de_DE');

verify('Donnerstag', $output());
verify('donderdag', locale($output, 'nl_NL'));
verify('Thursday', locale($output, 'en_GB'));
verify('Donnerstag', $output());

function verify($wanted, $given) {
    if ($wanted !== $given) {
        exit($wanted . ' wanted, ' . $given . ' given' . PHP_EOL);
    }
}

locale.php

1
2
3
4
5
6
7
8
9
10
<?php
function locale($func, $locale, $category = LC_ALL) {
    $oldLocale = setlocale($category, '0');
    setlocale($category, $locale);
    $result = $func();
    setlocale($category, $oldLocale);
    return $result;
}

Commentaar

26-08-2011 16:44

Nifty :-)

Een degelijke getlocale functie zou overigens ook welkom zijn..

1
2
3
4
<?php
setlocale(LC_ALL, 'nl_NL.UTF-8');
var_dump(setlocale(LC_ALL, null)); // e.g. Dutch_Netherlands
var_dump(getlocale(LC_ALL)); // e.g. nl_NL
26-08-2011 16:48

Je zou het zelfde principe ook nog kunnen toepassen op set_error_handler();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
try {
    callsafe('\parse_ini_file', '/path/to/file');
    callsafe('\unlink', '/path/to/file');
} catch(\ErrorException $e) {
}

// of 
callsafe_start();
foo();
$errors = callsafe_stop();
if($errors) {
    throw reset($errors);
}
27-08-2011 20:58

Quote van php.net/setlocale

The locale information is maintained per process, not per thread. If you are running PHP on a multithreaded server API like IIS or Apache on Windows, you may experience sudden changes in locale settings while a script is running, though the script itself never called setlocale(). This happens due to other scripts running in different threads of the same process at the same time, changing the process-wide locale using setlocale().

Is dit een fix zodat je die "sudden changes" niet meer hebt?

29-08-2011 09:58

Niet per se. Kijk, je bent al niet slim bezig als je een threaded server draait, juist om dit probleem. Het enige waar dit voor zorgt is dat je niet zelf hoeft te onthouden uit welke locale je kwam om er weer terug heen te kunnen.

Inloggen wachtwoord vergeten? Aanmelden