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