1<?php
2
3namespace Mpdf\Language;
4
5class LanguageToFont implements \Mpdf\Language\LanguageToFontInterface
6{
7
8	public function getLanguageOptions($llcc, $adobeCJK)
9	{
10		$tags = explode('-', $llcc);
11		$lang = strtolower($tags[0]);
12		$country = '';
13		$script = '';
14		if (!empty($tags[1])) {
15			if (strlen($tags[1]) === 4) {
16				$script = strtolower($tags[1]);
17			} else {
18				$country = strtolower($tags[1]);
19			}
20		}
21		if (!empty($tags[2])) {
22			$country = strtolower($tags[2]);
23		}
24
25		$unifont = '';
26		$coreSuitable = false;
27
28		switch ($lang) {
29			/* European */
30			case 'en':
31			case 'eng': // English		// LATIN
32			case 'eu':
33			case 'eus': // Basque
34			case 'br':
35			case 'bre': // Breton
36			case 'ca':
37			case 'cat': // Catalan
38			case 'co':
39			case 'cos': // Corsican
40			case 'kw':
41			case 'cor': // Cornish
42			case 'cy':
43			case 'cym': // Welsh
44			case 'cs':
45			case 'ces': // Czech
46			case 'da':
47			case 'dan': // Danish
48			case 'nl':
49			case 'nld': // Dutch
50			case 'et':
51			case 'est': // Estonian
52			case 'fo':
53			case 'fao': // Faroese
54			case 'fi':
55			case 'fin': // Finnish
56			case 'fr':
57			case 'fra': // French
58			case 'gl':
59			case 'glg': // Galician
60			case 'de':
61			case 'deu': // German
62			case 'ht':
63			case 'hat': // Haitian; Haitian Creole
64			case 'hu':
65			case 'hun': // Hungarian
66			case 'ga':
67			case 'gle': // Irish
68			case 'is':
69			case 'isl': // Icelandic
70			case 'it':
71			case 'ita': // Italian
72			case 'la':
73			case 'lat': // Latin
74			case 'lb':
75			case 'ltz': // Luxembourgish
76			case 'li':
77			case 'lim': // Limburgish
78			case 'lt':
79			case 'lit': // Lithuanian
80			case 'lv':
81			case 'lav': // Latvian
82			case 'gv':
83			case 'glv': // Manx
84			case 'no':
85			case 'nor': // Norwegian
86			case 'nn':
87			case 'nno': // Norwegian Nynorsk
88			case 'nb':
89			case 'nob': // Norwegian Bokmål
90			case 'pl':
91			case 'pol': // Polish
92			case 'pt':
93			case 'por': // Portuguese
94			case 'ro':
95			case 'ron': // Romanian
96			case 'gd':
97			case 'gla': // Scottish Gaelic
98			case 'es':
99			case 'spa': // Spanish
100			case 'sv':
101			case 'swe': // Swedish
102			case 'sl':
103			case 'slv': // Slovene
104			case 'sk':
105			case 'slk': // Slovak
106				$coreSuitable = true;
107				break;
108
109			case 'ru':
110			case 'rus': // Russian	// CYRILLIC
111			case 'ab':
112			case 'abk': // Abkhaz
113			case 'av':
114			case 'ava': // Avaric
115			case 'ba':
116			case 'bak': // Bashkir
117			case 'be':
118			case 'bel': // Belarusian
119			case 'bg':
120			case 'bul': // Bulgarian
121			case 'ce':
122			case 'che': // Chechen
123			case 'cv':
124			case 'chv': // Chuvash
125			case 'kk':
126			case 'kaz': // Kazakh
127			case 'kv':
128			case 'kom': // Komi
129			case 'ky':
130			case 'kir': // Kyrgyz
131			case 'mk':
132			case 'mkd': // Macedonian
133			case 'cu':
134			case 'chu': // Old Church Slavonic
135			case 'os':
136			case 'oss': // Ossetian
137			case 'sr':
138			case 'srp': // Serbian
139			case 'tg':
140			case 'tgk': // Tajik
141			case 'tt':
142			case 'tat': // Tatar
143			case 'tk':
144			case 'tuk': // Turkmen
145			case 'uk':
146			case 'ukr': // Ukrainian
147				$unifont = 'dejavusanscondensed'; /* freeserif best coverage for supplements etc. */
148				break;
149
150			case 'hy':
151			case 'hye': // ARMENIAN
152				$unifont = 'dejavusans';
153				break;
154			case 'ka':
155			case 'kat': // GEORGIAN
156				$unifont = 'dejavusans';
157				break;
158
159			case 'el':
160			case 'ell': // GREEK
161				$unifont = 'dejavusanscondensed';
162				break;
163			case 'cop':  // COPTIC
164				$unifont = 'quivira';
165				break;
166
167			case 'got':  // GOTHIC
168				$unifont = 'freeserif';
169				break;
170
171			/* African */
172			case 'nqo':  // NKO
173				$unifont = 'dejavusans';
174				break;
175			//CASE 'bax':	// BAMUM
176			//CASE 'ha':  CASE 'hau':	// Hausa
177			case 'vai':  // VAI
178				$unifont = 'freesans';
179				break;
180			case 'am':
181			case 'amh': // Amharic ETHIOPIC
182			case 'ti':
183			case 'tir': // Tigrinya ETHIOPIC
184					$unifont = 'abyssinicasil';
185				break;
186
187			/* Middle Eastern */
188			case 'ar':
189			case 'ara': // Arabic	NB Arabic text identified by Autofont will be marked as und-Arab
190				$unifont = 'xbriyaz';
191				break;
192			case 'fa':
193			case 'fas': // Persian (Farsi)
194				$unifont = 'xbriyaz';
195				break;
196			case 'ps':
197			case 'pus': // Pashto
198				$unifont = 'xbriyaz';
199				break;
200			case 'ku':
201			case 'kur': // Kurdish
202				$unifont = 'xbriyaz';
203				break;
204			case 'ur':
205			case 'urd': // Urdu
206				$unifont = 'xbriyaz';
207				break;
208			case 'he':
209			case 'heb': // HEBREW
210			case 'yi':
211			case 'yid': // Yiddish
212					$unifont = 'taameydavidclm'; // dejavusans,dejavusanscondensed,freeserif are fine if you do not need cantillation marks
213				break;
214
215			case 'syr':  // SYRIAC
216				$unifont = 'estrangeloedessa';
217				break;
218
219			//CASE 'arc':	// IMPERIAL_ARAMAIC
220			//CASE ''ae:	// AVESTAN
221			case 'xcr':  // CARIAN
222				$unifont = 'aegean';
223				break;
224			case 'xlc':  // LYCIAN
225				$unifont = 'aegean';
226				break;
227			case 'xld':  // LYDIAN
228				$unifont = 'aegean';
229				break;
230			//CASE 'mid':	// MANDAIC
231			//CASE 'peo':	// OLD_PERSIAN
232			case 'phn':  // PHOENICIAN
233				$unifont = 'aegean';
234				break;
235			//CASE 'smp':	// SAMARITAN
236			case 'uga':  // UGARITIC
237				$unifont = 'aegean';
238				break;
239
240			/* Central Asian */
241			case 'bo':
242			case 'bod': // TIBETAN
243			case 'dz':
244			case 'dzo': // Dzongkha
245					$unifont = 'jomolhari';
246				break;
247
248			//CASE 'mn':  CASE 'mon':	// MONGOLIAN	(Vertical script)
249			//CASE 'ug':  CASE 'uig':	// Uyghur
250			//CASE 'uz':  CASE 'uzb':	// Uzbek
251			//CASE 'az':  CASE 'azb':	// South Azerbaijani
252
253			/* South Asian */
254			case 'as':
255			case 'asm': // Assamese
256				$unifont = 'freeserif';
257				break;
258			case 'bn':
259			case 'ben': // BENGALI; Bangla
260				$unifont = 'freeserif';
261				break;
262			case 'ks':
263			case 'kas': // Kashmiri
264				$unifont = 'freeserif';
265				break;
266			case 'hi':
267			case 'hin': // Hindi	DEVANAGARI
268			case 'bh':
269			case 'bih': // Bihari (Bhojpuri, Magahi, and Maithili)
270			case 'sa':
271			case 'san': // Sanskrit
272				$unifont = 'freeserif';
273				break;
274			case 'gu':
275			case 'guj': // Gujarati
276				$unifont = 'freeserif';
277				break;
278			case 'pa':
279			case 'pan': // Panjabi, Punjabi GURMUKHI
280				$unifont = 'freeserif';
281				break;
282			case 'kn':
283			case 'kan': // Kannada
284				$unifont = 'lohitkannada';
285				break;
286			case 'mr':
287			case 'mar': // Marathi
288				$unifont = 'freeserif';
289				break;
290			case 'ml':
291			case 'mal': // MALAYALAM
292				$unifont = 'freeserif';
293				break;
294			case 'ne':
295			case 'nep': // Nepali
296				$unifont = 'freeserif';
297				break;
298			case 'or':
299			case 'ori': // ORIYA
300				$unifont = 'freeserif';
301				break;
302			case 'si':
303			case 'sin': // SINHALA
304				$unifont = 'kaputaunicode';
305				break;
306			case 'ta':
307			case 'tam': // TAMIL
308				$unifont = 'freeserif';
309				break;
310			case 'te':
311			case 'tel': // TELUGU
312				$unifont = 'pothana2000';
313				break;
314
315			// Sindhi (Arabic or Devanagari)
316			case 'sd':
317			case 'snd': // Sindhi
318				$unifont = 'lateef';
319				if ($country === 'in') {
320					$unifont = 'freeserif';
321				}
322				break;
323
324			//CASE 'ccp':	// CHAKMA
325			//CASE 'lep':	// LEPCHA
326			case 'lif':  // LIMBU
327				$unifont = 'sun-exta';
328				break;
329			//CASE 'sat':	// OL_CHIKI
330			//CASE 'saz':	// SAURASHTRA
331			case 'syl':  // SYLOTI_NAGRI
332				$unifont = 'mph2bdamase';
333				break;
334			//CASE 'dgo':	// TAKRI
335			case 'dv':
336			case 'div': // Divehi; Maldivian  THAANA
337				$unifont = 'freeserif';
338				break;
339
340			/* South East Asian */
341			case 'km':
342			case 'khm': // KHMER
343				$unifont = 'khmeros';
344				break;
345			case 'lo':
346			case 'lao': // LAO
347				$unifont = 'dhyana';
348				break;
349			case 'my':
350			case 'mya': // MYANMAR Burmese
351				$unifont = 'tharlon'; // zawgyi-one is non-unicode compliant but in wide usage
352				// ayar is also not strictly compliant
353				// padaukbook is unicode compliant
354				break;
355			case 'th':
356			case 'tha': // THAI
357				$unifont = 'garuda';
358				break;
359
360			// VIETNAMESE
361			case 'vi':
362			case 'vie': // Vietnamese
363				$unifont = 'dejavusanscondensed';
364				break;
365
366			//CASE 'ms':  CASE 'msa':	// Malay
367			//CASE 'ban':	// BALINESE
368			//CASE 'bya':	// BATAK
369			case 'bug':  // BUGINESE
370				$unifont = 'freeserif';
371				break;
372			//CASE 'cjm':	// CHAM
373			//CASE 'jv':	// JAVANESE
374			case 'su':  // SUNDANESE
375				$unifont = 'sundaneseunicode';
376				break;
377			case 'tdd':  // TAI_LE
378				$unifont = 'tharlon';
379				break;
380			case 'blt':  // TAI_VIET
381				$unifont = 'taiheritagepro';
382				break;
383
384			/* Phillipine */
385			case 'bku':  // BUHID
386				$unifont = 'quivira';
387				break;
388			case 'hnn':  // HANUNOO
389				$unifont = 'quivira';
390				break;
391			case 'tl':  // TAGALOG
392				$unifont = 'quivira';
393				break;
394			case 'tbw':  // TAGBANWA
395				$unifont = 'quivira';
396				break;
397
398			/* East Asian */
399			case 'zh':
400			case 'zho': // Chinese
401				$unifont = 'sun-exta';
402				if ($adobeCJK) {
403					$unifont = 'gb';
404					if ($country === 'hk' || $country === 'tw') {
405						$unifont = 'big5';
406					}
407				}
408				break;
409			case 'ko':
410			case 'kor': // HANGUL Korean
411				$unifont = 'unbatang';
412				if ($adobeCJK) {
413					$unifont = 'uhc';
414				}
415				break;
416			case 'ja':
417			case 'jpn': // Japanese HIRAGANA KATAKANA
418				$unifont = 'sun-exta';
419				if ($adobeCJK) {
420					$unifont = 'sjis';
421				}
422				break;
423			case 'ii':
424			case 'iii': // Nuosu; Yi
425				$unifont = 'sun-exta';
426				if ($adobeCJK) {
427					$unifont = 'gb';
428				}
429				break;
430			case 'lis':  // LISU
431				$unifont = 'quivira';
432				break;
433
434			/* American */
435			case 'chr':  // CHEROKEE
436			case 'oj':
437			case 'oji': // Ojibwe; Chippewa
438			case 'cr':
439			case 'cre': // Cree CANADIAN_ABORIGINAL
440			case 'iu':
441			case 'iku': // Inuktitut
442				$unifont = 'aboriginalsans';
443				break;
444
445			/* Undetermined language - script used */
446			case 'und':
447				$unifont = $this->fontByScript($script, $adobeCJK);
448				break;
449		}
450
451		return [$coreSuitable, $unifont];
452	}
453
454	protected function fontByScript($script, $adobeCJK)
455	{
456		switch ($script) {
457			/* European */
458			case 'latn': // LATIN
459				return 'dejavusanscondensed';
460			case 'cyrl': // CYRILLIC
461				return 'dejavusanscondensed'; /* freeserif best coverage for supplements etc. */
462			case 'cprt': // CYPRIOT
463				return 'aegean';
464			case 'glag': // GLAGOLITIC
465				return 'mph2bdamase';
466			case 'linb': // LINEAR_B
467				return 'aegean';
468			case 'ogam': // OGHAM
469				return 'dejavusans';
470			case 'ital': // OLD_ITALIC
471				return 'aegean';
472			case 'runr': // RUNIC
473				return 'sun-exta';
474			case 'shaw': // SHAVIAN
475				return 'mph2bdamase';
476
477			/* African */
478			case 'egyp': // EGYPTIAN_HIEROGLYPHS
479				return 'aegyptus';
480			case 'ethi': // ETHIOPIC
481				return 'abyssinicasil';
482			//CASE 'merc':	// MEROITIC_CURSIVE
483			//CASE 'mero':	// MEROITIC_HIEROGLYPHS
484			case 'osma': // OSMANYA
485				return 'mph2bdamase';
486			case 'tfng': // TIFINAGH
487				return 'dejavusans';
488
489			/* Middle Eastern */
490			case 'arab':  // ARABIC
491				return 'xbriyaz';
492			case 'xsux': // CUNEIFORM
493				return 'akkadian';
494			//CASE 'sarb':	// OLD_SOUTH_ARABIAN
495			//CASE 'prti':	// INSCRIPTIONAL_PARTHIAN
496			//CASE 'phli':	// INSCRIPTIONAL_PAHLAVI
497
498
499			/* Central Asian */
500			//CASE 'orkh':	// OLD_TURKIC
501			//CASE 'phag':	// PHAGS_PA		(Vertical script)
502
503			/* South Asian */
504			//CASE 'brah':	// BRAHMI
505			//CASE 'kthi':	// KAITHI
506			case 'khar': // KHAROSHTHI
507				return 'mph2bdamase';
508			case 'mtei': // MEETEI_MAYEK
509				return 'eeyekunicode';
510			//CASE 'shrd':	// SHARADA
511			//CASE 'sora':	// SORA_SOMPENG
512
513			/* South East Asian */
514			case 'kali': // KAYAH_LI
515				return 'freemono';
516			//CASE 'rjng':	// REJANG
517			case 'lana': // TAI_THAM
518				return 'lannaalif';
519			case 'talu': // NEW_TAI_LUE
520				return 'daibannasilbook';
521
522			/* East Asian */
523			case 'hans': // HAN (SIMPLIFIED)
524				if ($adobeCJK) {
525					return 'gb';
526				}
527				return 'sun-exta';
528			case 'bopo': // BOPOMOFO
529				return 'sun-exta';
530			//CASE 'plrd':	// MIAO
531			case 'yiii': // YI
532				return 'sun-exta';
533
534			/* American */
535			case 'dsrt': // DESERET
536				return 'mph2bdamase';
537
538			/* Other */
539			case 'brai': // BRAILLE
540				return 'dejavusans';
541		}
542
543		return null;
544	}
545
546}
547