Start here

Quick start & APIInstallOnline OCRCode generator

Models & pipelines

PP-OCRv6 modelsLanguagesPP-StructureV3PaddleOCR-VL

Deploy & integrate

Serving & APIPaddleOCR.jsMCP server

Fix & upgrade

TroubleshootingMigrate from 2.xReleases

Evaluate

Our benchmarkCompare OCR toolsLicense & cost

Tools

Online OCRInstall command builderCode generatorError fixer2.x → 3.x converterLanguage code finder

Language

English简体中文日本語Try OCR online
Reference + free tool

PaddleOCR languages: every lang code and the model it loads

PaddleOCR 3.7 accepts 112 lang codes. Fifty languages — Chinese, English, Japanese and 46 Latin-script languages — are read by one PP-OCRv6 model. Korean, Arabic, Cyrillic, Devanagari, Thai, Greek, Tamil and Telugu fall back to PP-OCRv5 models. Search any language below to get its code, its model and a line of Python.

Checked against PaddleOCR 3.7.0Updated 11 min readRuns in your browser
On this page
  1. Find your lang code
  2. How PaddleOCR turns lang into a model
  3. Codes that raise ValueError
  4. Language support by script
  5. Speed and size for languages outside PP-OCRv6
  6. Mixed-language documents
  7. Which languages work in the browser
  8. Errors in the official language lists
  9. All 112 lang codes
  10. Questions

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 browser
Script
The finder needs JavaScript. Every code is also in the full table.

How 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

  1. No lang, no ocr_version#

    You get PP-OCRv6_medium_det + PP-OCRv6_medium_rec, which read 50 languages.

  2. A PP-OCRv6 language#

    ch, chinese_cht, en, japan and every Latin-script code except pi (52 codes, 50 languages — french and german are aliases of fr and de). All of them load the same two medium models as the default.

  3. Another supported script#

    Korean, Thai, Greek, Telugu, Tamil and the Arabic, East Slavic, Cyrillic and Devanagari groups, plus Pali, get PP-OCRv5_server_det and a script-specific *_PP-OCRv5_mobile_rec (59 codes).

  4. ka#

    The only code still served by PP-OCRv3: PP-OCRv3_mobile_det + ka_PP-OCRv3_mobile_rec.

  5. Anything else#

    PaddleOCR() raises ValueError: No models are available for lang='…' and ocr_version=None.

Which model a lang code loads in PaddleOCR 3.7

Number of accepted lang codes per auto-selected recognition model (112 codes in total). Hover a bar for the codes.

Recognition modellang codes
PP-OCRv6 medium (unified)52
PP-OCRv5 Cyrillic30
PP-OCRv5 Devanagari13
PP-OCRv5 Arabic7
PP-OCRv5 East Slavic3
PP-OCRv3 ka (Kannada?)1
PP-OCRv5 Greek1
PP-OCRv5 Korean1
PP-OCRv5 Latin (Pali only)1
PP-OCRv5 Tamil1
PP-OCRv5 Telugu1
PP-OCRv5 Thai1
paddleocr.dev, generated from _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, lang changes nothing. PaddleOCR(lang="fr"), PaddleOCR(lang="en") and PaddleOCR() load identical models and give identical output.18
  • lang never selects PP-OCRv6 small or tiny. To use them, pass text_detection_model_name and text_recognition_model_name; PaddleOCR then ignores lang with a warning. See selecting a tier.1
  • lang plus ocr_version gives older models. With ocr_version="PP-OCRv5", en loads the English-only en_PP-OCRv5_mobile_rec and fr loads latin_PP-OCRv5_mobile_rec. PP-OCRv4 supports only ch and en; PP-OCRv3 supports 110 codes (all except th and el).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 triedUse insteadWhere the wrong code comes from
srrs_cyrillic or rs_latinOfficial PP-OCRv5 list
rslatinrs_latinOfficial PP-OCRv5 list
ababqOfficial PP-OCRv5 docs ("Abkhaz"); the code's abq is named Abaza in the OCR docs
avava (Avaric)Official PP-OCRv5 docs
ceche (Chechen)Official PP-OCRv5 docs
lkilbe (Lak)Official PP-OCRv5 docs
zhch or chinese_chtISO 639-1 habit
ja, jpjapanISO / country-code habit
ko, krkoreanISO / country-code habit
knka (see the ka problem)ISO code for Kannada
"en+fr", "en,fr"one code, or nonelang 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 loads latin_PP-OCRv5_mobile_rec instead. Forcing ocr_version="PP-OCRv6" with lang="pi" raises ValueError.1
  • Kurdish (ku) appears in both the Latin and the Arabic-script lists. The Latin route is checked first, so lang="ku" always gets the Latin-script PP-OCRv6 model. For Kurdish in Arabic script, set text_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.

pythonkorean.py
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

pythonhindi.py
from paddleocr import PaddleOCR

ocr = PaddleOCR(lang="hi")   # PP-OCRv5_server_det + devanagari_PP-OCRv5_mobile_rec

Thai, 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 + EnglishPaddleOCR(). 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… + EnglishUse 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 + KoreanRun 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.

pythontwo_scripts.py
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 accepts ch, chinese_cht, en, japan and the Latin-script codes except pi — the same 50 languages as Python.
  • ocrVersion: "PP-OCRv5" accepts only ch, chinese_cht, en and japan. Any other code throws Unsupported lang/ocrVersion combination.
  • Tiny has no lang mapping; 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, ce and lki, none of which the code accepts, and omits the accepted french, german, abq, ava, che, lbe, rs_latin and rs_cyrillic.3
  • ab is called Abkhaz in the PP-OCRv5 docs, while the accepted abq is called Abaza in the OCR docs — two different languages.34
  • ka is 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

All 112 lang codes accepted by PaddleOCR 3.7.0
Languagelang=Recognition model (3.7)v6 tinyBrowserScript
Abazaabqcyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
Adygheadycyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
AfrikaansafPP-OCRv6_medium_recYesYesLatin
AlbaniansqPP-OCRv6_medium_recYesYesLatin
Arabicararabic_PP-OCRv5_mobile_recn/aNoArabic
Avaricavacyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
AzerbaijaniazPP-OCRv6_medium_recYesYesLatin
Balochibalarabic_PP-OCRv5_mobile_recn/aNoArabic
Bashkirbacyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
BasqueeuPP-OCRv6_medium_recYesYesLatin
Belarusianbeeslav_PP-OCRv5_mobile_recn/aNoCyrillic
Bhojpuribhodevanagari_PP-OCRv5_mobile_recn/aNoDevanagari
Biharibhdevanagari_PP-OCRv5_mobile_recn/aNoDevanagari
BosnianbsPP-OCRv6_medium_recYesYesLatin
Bulgarianbgcyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
Buriatbuacyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
CatalancaPP-OCRv6_medium_recYesYesLatin
Chechenchecyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
Chinese (Simplified)chPP-OCRv6_medium_recYesYesHan (Simplified Chinese)
Chinese (Traditional)chinese_chtPP-OCRv6_medium_recYesYesHan (Traditional Chinese)
Chuvashcvcyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
CroatianhrPP-OCRv6_medium_recYesYesLatin
CzechcsPP-OCRv6_medium_recYesYesLatin
DanishdaPP-OCRv6_medium_recYesYesLatin
Dargwadarcyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
DutchnlPP-OCRv6_medium_recYesYesLatin
EnglishenPP-OCRv6_medium_recYesYesLatin
EstonianetPP-OCRv6_medium_recYesYesLatin
FinnishfiPP-OCRv6_medium_recYesYesLatin
FrenchfrPP-OCRv6_medium_recYesYesLatin
FrenchfrenchPP-OCRv6_medium_recYesYesLatin
GalicianglPP-OCRv6_medium_recYesYesLatin
Georgiankaka_PP-OCRv3_mobile_recn/aNoKannada or Georgian (docs disagree)
GermandePP-OCRv6_medium_recYesYesLatin
GermangermanPP-OCRv6_medium_recYesYesLatin
Greekelel_PP-OCRv5_mobile_recn/aNoGreek
Haryanvibgcdevanagari_PP-OCRv5_mobile_recn/aNoDevanagari
Hindihidevanagari_PP-OCRv5_mobile_recn/aNoDevanagari
HungarianhuPP-OCRv6_medium_recYesYesLatin
IcelandicisPP-OCRv6_medium_recYesYesLatin
IndonesianidPP-OCRv6_medium_recYesYesLatin
Ingushinhcyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
IrishgaPP-OCRv6_medium_recYesYesLatin
ItalianitPP-OCRv6_medium_recYesYesLatin
JapanesejapanPP-OCRv6_medium_recNoSmall onlyJapanese
Kabardiankbdcyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
Kalmykxalcyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
Karakalpakkaacyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
Kazakhkkcyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
Komikvcyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
Konkanigomdevanagari_PP-OCRv5_mobile_recn/aNoDevanagari
Koreankoreankorean_PP-OCRv5_mobile_recn/aNoKorean (Hangul)
KurdishkuPP-OCRv6_medium_recYesYesLatin
Kyrgyzkycyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
Laklbecyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
LatinlaPP-OCRv6_medium_recYesYesLatin
LatvianlvPP-OCRv6_medium_recYesYesLatin
Lezghianlezcyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
LithuanianltPP-OCRv6_medium_recYesYesLatin
LuxembourgishlbPP-OCRv6_medium_recYesYesLatin
Macedonianmkcyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
Magahimahdevanagari_PP-OCRv5_mobile_recn/aNoDevanagari
Maithilimaidevanagari_PP-OCRv5_mobile_recn/aNoDevanagari
MalaymsPP-OCRv6_medium_recYesYesLatin
MaltesemtPP-OCRv6_medium_recYesYesLatin
MaorimiPP-OCRv6_medium_recYesYesLatin
Marathimrdevanagari_PP-OCRv5_mobile_recn/aNoDevanagari
Marimhrcyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
Moldovanmocyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
Mongolianmncyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
Nepalinedevanagari_PP-OCRv5_mobile_recn/aNoDevanagari
Newarinewdevanagari_PP-OCRv5_mobile_recn/aNoDevanagari
NorwegiannoPP-OCRv6_medium_recYesYesLatin
OccitanocPP-OCRv6_medium_recYesYesLatin
Old Englishangdevanagari_PP-OCRv5_mobile_recn/aNoDevanagari
Ossetianoscyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
Palipilatin_PP-OCRv5_mobile_recn/aNoLatin
Pashtopsarabic_PP-OCRv5_mobile_recn/aNoArabic
Persianfaarabic_PP-OCRv5_mobile_recn/aNoArabic
PolishplPP-OCRv6_medium_recYesYesLatin
PortugueseptPP-OCRv6_medium_recYesYesLatin
QuechuaquPP-OCRv6_medium_recYesYesLatin
RomanianroPP-OCRv6_medium_recYesYesLatin
RomanshrmPP-OCRv6_medium_recYesYesLatin
Russianrueslav_PP-OCRv5_mobile_recn/aNoCyrillic
Sadrisckdevanagari_PP-OCRv5_mobile_recn/aNoDevanagari
Sakhasahcyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
Sanskritsadevanagari_PP-OCRv5_mobile_recn/aNoDevanagari
Serbian (Cyrillic)rs_cyrilliccyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
Serbian (Latin)rs_latinPP-OCRv6_medium_recYesYesLatin
Sindhisdarabic_PP-OCRv5_mobile_recn/aNoArabic
SlovakskPP-OCRv6_medium_recYesYesLatin
SlovenianslPP-OCRv6_medium_recYesYesLatin
SpanishesPP-OCRv6_medium_recYesYesLatin
SwahiliswPP-OCRv6_medium_recYesYesLatin
SwedishsvPP-OCRv6_medium_recYesYesLatin
Tabassarantabcyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
TagalogtlPP-OCRv6_medium_recYesYesLatin
Tajiktgcyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
Tamiltata_PP-OCRv5_mobile_recn/aNoTamil
Tatarttcyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
Telugutete_PP-OCRv5_mobile_recn/aNoTelugu
Thaithth_PP-OCRv5_mobile_recn/aNoThai
TurkishtrPP-OCRv6_medium_recYesYesLatin
Tuviniantyvcyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
Udmurtudmcyrillic_PP-OCRv5_mobile_recn/aNoCyrillic
Ukrainianukeslav_PP-OCRv5_mobile_recn/aNoCyrillic
Urduurarabic_PP-OCRv5_mobile_recn/aNoArabic
Uyghurugarabic_PP-OCRv5_mobile_recn/aNoArabic
UzbekuzPP-OCRv6_medium_recYesYesLatin
VietnameseviPP-OCRv6_medium_recYesYesLatin
WelshcyPP-OCRv6_medium_recYesYesLatin

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

  1. PaddleOCR 3.7.0 source, paddleocr/_pipelines/ocr.py — PP-OCRv6 language set and Pali exclusion (lines 58–62), ValueError for unknown codes (113–119), model routing _get_ocr_model_names (318–422). Byte-identical to the PyPI 3.7.0 wheel.
  2. paddleocr/_utils/langs.py — LATIN_LANGS, ARABIC_LANGS, ESLAV_LANGS, CYRILLIC_LANGS, DEVANAGARI_LANGS (lines 17–126).
  3. OCR pipeline documentation, OCR.en.md — language table (lines 2765–2844, ka = Georgian at 2800), supported lang per ocr_version (2856–2886), ka_PP-OCRv3_mobile_rec described as Kannada (632).
  4. 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).
  5. PP-OCRv6 algorithm documentation, PP-OCRv6.en.md — 50 languages, tiny 49 without Japanese (line 3), Baidu in-house recognition table (91–102).
  6. Text recognition module documentation, text_recognition.en.md — ka_PP-OCRv3_mobile_rec listed as Kannada (lines 471–478) and the PP-OCRv3 multilingual models.
  7. PaddleOCR.js source (paddleocr-js/packages/core/src/pipelines/ocr/shared.ts, lines 68–167 and 525–542) and README, npm @paddleocr/paddleocr-js 0.4.2: github.com/PaddlePaddle/PaddleOCR/tree/main/paddleocr-js.
  8. Verified by paddleocr.dev on 2026-10-27 with paddleocr 3.7.0 (Python 3.13, Linux): PaddleOCR(lang=…) raised ValueError for ab, av, ce, lki, sr, rslatin, zh, ja, jp, ko, kr, kn and "fr+en"; model names for every code were taken from _get_ocr_model_names.
  9. 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.
  10. 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").
  11. 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.
Updated October 27, 2026·How we verify facts