1<?php
2
3// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
4// See the LICENCE file in the repository root for full licence text.
5
6declare(strict_types=1);
7
8namespace App\Libraries;
9
10class LocaleMeta
11{
12 // Keys must be a superset of app.available_locales. Additional locales are
13 // available for use only in wiki articles
14 const MAPPINGS = [
15 'ar' => [
16 'flag' => 'SA',
17 'name' => 'اَلْعَرَبِيَّةُ',
18 ],
19 'be' => [
20 'flag' => 'BY',
21 'name' => 'беларуская мова',
22 ],
23 'bg' => [
24 'flag' => 'BG',
25 'name' => 'български',
26 ],
27 'ca' => [
28 'flag' => 'AD', // ES-CA in crowdin
29 'name' => 'català',
30 ],
31 'cs' => [
32 'flag' => 'CZ',
33 'name' => 'česky',
34 ],
35 'da' => [
36 'flag' => 'DK',
37 'name' => 'dansk',
38 ],
39 'de' => [
40 'flag' => 'DE',
41 'name' => 'Deutsch',
42 ],
43 'el' => [
44 'flag' => 'GR',
45 'name' => 'ελληνικά',
46 ],
47 'en' => [
48 'flag' => 'GB',
49 'moment' => 'en-gb',
50 'name' => 'English',
51 ],
52 'es' => [
53 'flag' => 'ES',
54 'name' => 'español',
55 ],
56 'fi' => [
57 'flag' => 'FI',
58 'name' => 'suomi',
59 ],
60 'fil' => [
61 'flag' => 'PH',
62 'name' => 'wikang Filipino',
63 ],
64 'fr' => [
65 'flag' => 'FR',
66 'name' => 'français',
67 ],
68 'he' => [
69 'flag' => 'IL',
70 'name' => 'עִבְרִית',
71 ],
72 'hu' => [
73 'flag' => 'HU',
74 'name' => 'magyar',
75 ],
76 'id' => [
77 'flag' => 'ID',
78 'name' => 'bahasa Indonesia',
79 ],
80 'it' => [
81 'flag' => 'IT',
82 'name' => 'italiano',
83 ],
84 'ja' => [
85 'flag' => 'JP',
86 'name' => '日本語',
87 ],
88 'ko' => [
89 'flag' => 'KR',
90 'name' => '한국어',
91 ],
92 'lt' => [
93 'flag' => 'LT',
94 'name' => 'lietuvių kalba',
95 ],
96 'nl' => [
97 'flag' => 'NL',
98 'name' => 'Nederlands',
99 ],
100 'no' => [
101 'flag' => 'NO',
102 'moment' => 'nb',
103 'name' => 'norsk',
104 ],
105 'pl' => [
106 'flag' => 'PL',
107 'name' => 'polski',
108 ],
109 'pt' => [
110 'flag' => 'PT',
111 'name' => 'português',
112 ],
113 'pt-br' => [
114 'flag' => 'BR',
115 'html' => 'pt-BR',
116 'laravelPlural' => 'pt_BR',
117 'name' => 'português brasileiro',
118 ],
119 'ro' => [
120 'flag' => 'RO',
121 'name' => 'română',
122 ],
123 'ru' => [
124 'flag' => 'RU',
125 'name' => 'русский',
126 ],
127 'sk' => [
128 'flag' => 'SK',
129 'name' => 'slovenčina',
130 ],
131 'sl' => [
132 'flag' => 'SI',
133 'name' => 'slovenščina',
134 ],
135 'sr' => [
136 'flag' => 'RS',
137 'moment' => 'sr-cyrl',
138 'name' => 'српски',
139 ],
140 'sv' => [
141 'flag' => 'SE',
142 'name' => 'svenska',
143 ],
144 'th' => [
145 'flag' => 'TH',
146 'name' => 'ไทย',
147 ],
148 'tr' => [
149 'flag' => 'TR',
150 'name' => 'Türkçe',
151 ],
152 'uk' => [
153 'flag' => 'UA',
154 'name' => 'українська мова',
155 ],
156 'vi' => [
157 'flag' => 'VN',
158 'name' => 'tiếng Việt',
159 ],
160 'zh' => [
161 'flag' => 'CN',
162 'moment' => 'zh-cn',
163 'name' => '简体中文',
164 ],
165 'zh-tw' => [
166 'flag' => 'TW',
167 'html' => 'zh-TW',
168 'laravelPlural' => 'zh_TW',
169 'name' => '繁體中文(台灣)',
170 ],
171 ];
172
173 private array $data;
174 private string $locale;
175
176 /**
177 * Return cached instance of specified locale.
178 *
179 * Only valid locale listed as key in MAPPINGS constant is accepted.
180 * Passing in invalid locale will result in error.
181 */
182 public static function find(string $locale): self
183 {
184 static $instances = [];
185
186 return $instances[$locale] ??= new static($locale);
187 }
188
189 public static function isValid(?string $locale): bool
190 {
191 return isset(static::MAPPINGS[$locale]);
192 }
193
194 public static function sanitizeCode(?string $locale): ?string
195 {
196 if ($locale === null) {
197 return null;
198 }
199
200 $ret = strtolower($locale);
201
202 return static::isValid($ret) ? $ret : null;
203 }
204
205 public function __construct($locale)
206 {
207 $this->locale = $locale;
208 $this->data = static::MAPPINGS[$locale];
209 }
210
211 public function flag(): string
212 {
213 return $this->data['flag'];
214 }
215
216 public function html(): string
217 {
218 return $this->data['html'] ?? $this->locale;
219 }
220
221 public function laravelPlural(): string
222 {
223 return $this->data['laravelPlural'] ?? $this->locale;
224 }
225
226 public function locale(): string
227 {
228 return $this->locale;
229 }
230
231 public function moment(): string
232 {
233 return $this->data['moment'] ?? $this->locale;
234 }
235
236 public function name(): string
237 {
238 return $this->data['name'];
239 }
240}