Commit | Line | Data |
---|---|---|
4bcd4c62 TO |
1 | <?php |
2 | namespace Civi\Setup; | |
3 | ||
4 | class LocaleUtil { | |
5 | ||
6 | /** | |
7 | * Figure out which of $langs is the closest to $lang. | |
8 | * | |
9 | * @param string $preferredLang | |
10 | * The user's preferred language. | |
11 | * Ex: `en`, `fr`, or `fr_CA`. | |
12 | * @param array $availLangs | |
13 | * List of available languages. | |
14 | * Ex: ['en_US' => 'English (US)', 'fr_CA' => 'French (Canadian)']. | |
15 | * @param string $default | |
16 | * The locale to use if none other can be determined. | |
17 | * Ex: 'en_US'. | |
18 | * @return string | |
19 | * Ex: 'en_US'. | |
20 | */ | |
21 | public static function pickClosest($preferredLang, $availLangs, $default = 'en_US') { | |
aed5db5d TO |
22 | if ($preferredLang === NULL || $preferredLang === '') { |
23 | return $default; | |
24 | } | |
25 | ||
4bcd4c62 TO |
26 | // Perhaps we have this exact language? |
27 | if (isset($availLangs[$preferredLang])) { | |
28 | return $preferredLang; | |
29 | } | |
30 | ||
31 | list ($first) = explode('_', $preferredLang); | |
32 | ||
33 | // Do we have a hard-coded preference? Use this for real oddballs. | |
34 | $overrides = array( | |
35 | 'en' => 'en_US', | |
36 | ); | |
37 | if (isset($overrides[$preferredLang]) && isset($availLangs[$overrides[$preferredLang]])) { | |
38 | return $overrides[$preferredLang]; | |
39 | } | |
40 | ||
41 | // Perhaps we have the canonical variant (e.g. `fr` => `fr_FR`)? | |
42 | $canon = $first . '_' . strtoupper($first); | |
43 | if (isset($availLangs[$canon])) { | |
44 | return $canon; | |
45 | } | |
46 | ||
47 | // Is there anything else that looks remotely close? (e.g. `cy` => `cy_GB`) | |
48 | ksort($availLangs); | |
49 | foreach ($availLangs as $availLang => $availLabel) { | |
50 | if (strpos($availLang, $first) === 0) { | |
51 | return $availLang; | |
52 | } | |
53 | } | |
54 | ||
55 | // Nothing worked. | |
56 | return $default; | |
57 | } | |
58 | ||
59 | } |