Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
2b553b4
Initial commit for Korean version of docs.
jamie-lemon Nov 25, 2025
36bc4d6
Example translation #1
jamie-lemon Nov 26, 2025
ef000bc
Example translation #2
jamie-lemon Nov 26, 2025
1404d45
typo fix
jamie-lemon Nov 26, 2025
1d4e885
Adds dedicated locale yaml file for readthedocs
jamie-lemon Nov 26, 2025
6192ec0
Syncs po files with recent changes on main branch.
jamie-lemon Nov 26, 2025
3988121
Test push to validate RTD sync.
jamie-lemon Nov 26, 2025
d79aa18
Another RTD sync test
jamie-lemon Nov 26, 2025
0215471
Updates README.
jamie-lemon Nov 26, 2025
6d14d40
Updates pymupdf4llm API page
jamie-lemon Dec 2, 2025
10b6542
Syncs Korean docs with latest updates.
jamie-lemon Dec 2, 2025
27e2547
Updates changes.po to sync with main
jamie-lemon Dec 2, 2025
3099090
Removes fuzzy historical matches from changes.po from automated output.
jamie-lemon Dec 2, 2025
e6f850a
Add initial Korean translation draft for documentation
simneol Dec 2, 2025
be1678a
Syncs po files with recent changes on main branch.
simneol Dec 3, 2025
95dffb7
Add Korean translations for newly generated texts after syncing with …
simneol Dec 2, 2025
cdd76f4
Fix Korean translation errors
simneol Dec 3, 2025
3ed4eaf
Fix Korean translation errors
simneol Dec 3, 2025
90d8cc4
Fix Korean translation errors in tutorial.po
simneol Dec 3, 2025
7e05c6e
Fix Korean translation errors
simneol Dec 3, 2025
f1c1365
Code syntax error updates.
jamie-lemon Dec 3, 2025
97f77f5
Adds missing translations for pixmap.po
jamie-lemon Dec 3, 2025
c35654a
Updates language toggle to add Korean option
jamie-lemon Dec 3, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@
*.swp
build/
demo/README.rst
docs/build
docs/build
docs/_build
41 changes: 40 additions & 1 deletion docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,24 +48,63 @@ A better way of building the documentation if you are actively working on update

This will serve the docs on a localhost and auto-update the pages live as you make edits.

### Building the Japanese documentation


## Internationalization

PyMuPDF docs can be delivered in multiple languages - English, Japanese & Korean.

To add a new language, e.g. Korean, use:

`sphinx-build -b gettext . _build/gettext`
`sphinx-intl update -p _build/gettext -l ko`


### Building the Localiized documentation

- From the "docs" location run:

#### Japanese:
`sphinx-build -a -b html -D language=ja . _build/html/ja`


Once built HTML docs HTML pages are in `_build/html/ja`.

#### Korean:
`sphinx-build -a -b html -D language=ko . _build/html/ko`


Once built HTML docs HTML pages are in `_build/html/ko`.

Note: subsequent runs can omit the `-a` parameter to speed up builds (it will just build what has changed).


Note: When build the corresponding `.mo` binary files will also be generated - these updated binaries should also be committed to Git.

### Depoloying

Docs will be automatically deployed to RTD once pushes are made to relevant branches.


### Updating

- Updating, after changes on the `main` branch and a sync with the main `en` .rst files, from the "docs" location, do:

`sphinx-build -b gettext . _build/gettext`

then:

`sphinx-intl update -p _build/gettext -l ja`
`sphinx-intl update -p _build/gettext -l ko`

This will update the corresponding `po` files for further edits. Then check these files for "#, fuzzy" entries as the new stuff might exist there and requires editing.







## Building PDF documentation

- First ensure you have [rst2pdf](https://pypi.org/project/rst2pdf/) installed:
Expand Down
74 changes: 74 additions & 0 deletions docs/about-feature-matrix.rst
Original file line number Diff line number Diff line change
Expand Up @@ -549,6 +549,80 @@



} else if (lang == "ko") {
if (str=="Feature") {
return "기능";
} else if (str=="Supports Multiple Document Formats") {
return "다중 문서 형식 지원";
} else if (str=="Image") {
return "이미지";
} else if (str=="Implementation") {
return "구현";
} else if (str=="and") {
return "및";
} else if (str=="Render Document Pages") {
return "문서 페이지 렌더링";
} else if (str=="All document types") {
return "모든 문서 유형";
} else if (str=="No rendering") {
return "렌더링 없음";
} else if (str=="Extract Text") {
return "텍스트 추출";
} else if (str=="Write Text to PDF Page") {
return "PDF 페이지에 텍스트 쓰기";
} else if (str=="only") {
return "만";
} else if (str=="Extract Vector Graphics") {
return "벡터 그래픽 추출";
} else if (str=="Draw Vector Graphics (PDF)") {
return "벡터 그래픽 그리기 (PDF)";
} else if (str=="Based on Existing, Mature Library") {
return "기존의 성숙한 라이브러리 기반";
} else if (str=="Automatic Repair of Damaged PDFs") {
return "손상된 PDF 자동 복구";
} else if (str=="Encrypted PDFs") {
return "암호화된 PDF";
} else if (str=="Limited") {
return "제한적";
} else if (str=="Linerarized PDFs") {
return "선형화된 PDF";
} else if (str=="Incremental Updates") {
return "증분 업데이트";
} else if (str=="Integrates with Jupyter and IPython Notebooks") {
return "Jupyter 및 IPython Notebooks 통합";
} else if (str=="Joining / Merging PDF with other Document Types") {
return "다른 문서 유형과 PDF 결합 / 병합";
} else if (str=="OCR API for Seamless Integration with Tesseract") {
return "Tesseract와의 원활한 통합을 위한 OCR API";
} else if (str=="Integrated Checkpoint / Restart Feature (PDF)") {
return "통합 체크포인트 / 재시작 기능 (PDF)";
} else if (str=="PDF Optional Content") {
return "PDF 선택적 콘텐츠";
} else if (str=="PDF Embedded Files") {
return "PDF 임베디드 파일";
} else if (str=="PDF Redactions") {
return "PDF 편집";
} else if (str=="PDF Annotations") {
return "PDF 주석";
} else if (str=="Full") {
return "전체";
} else if (str=="PDF Form Fields") {
return "PDF 양식 필드";
} else if (str=="Create, read, update") {
return "생성, 읽기, 업데이트";
} else if (str=="Limited, no creation") {
return "제한적, 생성 불가";
} else if (str=="PDF Page Labels") {
return "PDF 페이지 레이블";
} else if (str=="Support Font Sub-Setting") {
return "폰트 서브셋 지원";
} else if (str=="Extract Tables") {
return "테이블 추출";
} else if (str=="Supports CJK characters") {
return "CJK 문자 지원";
} else if (str == "Extract Text as Markdown (.md)") {
return "텍스트를 Markdown (.md) 으로 추출";
}
}

return str;
Expand Down
22 changes: 22 additions & 0 deletions docs/about-performance.rst
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,28 @@



} else if (langB == "ko") {
if (str=="Copying") {
return "복사";
} else if (str == "This refers to opening a document and then saving it to a new file. This test measures the speed of reading a <cite>PDF</cite> and re-writing as a new <cite>PDF</cite>. This process is also at the core of functions like merging / joining multiple documents. The numbers below therefore apply to <cite>PDF</cite> joining and merging.") {
return "이것은 문서를 열고 새 파일로 저장하는 것을 의미합니다. 이 테스트는 <cite>PDF</cite> 를 읽고 새 <cite>PDF</cite> 로 다시 쓰는 속도를 측정합니다. 이 프로세스는 여러 문서를 병합 / 결합하는 기능의 핵심이기도 합니다. 따라서 아래 숫자는 <cite>PDF</cite> 결합 및 병합에도 적용됩니다.";
} else if (str == "The results for all 7,031 pages are:") {
return "모든 7,031 페이지에 대한 결과:";
} else if (str == "seconds") {
return "초";
} else if (str == "fastest") {
return "가장 빠름";
} else if (str == "slowest") {
return "가장 느림";
} else if (str == "Text Extraction") {
return "텍스트 추출";
} else if (str == "This refers to extracting simple, plain text from every page of the document and storing it in a text file.") {
return "이것은 문서의 모든 페이지에서 간단한 일반 텍스트를 추출하여 텍스트 파일에 저장하는 것을 의미합니다.";
} else if (str == "Rendering") {
return "렌더링";
} else if (str == "This refers to making an image (like PNG) from every page of a document at a given DPI resolution. This feature is the basis for displaying a document in a GUI window.") {
return "이것은 주어진 DPI 해상도로 문서의 모든 페이지에서 이미지 (예: PNG)를 만드는 것을 의미합니다. 이 기능은 GUI 창에서 문서를 표시하는 기반입니다.";
}
}

return str;
Expand Down
9 changes: 9 additions & 0 deletions docs/footer.rst
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,15 @@
return "このソフトウェアは無保証で提供されており、明示または黙示を問わず、いかなる保証もありません。このソフトウェアはライセンスの下で配布され、ライセンスの条件に明示的に許可されている場合を除き、コピー、変更、または配布してはなりません。ライセンシング情報については、<a href='https://www.artifex.com?utm_source=rtd-pymupdf&utm_medium=rtd&utm_content=footer-link'>artifex.com</a>でライセンス情報を参照するか、アメリカ合衆国カリフォルニア州サンフランシスコのArtifex Software Inc. までお問い合わせください。"

}
} else if (docLanguage == "ko") {
if (str == "Find <b>#pymupdf</b> on <b>Discord</b>") {
return "<b>Discord</b> 에서 <b>#pymupdf</b> 찾기";
} else if (str == "Have a <b>&nbsp;question</b>? Need some <b>&nbsp;answers</b>?&nbsp;") {
return "<b>&nbsp;질문</b>이 있으신가요? <b>&nbsp;답변</b>이 필요하신가요?&nbsp;";
}
else if (str == "This software is provided AS-IS with no warranty, either express or implied. This software is distributed under license and may not be copied, modified or distributed except as expressly authorized under the terms of that license. Refer to licensing information at <a href='https://www.artifex.com?utm_source=rtd-pymupdf&utm_medium=rtd&utm_content=footer-link'>artifex.com</a> or contact Artifex Software Inc., 39 Mesa Street, Suite 108A, San Francisco CA 94129, United States for further information.") {
return "이 소프트웨어는 명시적이든 묵시적이든 어떠한 보증도 없이 있는 그대로 제공됩니다. 이 소프트웨어는 라이선스에 따라 배포되며, 해당 라이선스 조건에 명시적으로 승인된 경우를 제외하고는 복사, 수정 또는 배포할 수 없습니다. 라이선스 정보는 <a href='https://www.artifex.com?utm_source=rtd-pymupdf&utm_medium=rtd&utm_content=footer-link'>artifex.com</a> 에서 참조하거나, 미국 캘리포니아주 샌프란시스코 Mesa Street 39, Suite 108A 소재 Artifex Software Inc. 에 문의하시기 바랍니다."
}
}

return str;
Expand Down
102 changes: 81 additions & 21 deletions docs/header.rst
Original file line number Diff line number Diff line change
Expand Up @@ -68,11 +68,36 @@

<style>

#searchAndLangugeHolder {
display:flex;
justify-content:space-between;
align-items: center;
}

#discordAndForumHolder {
display:flex;
justify-content:space-between;
align-items:center;
margin-top:20px;
}

#languageToggle {
width:25%;
display: flex;
width:35%;
margin:8px 10px 0;
}

.forumLink {
display:flex;
align-items:baseline;
margin-top: -5px;
margin-left:10px;
}

.sidebar-search-container.top {
width: 65%;
}

#button-select-en {
padding: 5px 10px;
background-color: #fff;
Expand All @@ -82,6 +107,15 @@
}

#button-select-ja {
padding: 5px 10px;
background-color: #fff;
border: 1px solid #000;
border-radius: 0px;
border-left: 0;
font-size: 14px;
}

#button-select-ko {
padding: 5px 10px;
background-color: #fff;
border: 1px solid #000;
Expand All @@ -90,7 +124,7 @@
font-size: 14px;
}

#button-select-en , #button-select-ja, #button-select-en:hover , #button-select-ja:hover {
#button-select-en, #button-select-ja, #button-select-ko, #button-select-en:hover, #button-select-ja:hover, #button-select-ko:hover {
color: #fff;
text-decoration: none;
}
Expand All @@ -100,34 +134,50 @@
#languageToggle {
width:50%;
}

.sidebar-search-container.top {
width: 50%;
}
}

@media all and (max-width : 400px) {
@media all and (max-width : 700px) {

#searchAndLangugeHolder, #discordAndForumHolder {
flex-direction: column;
}

#languageToggle {
width:70%;
width:100%;
}
}

@media all and (max-width : 375px) {
#button-select-en , #button-select-ja {
font-size: 11px;
.sidebar-search-container.top {
width: 100%;
}

.forumLink {
flex-direction: column;
justify-content:space-between;
align-items:center;
}

}

</style>

<div style="display:flex;justify-content:space-between;align-items: center;">
<form class="sidebar-search-container top" method="get" action="search.html" role="search" style="width:75%">
<div id="searchAndLangugeHolder">
<form class="sidebar-search-container top" method="get" action="search.html" role="search">
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
<input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default">
</form>
<div id="languageToggle"><span><a id="button-select-en" href="javaScript:changeLanguage('en')">English</a></span><span><a id="button-select-ja" href="javaScript:changeLanguage('ja')">日本語</a></span></div>
<div id="languageToggle">
<span><a id="button-select-en" href="javaScript:changeLanguage('en')">English</a></span>
<span><a id="button-select-ja" href="javaScript:changeLanguage('ja')">日本語</a></span>
<span><a id="button-select-ko" href="javaScript:changeLanguage('ko')">한국어</a></span>
</div>
</div>

<div style="display:flex;justify-content:space-between;align-items:center;margin-top:20px;">


<div id="discordAndForumHolder">
<div class="discordLink" style="display:flex;align-items:center;margin-top: 5px;">
<a href="https://discord.gg/TSpYGBW4eq" id="findOnDiscord" target=_blank>Find <b>#pymupdf</b> on <b>Discord</b></a>
<a href="https://discord.gg/TSpYGBW4eq" target=_blank>
Expand All @@ -143,7 +193,7 @@
</div>
</a>
</div>
<div class="forumLink" style="display:flex;align-items:baseline;margin-top: -5px;margin-left:10px;">
<div class="forumLink">
<div id="forumCTAText"></div><a id="winking-cow-link" style="font-weight: bold;" href="https://forum.mupdf.com">Try our forum! <img alt="MuPDF Forum link logo" id="winking-cow-image" src="https://pymupdf.readthedocs.io/en/latest/_static/forum-logo.gif" width=38px height=auto /></a>
</div>
</div>
Expand All @@ -152,21 +202,31 @@
// highlightSelectedLanguage
var url_string = window.location.href;

if (document.getElementsByTagName('html')[0].getAttribute('lang')=="ja") {

if (document.getElementsByTagName('html')[0].getAttribute('lang')=="en") {
document.getElementById("button-select-en").style.backgroundColor = "#ff6600";
document.getElementById("button-select-ja").style.color = "#000";
document.getElementById("button-select-ko").style.color = "#000";
} else if (document.getElementsByTagName('html')[0].getAttribute('lang')=="ja") {
document.getElementById("button-select-ja").style.backgroundColor = "#ff6600";
document.getElementById("button-select-en").style.color = "#000";
} else {
document.getElementById("button-select-en").style.backgroundColor = "#ff6600";
document.getElementById("button-select-ko").style.color = "#000";
} else if (document.getElementsByTagName('html')[0].getAttribute('lang')=="ko") {
document.getElementById("button-select-ko").style.backgroundColor = "#ff6600";
document.getElementById("button-select-en").style.color = "#000";
document.getElementById("button-select-ja").style.color = "#000";
}


function changeLanguage(lang) {
var new_url;

if (lang == "en") {
new_url = url_string.replace("/ja/", "/en/");
} else {
new_url = url_string.replace("/en/", "/ja/");
new_url = url_string.replace(/\/(ko|ja)\//, "/en/");
} else if (lang == "ja") {
new_url = url_string.replace(/\/(ko|en)\//, "/ja/");
} else if (lang == "ko") {
new_url = url_string.replace(/\/(ja|en)\//, "/ko/");
}

window.location.replace(new_url);
Expand Down
25 changes: 25 additions & 0 deletions docs/locales/ko/.readthedocs.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# .readthedocs.yaml
# Note: We use this dedicated yaml inside the locales/ko folder as RTD was having problems building a PDF
# This yaml is the same as the main one - it just removes the PDF build option

# Required
version: 2

# Set the version of Python and other tools you might need
build:
os: ubuntu-20.04
tools:
python: "3.9"
# You can also specify other tool versions:
# nodejs: "16"
# rust: "1.55"
# golang: "1.17"

# Build documentation in the docs/ directory with Sphinx
sphinx:
configuration: docs/conf.py

# Optionally declare the Python requirements required to build your docs
python:
install:
- requirements: docs/requirements.txt
Binary file added docs/locales/ko/LC_MESSAGES/404.mo
Binary file not shown.
Loading