On this page
Short answer: pass PaddleOCR's own code, not an ISO code — ch, chinese_cht, japan, korean, en, fr, ar, hi, ru… For Chinese, English, Japanese and 46 Latin-script languages you don't need lang at all: the default PP-OCRv6 model already reads all 50, and passing lang="fr" loads exactly the same model. For any other script, lang is what makes PaddleOCR load the right PP-OCRv5 recognizer.1
Find your lang code#
Search by English name, native name, ISO code or script. Each result shows the code PaddleOCR 3.7 accepts, the two models it loads, whether it works in the browser, and a line of Python to copy. Try two languages at once, such as en + fr or Korean + English.
Language code finder#
Runs in your browserHow PaddleOCR turns lang into a model#
In PaddleOCR 3.7 the lang parameter does one thing: it picks a detection model and a recognition model. The logic lives in _get_ocr_model_names() and runs in this order:1
No
lang, noocr_version#You get
PP-OCRv6_medium_det+PP-OCRv6_medium_rec, which read 50 languages.A PP-OCRv6 language#
ch,chinese_cht,en,japanand every Latin-script code exceptpi(52 codes, 50 languages —frenchandgermanare aliases offrandde). All of them load the same two medium models as the default.Another supported script#
Korean, Thai, Greek, Telugu, Tamil and the Arabic, East Slavic, Cyrillic and Devanagari groups, plus Pali, get
PP-OCRv5_server_detand a script-specific*_PP-OCRv5_mobile_rec(59 codes).ka#The only code still served by PP-OCRv3:
PP-OCRv3_mobile_det+ka_PP-OCRv3_mobile_rec.Anything else#
PaddleOCR()raisesValueError: No models are available for lang='…' and ocr_version=None.
Number of accepted lang codes per auto-selected recognition model (112 codes in total). Hover a bar for the codes.
| Recognition model | lang codes |
|---|---|
| PP-OCRv6 medium (unified) | 52 |
| PP-OCRv5 Cyrillic | 30 |
| PP-OCRv5 Devanagari | 13 |
| PP-OCRv5 Arabic | 7 |
| PP-OCRv5 East Slavic | 3 |
| PP-OCRv3 ka (Kannada?) | 1 |
| PP-OCRv5 Greek | 1 |
| PP-OCRv5 Korean | 1 |
| PP-OCRv5 Latin (Pali only) | 1 |
| PP-OCRv5 Tamil | 1 |
| PP-OCRv5 Telugu | 1 |
| PP-OCRv5 Thai | 1 |
_get_ocr_model_names() in PaddleOCR 3.7.0 paddleocr/_pipelines/ocr.py.Three consequences that the official docs don't spell out:
- For PP-OCRv6 languages,
langchanges nothing.PaddleOCR(lang="fr"),PaddleOCR(lang="en")andPaddleOCR()load identical models and give identical output.18 langnever selects PP-OCRv6 small or tiny. To use them, passtext_detection_model_nameandtext_recognition_model_name; PaddleOCR then ignoreslangwith a warning. See selecting a tier.1langplusocr_versiongives older models. Withocr_version="PP-OCRv5",enloads the English-onlyen_PP-OCRv5_mobile_recandfrloadslatin_PP-OCRv5_mobile_rec.PP-OCRv4supports onlychanden;PP-OCRv3supports 110 codes (all exceptthandel).1
Codes that raise ValueError#
PaddleOCR's codes are its own: some match ISO 639-1 (fr, ar, hi), many don't. We ran each of these through PaddleOCR(lang=…) in 3.7.0 and every one failed with ValueError: No models are available for lang=…. The first six come straight from the official PP-OCRv5 language list.348
| You tried | Use instead | Where the wrong code comes from |
|---|---|---|
sr | rs_cyrillic or rs_latin | Official PP-OCRv5 list |
rslatin | rs_latin | Official PP-OCRv5 list |
ab | abq | Official PP-OCRv5 docs ("Abkhaz"); the code's abq is named Abaza in the OCR docs |
av | ava (Avaric) | Official PP-OCRv5 docs |
ce | che (Chechen) | Official PP-OCRv5 docs |
lki | lbe (Lak) | Official PP-OCRv5 docs |
zh | ch or chinese_cht | ISO 639-1 habit |
ja, jp | japan | ISO / country-code habit |
ko, kr | korean | ISO / country-code habit |
kn | ka (see the ka problem) | ISO code for Kannada |
"en+fr", "en,fr" | one code, or none | lang takes a single code — see mixed documents |
Language support by script#
Chinese and Japanese#
Use ch for simplified Chinese, chinese_cht for traditional and japan for Japanese — or nothing, since the default PP-OCRv6 model reads all three plus English. On Baidu's in-house benchmark PP-OCRv6 medium scores 90.5% on Japanese recognition versus 73.7% for PP-OCRv5 server.5 In our own test, medium and small read every line of our Japanese notice and our Chinese + English notice correctly.9
PP-OCRv6 tiny can't read Japanese. It has no kana in its dictionary and produced a 47.3% character error rate on our Japanese notice, with no warning. Because lang="japan" always loads medium, you only hit this if you choose tiny yourself. See the actual output.
English, French, German, Spanish and other Latin-script languages#
All 46 Latin-script languages plus English are read by the same PP-OCRv6 model: Afrikaans, Albanian, Azerbaijani, Basque, Bosnian, Catalan, Croatian, Czech, Danish, Dutch, Estonian, Finnish, French, Galician, German, Hungarian, Icelandic, Indonesian, Irish, Italian, Kurdish, Latin, Latvian, Lithuanian, Luxembourgish, Malay, Maltese, Maori, Norwegian, Occitan, Polish, Portuguese, Quechua, Romanian, Romansh, Serbian (Latin), Slovak, Slovenian, Spanish, Swahili, Swedish, Tagalog, Turkish, Uzbek, Vietnamese and Welsh.12 Two quirks:
- Pali (
pi) is in the Latin list but explicitly excluded from PP-OCRv6, so it loadslatin_PP-OCRv5_mobile_recinstead. Forcingocr_version="PP-OCRv6"withlang="pi"raisesValueError.1 - Kurdish (
ku) appears in both the Latin and the Arabic-script lists. The Latin route is checked first, solang="ku"always gets the Latin-script PP-OCRv6 model. For Kurdish in Arabic script, settext_recognition_model_name="arabic_PP-OCRv5_mobile_rec"yourself.12
Korean#
lang="korean" loads korean_PP-OCRv5_mobile_rec, which Baidu lists as reading Korean and English, at 88.0% accuracy on a 5,007-image Korean set — a 65.0% improvement over the previous generation, in Baidu's wording.4 PP-OCRv6 does not include Korean, and neither does PaddleOCR.js.
from paddleocr import PaddleOCR
ocr = PaddleOCR(lang="korean") # PP-OCRv5_server_det + korean_PP-OCRv5_mobile_rec
print(ocr.predict("menu_ko.jpg")[0]["rec_texts"])Arabic, Persian, Urdu and other Arabic-script languages#
Seven codes — ar, fa, ur, ug, ps, sd, bal — load arabic_PP-OCRv5_mobile_rec. Baidu reports 81.27% accuracy on a 2,676-image set (a 22.83% improvement over the previous generation) and lists the model as reading Arabic, Persian, Uyghur, Urdu, Pashto, Kurdish, Sindhi, Balochi and English.4 We haven't yet tested Arabic-script documents ourselves, so check the reading order of rec_texts on your own right-to-left pages before relying on it.
Russian, Ukrainian and other Cyrillic languages#
Russian (ru), Ukrainian (uk) and Belarusian (be) load the East Slavic model eslav_PP-OCRv5_mobile_rec (81.6% on 7,031 images). The other 30 Cyrillic codes — Bulgarian, Serbian (rs_cyrillic), Macedonian, Kazakh, Kyrgyz, Mongolian, Tatar, Chechen and more — load cyrillic_PP-OCRv5_mobile_rec (80.27% on 7,600 images).14
Hindi, Marathi, Nepali and other Devanagari languages#
Thirteen codes load devanagari_PP-OCRv5_mobile_rec: hi (Hindi), mr (Marathi), ne (Nepali), sa (Sanskrit), bh, bho, mai, mah, new, gom, bgc, ang and sck. Baidu reports 84.96% accuracy on 3,611 images, a 68.26% improvement over the previous generation.4 The docs disagree on two names: ang is "Old English" in the language tables but "Angika" in the model's language list, and sck is "Sadri" in one and "Santali" in the other.34
from paddleocr import PaddleOCR
ocr = PaddleOCR(lang="hi") # PP-OCRv5_server_det + devanagari_PP-OCRv5_mobile_recThai, Greek, Tamil, Telugu#
Each has its own PP-OCRv5 recognizer that also reads English: th (82.68%), el (89.28%), ta (94.2%) and te (87.65%), on Baidu's per-language test sets of 2,121 to 4,261 images.4
The ka problem: Georgian or Kannada?#
The OCR pipeline docs list ka as Georgian. But the only model it loads, ka_PP-OCRv3_mobile_rec, is described in two other places in the same docs as a Kannada model — a different language with a different script.36 There is no PP-OCRv5 or v6 model for either. We couldn't resolve this from the sources, so test lang="ka" on a sample of your documents before using it for Georgian or Kannada.
Speed and size for languages outside PP-OCRv6#
Every PP-OCRv5 language route pairs a small script recognizer with the large PP-OCRv5_server_det detector (84.3 MB in the docs). The recognizers themselves are small — Baidu describes the October 2025 batch as having "only 2M parameters" — so on CPU the detector does most of the work.410
That matters if you use ONNX Runtime. In our benchmark, the PP-OCRv5 server pipeline averaged 35.7 s per page under ONNX Runtime against 5.2 s with PaddlePaddle 3.2.0. We re-checked with lang="korean" on our receipt image (Korean model, English text, which it is listed as reading): 12.35 s per image with ONNX Runtime vs 1.80 s with PaddlePaddle, median of three warm runs, same 27 lines of output.11 Because the Korean recognizer is a small mobile model, this suggests the slowdown comes from the server detector under ONNX Runtime — the opposite of PP-OCRv6, where ONNX Runtime was the faster engine in every tier.
On CPU, run Korean, Arabic, Cyrillic, Devanagari, Thai, Greek, Tamil and Telugu with the PaddlePaddle engine (paddlepaddle==3.2.0; see install), and benchmark before switching to engine="onnxruntime". Full engine results are on /benchmarks.
Mixed-language documents#
One PaddleOCR instance runs one recognition model. lang takes a single code; strings like "en+fr" or "en,fr" raise ValueError.8 What to do depends on the mix:
| Your document mixes… | Do this |
|---|---|
| English + French (or any Latin-script languages) | PaddleOCR() or PaddleOCR(lang="fr") — same PP-OCRv6 model, reads both. |
| Chinese or Japanese + English | PaddleOCR(). PP-OCRv6 reads CJK and Latin text in one pass; our Chinese + English notice came back 10/10 lines exact.9 |
| Korean, Arabic, Hindi, Russian, Thai… + English | Use that script's code (lang="korean", "ar", "hi"…). Each of these recognizers is listed as also reading English.4 |
| Two non-Latin scripts outside PP-OCRv6 (e.g. Korean + Russian), or Chinese + Korean | Run one instance per script and merge the results — see below. |
For the last case, one approach is to run both pipelines on the same image and, for each text region, keep the line with the higher rec_scores value. This is our suggestion, not something we've benchmarked; a recognizer reading a script it doesn't know can still return a confident wrong answer, as PP-OCRv6 tiny on Japanese shows.
from paddleocr import PaddleOCR
common = dict(use_doc_orientation_classify=False, use_doc_unwarping=False,
use_textline_orientation=False)
ko = PaddleOCR(lang="korean", **common) # korean_PP-OCRv5_mobile_rec
ru = PaddleOCR(lang="ru", **common) # eslav_PP-OCRv5_mobile_rec
a = ko.predict("sign.jpg")[0]
b = ru.predict("sign.jpg")[0]
for name, r in (("korean", a), ("russian", b)):
for text, score, box in zip(r["rec_texts"], r["rec_scores"], r["rec_boxes"]):
print(name, round(score, 3), box.tolist(), text)If you have a GPU and many mixed-script pages, PaddleOCR-VL is the other route: Baidu says it supports 109 languages in a single vision-language model.10
Which languages work in the browser#
The official browser SDK, PaddleOCR.js, ships three model sets: PP-OCRv6 small, PP-OCRv6 tiny and PP-OCRv5 mobile.7
ocrVersion: "PP-OCRv6"loads PP-OCRv6 small and acceptsch,chinese_cht,en,japanand the Latin-script codes exceptpi— the same 50 languages as Python.ocrVersion: "PP-OCRv5"accepts onlych,chinese_cht,enandjapan. Any other code throwsUnsupported lang/ocrVersion combination.- Tiny has no
langmapping; you load it by model name, and it can't read Japanese.
Korean, Arabic, Cyrillic, Devanagari, Thai, Greek, Tamil and Telugu are Python-only for now. Our online OCR tool uses PaddleOCR.js, so it reads exactly the PP-OCRv6 set; the finder above marks each language accordingly. Embedding details are in the PaddleOCR.js guide.
Errors in the official language lists#
We compared the documentation against langs.py and ocr.py. The code is what runs, so the finder and table on this page follow the code.
- The PP-OCRv5 list in the OCR pipeline docs contains
rslatin,sr,ab,av,ceandlki, none of which the code accepts, and omits the acceptedfrench,german,abq,ava,che,lbe,rs_latinandrs_cyrillic.3 abis called Abkhaz in the PP-OCRv5 docs, while the acceptedabqis called Abaza in the OCR docs — two different languages.34kais Georgian in one table and Kannada in the model description (above).- The "Supported Languages" table in the OCR docs has 81 rows; the code accepts 112 codes. Missing from the table: Thai, Greek, Catalan, Basque, Finnish, Galician, Luxembourgish, Romansh, Quechua, Pashto, Sindhi, Balochi and 18 Cyrillic-script languages including Kazakh, Kyrgyz, Tajik, Macedonian and Tatar.3
- The documented PP-OCRv3 list omits 27 codes that the code does route to PP-OCRv3 models — for example
kk→cyrillic_PP-OCRv3_mobile_rec.13 - Language counts vary: PP-OCRv5 multilingual is "106 languages" in its own doc and "109 languages" in the README.410
All 112 lang codes#
Sorted by language name. "Recognition model" is what PaddleOCR 3.7.0 loads when you pass only lang; the detector is PP-OCRv6_medium_det for PP-OCRv6 rows, PP-OCRv5_server_det for PP-OCRv5 rows and PP-OCRv3_mobile_det for ka. "v6 tiny" says whether PP-OCRv6 tiny reads the language; "Browser" whether PaddleOCR.js and our online tool do. Generated from the 3.7.0 source; the same data drives the finder.12
| Language | lang= | Recognition model (3.7) | v6 tiny | Browser | Script |
|---|---|---|---|---|---|
| Abaza | abq | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Adyghe | ady | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Afrikaans | af | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Albanian | sq | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Arabic | ar | arabic_PP-OCRv5_mobile_rec | n/a | No | Arabic |
| Avaric | ava | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Azerbaijani | az | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Balochi | bal | arabic_PP-OCRv5_mobile_rec | n/a | No | Arabic |
| Bashkir | ba | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Basque | eu | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Belarusian | be | eslav_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Bhojpuri | bho | devanagari_PP-OCRv5_mobile_rec | n/a | No | Devanagari |
| Bihari | bh | devanagari_PP-OCRv5_mobile_rec | n/a | No | Devanagari |
| Bosnian | bs | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Bulgarian | bg | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Buriat | bua | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Catalan | ca | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Chechen | che | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Chinese (Simplified) | ch | PP-OCRv6_medium_rec | Yes | Yes | Han (Simplified Chinese) |
| Chinese (Traditional) | chinese_cht | PP-OCRv6_medium_rec | Yes | Yes | Han (Traditional Chinese) |
| Chuvash | cv | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Croatian | hr | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Czech | cs | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Danish | da | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Dargwa | dar | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Dutch | nl | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| English | en | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Estonian | et | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Finnish | fi | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| French | fr | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| French | french | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Galician | gl | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Georgian | ka | ka_PP-OCRv3_mobile_rec | n/a | No | Kannada or Georgian (docs disagree) |
| German | de | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| German | german | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Greek | el | el_PP-OCRv5_mobile_rec | n/a | No | Greek |
| Haryanvi | bgc | devanagari_PP-OCRv5_mobile_rec | n/a | No | Devanagari |
| Hindi | hi | devanagari_PP-OCRv5_mobile_rec | n/a | No | Devanagari |
| Hungarian | hu | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Icelandic | is | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Indonesian | id | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Ingush | inh | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Irish | ga | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Italian | it | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Japanese | japan | PP-OCRv6_medium_rec | No | Small only | Japanese |
| Kabardian | kbd | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Kalmyk | xal | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Karakalpak | kaa | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Kazakh | kk | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Komi | kv | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Konkani | gom | devanagari_PP-OCRv5_mobile_rec | n/a | No | Devanagari |
| Korean | korean | korean_PP-OCRv5_mobile_rec | n/a | No | Korean (Hangul) |
| Kurdish | ku | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Kyrgyz | ky | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Lak | lbe | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Latin | la | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Latvian | lv | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Lezghian | lez | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Lithuanian | lt | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Luxembourgish | lb | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Macedonian | mk | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Magahi | mah | devanagari_PP-OCRv5_mobile_rec | n/a | No | Devanagari |
| Maithili | mai | devanagari_PP-OCRv5_mobile_rec | n/a | No | Devanagari |
| Malay | ms | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Maltese | mt | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Maori | mi | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Marathi | mr | devanagari_PP-OCRv5_mobile_rec | n/a | No | Devanagari |
| Mari | mhr | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Moldovan | mo | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Mongolian | mn | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Nepali | ne | devanagari_PP-OCRv5_mobile_rec | n/a | No | Devanagari |
| Newari | new | devanagari_PP-OCRv5_mobile_rec | n/a | No | Devanagari |
| Norwegian | no | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Occitan | oc | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Old English | ang | devanagari_PP-OCRv5_mobile_rec | n/a | No | Devanagari |
| Ossetian | os | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Pali | pi | latin_PP-OCRv5_mobile_rec | n/a | No | Latin |
| Pashto | ps | arabic_PP-OCRv5_mobile_rec | n/a | No | Arabic |
| Persian | fa | arabic_PP-OCRv5_mobile_rec | n/a | No | Arabic |
| Polish | pl | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Portuguese | pt | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Quechua | qu | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Romanian | ro | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Romansh | rm | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Russian | ru | eslav_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Sadri | sck | devanagari_PP-OCRv5_mobile_rec | n/a | No | Devanagari |
| Sakha | sah | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Sanskrit | sa | devanagari_PP-OCRv5_mobile_rec | n/a | No | Devanagari |
| Serbian (Cyrillic) | rs_cyrillic | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Serbian (Latin) | rs_latin | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Sindhi | sd | arabic_PP-OCRv5_mobile_rec | n/a | No | Arabic |
| Slovak | sk | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Slovenian | sl | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Spanish | es | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Swahili | sw | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Swedish | sv | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Tabassaran | tab | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Tagalog | tl | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Tajik | tg | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Tamil | ta | ta_PP-OCRv5_mobile_rec | n/a | No | Tamil |
| Tatar | tt | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Telugu | te | te_PP-OCRv5_mobile_rec | n/a | No | Telugu |
| Thai | th | th_PP-OCRv5_mobile_rec | n/a | No | Thai |
| Turkish | tr | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Tuvinian | tyv | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Udmurt | udm | cyrillic_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Ukrainian | uk | eslav_PP-OCRv5_mobile_rec | n/a | No | Cyrillic |
| Urdu | ur | arabic_PP-OCRv5_mobile_rec | n/a | No | Arabic |
| Uyghur | ug | arabic_PP-OCRv5_mobile_rec | n/a | No | Arabic |
| Uzbek | uz | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Vietnamese | vi | PP-OCRv6_medium_rec | Yes | Yes | Latin |
| Welsh | cy | PP-OCRv6_medium_rec | Yes | Yes | Latin |
Questions#
How many languages does PaddleOCR support?
PaddleOCR 3.7.0 accepts 112 lang codes. The default PP-OCRv6 model reads 50 languages (52 codes, including the aliases french and german); 59 codes use PP-OCRv5 multilingual models and one, ka, uses a PP-OCRv3 model. Baidu's own headline for the PP-OCRv5 multilingual models is 106 or 109 languages, depending on the document.
What is the lang code for Chinese, Japanese and Korean?
ch (simplified Chinese), chinese_cht (traditional Chinese), japan and korean. The ISO codes zh, ja and ko raise ValueError.
How do I OCR a document in English and French?
Use one code or none: PaddleOCR() and PaddleOCR(lang="fr") load the same PP-OCRv6 model, which reads English, French and 48 other languages together. lang="en+fr" is not valid and raises ValueError.
Does PaddleOCR support Arabic?
Yes. PaddleOCR(lang="ar") loads arabic_PP-OCRv5_mobile_rec, which Baidu reports at 81.27% accuracy and lists as reading Arabic, Persian, Uyghur, Urdu, Pashto, Kurdish, Sindhi, Balochi and English. It isn't available in PaddleOCR.js or our browser tool.
Does PaddleOCR support Hindi?
Yes, with lang="hi", which loads devanagari_PP-OCRv5_mobile_rec (84.96% on Baidu's Devanagari set). The same model serves Marathi, Nepali, Sanskrit and nine more Devanagari codes.
Why do I get “No models are available for lang”?
The code isn't one PaddleOCR knows. The usual causes are ISO codes (zh, ja, ko), codes copied from the official PP-OCRv5 list that the code doesn't accept (sr, rslatin, ab, av, ce, lki), or several codes in one string. Search the finder above for the right one.
Can I use PP-OCRv6 small or tiny for a specific language?
Yes, for the 50 PP-OCRv6 languages (49 for tiny — no Japanese), but not through lang: pass text_detection_model_name="PP-OCRv6_small_det" and text_recognition_model_name="PP-OCRv6_small_rec". The language doesn't need to be specified because the model reads all of them.
Sources
- PaddleOCR 3.7.0 source, paddleocr/_pipelines/ocr.py — PP-OCRv6 language set and Pali exclusion (lines 58–62),
ValueErrorfor unknown codes (113–119), model routing_get_ocr_model_names(318–422). Byte-identical to the PyPI 3.7.0 wheel. - paddleocr/_utils/langs.py — LATIN_LANGS, ARABIC_LANGS, ESLAV_LANGS, CYRILLIC_LANGS, DEVANAGARI_LANGS (lines 17–126).
- OCR pipeline documentation, OCR.en.md — language table (lines 2765–2844,
ka= Georgian at 2800), supportedlangperocr_version(2856–2886),ka_PP-OCRv3_mobile_recdescribed as Kannada (632). - PP-OCRv5 multilingual documentation, PP-OCRv5_multi_languages.en.md — "106 languages" (line 7), accuracy per model and test-set sizes (154–179), language codes including
ab,av,ce,lki(215–219), languages per model (244–256). - PP-OCRv6 algorithm documentation, PP-OCRv6.en.md — 50 languages, tiny 49 without Japanese (line 3), Baidu in-house recognition table (91–102).
- Text recognition module documentation, text_recognition.en.md —
ka_PP-OCRv3_mobile_reclisted as Kannada (lines 471–478) and the PP-OCRv3 multilingual models. - PaddleOCR.js source (
paddleocr-js/packages/core/src/pipelines/ocr/shared.ts, lines 68–167 and 525–542) and README, npm@paddleocr/paddleocr-js0.4.2: github.com/PaddlePaddle/PaddleOCR/tree/main/paddleocr-js. - Verified by paddleocr.dev on 2026-10-27 with paddleocr 3.7.0 (Python 3.13, Linux):
PaddleOCR(lang=…)raisedValueErrorforab,av,ce,lki,sr,rslatin,zh,ja,jp,ko,kr,knand"fr+en"; model names for every code were taken from_get_ocr_model_names. - paddleocr.dev benchmark, 2026-10-27: 4 vCPU Intel Xeon @ 2.10 GHz, 15 GB RAM, no GPU, paddleocr 3.7.0; Chinese + English notice and Japanese notice among 5 test documents. Method and raw data.
- PaddleOCR release notes: docs/update/update.en.md (3.1.0, 3.2.0) and README.md (3.3.0: multilingual models "covering recognition of 109 languages"; PaddleOCR-VL "supports 109 languages").
- paddleocr.dev, 2026-10-28:
PaddleOCR(lang="korean")with document preprocessing and line orientation off, on our clean receipt image, same 4-vCPU machine; median of 3 warm runs after one warm-up; paddlepaddle 3.2.0 vs onnxruntime 1.31.1, paddleocr 3.7.0.