1<?php
2
3namespace Giggsey\Locale;
4
5class Locale
6{
7    protected static $dataDir = '../data/';
8
9    /**
10     * Gets the primary language for the input locale
11     *
12     * @param string $locale Input locale (e.g. en-GB)
13     * @return string Primary Language (e.g. en)
14     */
15    public static function getPrimaryLanguage($locale)
16    {
17        $parts = explode('-', str_replace('_', '-', $locale));
18
19        return strtolower($parts[0]);
20    }
21
22    /**
23     * Get the region for the input locale
24     *
25     * @param string $locale Input locale (e.g. de-CH-1991)
26     * @return string Region (e.g. CH)
27     */
28    public static function getRegion($locale)
29    {
30        $parts = explode('-', str_replace('_', '-', $locale));
31
32        if (count($parts) === 1) {
33            return '';
34        }
35
36        $region = end($parts);
37
38        if (strlen($region) === 4) {
39            return '';
40        }
41
42        if ($region === 'POSIX') {
43            $region = 'US';
44        }
45
46        return strtoupper($region);
47    }
48
49    /**
50     * Get the localised display name for the region of the input locale
51     *
52     * @param string $locale The locale to return a display region for
53     * @param string $inLocale Format locale to display the region name
54     * @return string Display name for the region, or an empty string if no result could be found
55     */
56    public static function getDisplayRegion($locale, $inLocale)
57    {
58        $dataDir = __DIR__ . DIRECTORY_SEPARATOR . static::$dataDir;
59
60        // Convert $locale into a region
61        $region = static::getRegion($locale);
62
63        $regionList = require $dataDir . '_list.php';
64
65        /*
66         * Loop through each part of the $inLocale, and see if we have data for that locale
67         *
68         * E.g zh-Hans-HK will look for zh-Hanks-HK, zh-Hanks, then finally zh
69         */
70        $fallbackParts = explode('-', str_replace('_', '-', $inLocale));
71        $filesToSearch = array();
72
73        $i = count($fallbackParts);
74        while ($i > 0) {
75            $searchLocale = strtolower(implode('-', $fallbackParts));
76
77            if (isset($regionList[$searchLocale])) {
78                $filesToSearch[] = $searchLocale;
79            }
80
81            array_pop($fallbackParts);
82            $i--;
83        }
84
85        /*
86         * Load data files, and load the region (if it exists) from it
87         */
88
89        foreach ($filesToSearch as $fileToSearch) {
90            // Load data file
91            $data = require $dataDir . $fileToSearch . '.php';
92
93            if (isset($data[$region])) {
94                return $data[$region];
95            }
96        }
97
98        return '';
99    }
100
101    public static function getVersion()
102    {
103        $file = __DIR__ . DIRECTORY_SEPARATOR . static::$dataDir . '_version.php';
104
105        return require $file;
106    }
107
108    /**
109     * Return a list of all the supported locales
110     *
111     * @return string[]
112     */
113    public static function getSupportedLocales()
114    {
115        $dataDir = __DIR__ . DIRECTORY_SEPARATOR . static::$dataDir;
116        $regionList = require $dataDir . '_list.php';
117
118        return array_keys($regionList);
119    }
120
121    /**
122     * Load a list of all countries supported by a particular Locale
123     *
124     * @param string $locale
125     * @return string[] Associative array of Country Code => Country Name
126     * @throws \RuntimeException On an invalid region
127     */
128    public static function getAllCountriesForLocale($locale)
129    {
130        $dataDir = __DIR__ . DIRECTORY_SEPARATOR . static::$dataDir;
131        $regionList = require $dataDir . '_list.php';
132
133        if (!isset($regionList[$locale])) {
134            throw new \RuntimeException("Locale is not supported");
135        }
136
137        /*
138         * Loop through each part of the $locale, and load data for that locale
139         *
140         * E.g zh-Hans-HK will look for zh-Hanks-HK, zh-Hanks, then finally zh
141         */
142        $fallbackParts = explode('-', str_replace('_', '-', $locale));
143        $filesToSearch = array();
144
145        $i = count($fallbackParts);
146        while ($i > 0) {
147            $searchLocale = strtolower(implode('-', $fallbackParts));
148
149            if (isset($regionList[$searchLocale])) {
150                $filesToSearch[] = $searchLocale;
151            }
152
153            array_pop($fallbackParts);
154            $i--;
155        }
156
157        /*
158         * Load data files, and load the region (if it exists) from it
159         */
160
161        $returnData = array();
162
163        foreach ($filesToSearch as $fileToSearch) {
164            // Load data file
165            $data = require $dataDir . $fileToSearch . '.php';
166
167            $returnData += $data;
168        }
169
170        ksort($returnData);
171
172        return $returnData;
173    }
174}
175