Browse Source

Apply branch `update-translations-prompt`

pull/14015/head
Nils Lindemann 3 weeks ago
parent
commit
298323188c
  1. 115
      scripts/translate.py

115
scripts/translate.py

@ -34,6 +34,36 @@ The content is written in markdown, write the translation in markdown as well. D
When there's an example of code, the console or a terminal, normally surrounded by triple backticks and a keyword like "console" or "bash" (e.g. ```console), do not translate the content, keep the original in English.
For example, if the original (English) content is:
```bash
# Print greeting
echo "Hello, World!"
```
It should be exacly the same in the output document:
```bash
# Print greeting
echo "Hello, World!"
```
If the original (English) content is:
```console
$ <font color="#4E9A06">fastapi</font> run <u style="text-decoration-style:solid">main.py</u>
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting server
Searching for package file structure
```
It should be exacly the same in the output document:
```console
$ <font color="#4E9A06">fastapi</font> run <u style="text-decoration-style:solid">main.py</u>
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting server
Searching for package file structure
```
The original content will be surrounded by triple percentage signs (%) and you should translate it to the target language. Do not include the triple percentage signs in the translation.
There are special blocks of notes, tips and others that look like:
@ -63,6 +93,81 @@ Source:
Result:
/// details | Vista previa
Every Markdown heading in the English text (all levels) ends with a part inside curly brackets. This part denotes the hash of this heading, which is used in links to this heading. In translations, translate the heading, but do not translate this hash part, so that links do not break.
Examples of how to translate a heading:
Source (English):
## Alternative API docs { #alternative-api-docs }
Result (Spanish):
## Documentación de la API alternativa { #alternative-api-docs }
Source (English):
### Example { #example }
Result (German):
### Beispiel { #example }
Use the following rules for links (apply both to Markdown-style links ([text](url)) and to HTML-style <a> tags):
1) For relative URLs only translate link text. Do not translate the URL or its parts
Example:
Source (English):
[One of the fastest Python frameworks available](#performance)
Result (German):
[Eines der schnellsten verfügbaren Python-Frameworks](#performance)
2) For absolute URLs pointing to https://fastapi.tiangolo.com, only translate link text and change the URL by adding language code (https://fastapi.tiangolo.com/{language_code}[rest part of the url]).
Example:
Source (English):
<a href="https://fastapi.tiangolo.com/tutorial/path-params/#documentation" class="external-link" target="_blank">Documentation</a>
Result (Spanish):
<a href="https://fastapi.tiangolo.com/es/tutorial/path-params/#documentation" class="external-link" target="_blank">Documentación</a>
2.1) Do not add language codes for URLs that point to static assets (e.g., images, CSS, JavaScript).
Example:
Source (English):
<a href="https://fastapi.tiangolo.com/img/something.jpg" class="external-link" target="_blank">Something</a>
Result (Spanish):
<a href="https://fastapi.tiangolo.com/img/something.jpg" class="external-link" target="_blank">Algo</a>
3) For internal links, only translate link text.
Example:
Source (English):
[Create Pull Requests](help-fastapi.md#create-a-pull-request){.internal-link target=_blank}
Result (German):
[Pull Requests erzeugen](help-fastapi.md#create-a-pull-request){.internal-link target=_blank}
4) Do not translate anchor fragments in links (the part after #), as they must remain the same to work correctly.
"""
app = typer.Typer()
@ -70,7 +175,7 @@ app = typer.Typer()
@lru_cache
def get_langs() -> dict[str, str]:
return yaml.safe_load(Path("docs/language_names.yml").read_text())
return yaml.safe_load(Path("docs/language_names.yml").read_text(encoding="utf-8"))
def generate_lang_path(*, lang: str, path: Path) -> Path:
@ -105,7 +210,7 @@ def translate_page(
lang_path.mkdir(exist_ok=True)
lang_prompt_path = lang_path / "llm-prompt.md"
assert lang_prompt_path.exists(), f"Prompt file not found: {lang_prompt_path}"
lang_prompt_content = lang_prompt_path.read_text()
lang_prompt_content = lang_prompt_path.read_text(encoding="utf-8")
en_docs_path = Path("docs/en/docs")
assert str(en_path).startswith(str(en_docs_path)), (
@ -113,11 +218,11 @@ def translate_page(
)
out_path = generate_lang_path(lang=language, path=en_path)
out_path.parent.mkdir(parents=True, exist_ok=True)
original_content = en_path.read_text()
original_content = en_path.read_text(encoding="utf-8")
old_translation: str | None = None
if out_path.exists():
print(f"Found existing translation: {out_path}")
old_translation = out_path.read_text()
old_translation = out_path.read_text(encoding="utf-8")
print(f"Translating {en_path} to {language} ({language_name})")
agent = Agent("openai:gpt-4o")
@ -154,7 +259,7 @@ def translate_page(
result = agent.run_sync(prompt)
out_content = f"{result.data.strip()}\n"
print(f"Saving translation to {out_path}")
out_path.write_text(out_content)
out_path.write_text(out_content, encoding="utf-8", newline="\n")
def iter_all_en_paths() -> Iterable[Path]:

Loading…
Cancel
Save