Merge pull request #20096 from larssandergreen/copy-template_type-when-cloning-mailing
[civicrm-core.git] / setup / src / Setup / LocaleUtil.php
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') {
22 if ($preferredLang === NULL || $preferredLang === '') {
23 return $default;
24 }
25
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 }