{"record":{"id":"60d8c4a4a9146575","repo":"PaddlePaddle/PaddleOCR","slug":"unsupported-language","errorCode":null,"errorMessage":"Unsupported language","messagePattern":"Unsupported language","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"ppstructure/pdf2word/pdf2word.py","lineNumber":422,"sourceCode":"            )\n            lang_dict = DICT_EN\n        elif lang == \"CN\":\n            args.det_model_dir = os.path.join(\n                root, \"inference\", \"cn_PP-OCRv3_det_infer\"  # 此处从这里找到模型存放位置\n            )\n            args.rec_model_dir = os.path.join(\n                root, \"inference\", \"cn_PP-OCRv3_rec_infer\"\n            )\n            args.table_model_dir = os.path.join(\n                root, \"inference\", \"cn_ppstructure_mobile_v2.0_SLANet_infer\"\n            )\n            args.output = os.path.join(root, \"output\")  # 结果保存路径\n            args.layout_model_dir = os.path.join(\n                root, \"inference\", \"picodet_lcnet_x1_0_fgd_layout_cdla_infer\"\n            )\n            lang_dict = DICT_CN\n        else:\n            raise ValueError(\"Unsupported language\")\n        args.rec_char_dict_path = os.path.join(\n            root, \"ppocr\", \"utils\", lang_dict[\"rec_char_dict_path\"]\n        )\n        args.layout_dict_path = os.path.join(\n            root, \"ppocr\", \"utils\", \"dict\", \"layout_dict\", lang_dict[\"layout_dict_path\"]\n        )\n        # init predictor\n        return StructureSystem(args)\n\n    def handleOpenFileSignal(self):\n        \"\"\"\n        可以多选图像文件\n        \"\"\"\n        selectedFiles = QFileDialog.getOpenFileNames(\n            self, \"多文件选择\", \"/\", \"图片文件 (*.png *.jpeg *.jpg *.bmp *.pdf)\"\n        )[0]\n        if len(selectedFiles) > 0:\n            self.imagePaths = selectedFiles","sourceCodeStart":404,"sourceCodeEnd":440,"githubUrl":"https://github.com/PaddlePaddle/PaddleOCR/blob/2661c7c0ef5c613e8f93c6e93b2e052399f0f854/ppstructure/pdf2word/pdf2word.py#L404-L440","documentation":"Thrown by the pdf2word GUI app's initPredictor() when the language passed is neither 'EN' nor 'CN'. The method hard-codes model directories and dictionary mappings for exactly two languages; anything else (including lowercase 'en'/'cn') reaches the else branch. It is a whitelist guard, not a detection failure.","triggerScenarios":"Calling initPredictor(lang=...) with any string other than 'EN' or 'CN', e.g. 'ch' (the PaddleOCR CLI convention), 'en', 'zh', or a value read from a GUI dropdown/config file.","commonSituations":"Porting code from PaddleOCR CLI tools that use lang='ch' into the pdf2word GUI; a config file or UI combo box storing lowercase codes; passing locale identifiers like 'zh-CN'.","solutions":["Pass exactly 'EN' or 'CN' (uppercase) to initPredictor","If calling from code, normalize first: lang = 'CN' if lang.lower().startswith('zh') or lang.lower()=='cn' else 'EN'","Extend the if/elif chain in ppstructure/pdf2word/pdf2word.py:391-421 to support additional languages by adding matching model dirs and lang_dict entries"],"exampleFix":"// before\npredictor = window.initPredictor(lang='ch')  # ValueError\n\n// after\nlang = 'CN' if lang.lower() in ('ch', 'cn', 'zh') else 'EN'\npredictor = window.initPredictor(lang=lang)","handlingStrategy":"validation","validationCode":"SUPPORTED = {'EN', 'CN'}\nif lang not in SUPPORTED:\n    raise SystemExit(f\"lang must be one of {SUPPORTED}, got {lang!r}\")\nwindow.initPredictor(lang=lang)","typeGuard":"def is_pdf2word_lang(lang: str) -> bool:\n    return isinstance(lang, str) and lang in {\"EN\", \"CN\"}","tryCatchPattern":"try:\n    window.initPredictor(lang=lang)\nexcept ValueError as e:\n    if 'Unsupported language' in str(e):\n        lang = 'CN' if lang.lower().startswith('zh') else 'EN'\n        window.initPredictor(lang=lang)\n    else:\n        raise","preventionTips":["Keep the language whitelist ('EN','CN') next to the UI dropdown so only valid values can be selected","Normalize language codes at the system boundary (map 'ch'/'zh'/'cn' -> 'CN', 'en' -> 'EN')"],"tags":["pdf2word","gui","language-config","validation"],"backgroundTag":null,"analyzedSha":"2661c7c0ef5c613e8f93c6e93b2e052399f0f854","analyzedAt":"2026-08-14T20:17:30.180Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}