mirror of https://github.com/tiangolo/fastapi.git
🔨 Update translations script to remove old (removed) files (#13928)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
parent
d67f092db8
commit
ae02be90b6
|
|
@ -4,56 +4,6 @@ Use the informal grammar (use "tú" instead of "usted").
|
||||||
|
|
||||||
For instructions or titles in imperative, keep them in imperative, for example "Edit it" to "Edítalo".
|
For instructions or titles in imperative, keep them in imperative, for example "Edit it" to "Edítalo".
|
||||||
|
|
||||||
There are special blocks of notes, tips and others that look like:
|
|
||||||
|
|
||||||
/// note
|
|
||||||
|
|
||||||
To translate it, keep the same line and add the translation after a vertical bar:
|
|
||||||
|
|
||||||
/// note | Nota
|
|
||||||
|
|
||||||
Some examples:
|
|
||||||
|
|
||||||
Source:
|
|
||||||
|
|
||||||
/// tip
|
|
||||||
|
|
||||||
Result:
|
|
||||||
|
|
||||||
/// tip | Consejo
|
|
||||||
|
|
||||||
Source:
|
|
||||||
|
|
||||||
/// details | Preview
|
|
||||||
|
|
||||||
Result:
|
|
||||||
|
|
||||||
/// details | Vista previa
|
|
||||||
|
|
||||||
Source:
|
|
||||||
|
|
||||||
/// warning
|
|
||||||
|
|
||||||
Result:
|
|
||||||
|
|
||||||
/// warning | Advertencia
|
|
||||||
|
|
||||||
Source:
|
|
||||||
|
|
||||||
/// info
|
|
||||||
|
|
||||||
Result:
|
|
||||||
|
|
||||||
/// info | Información
|
|
||||||
|
|
||||||
Source:
|
|
||||||
|
|
||||||
/// note | Technical Details
|
|
||||||
|
|
||||||
Result:
|
|
||||||
|
|
||||||
/// note | Detalles Técnicos
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
For the next terms, use the following translations:
|
For the next terms, use the following translations:
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ from typing import Iterable
|
||||||
import typer
|
import typer
|
||||||
import yaml
|
import yaml
|
||||||
from pydantic_ai import Agent
|
from pydantic_ai import Agent
|
||||||
|
from rich import print
|
||||||
|
|
||||||
non_translated_sections = (
|
non_translated_sections = (
|
||||||
"reference/",
|
"reference/",
|
||||||
|
|
@ -28,8 +29,38 @@ 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.
|
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.
|
||||||
|
|
||||||
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.
|
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:
|
||||||
|
|
||||||
|
/// note
|
||||||
|
|
||||||
|
To translate it, keep the same line and add the translation after a vertical bar.
|
||||||
|
|
||||||
|
For example, if you were translating to Spanish, you would write:
|
||||||
|
|
||||||
|
/// note | Nota
|
||||||
|
|
||||||
|
Some examples in Spanish:
|
||||||
|
|
||||||
|
Source:
|
||||||
|
|
||||||
|
/// tip
|
||||||
|
|
||||||
|
Result:
|
||||||
|
|
||||||
|
/// tip | Consejo
|
||||||
|
|
||||||
|
Source:
|
||||||
|
|
||||||
|
/// details | Preview
|
||||||
|
|
||||||
|
Result:
|
||||||
|
|
||||||
|
/// details | Vista previa
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
app = typer.Typer()
|
||||||
|
|
||||||
|
|
||||||
@lru_cache
|
@lru_cache
|
||||||
def get_langs() -> dict[str, str]:
|
def get_langs() -> dict[str, str]:
|
||||||
|
|
@ -46,6 +77,17 @@ def generate_lang_path(*, lang: str, path: Path) -> Path:
|
||||||
return out_path
|
return out_path
|
||||||
|
|
||||||
|
|
||||||
|
def generate_en_path(*, lang: str, path: Path) -> Path:
|
||||||
|
en_docs_path = Path("docs/en/docs")
|
||||||
|
assert not str(path).startswith(str(en_docs_path)), (
|
||||||
|
f"Path must not be inside {en_docs_path}"
|
||||||
|
)
|
||||||
|
lang_docs_path = Path(f"docs/{lang}/docs")
|
||||||
|
out_path = Path(str(path).replace(str(lang_docs_path), str(en_docs_path)))
|
||||||
|
return out_path
|
||||||
|
|
||||||
|
|
||||||
|
@app.command()
|
||||||
def translate_page(*, lang: str, path: Path) -> None:
|
def translate_page(*, lang: str, path: Path) -> None:
|
||||||
langs = get_langs()
|
langs = get_langs()
|
||||||
language = langs[lang]
|
language = langs[lang]
|
||||||
|
|
@ -68,8 +110,8 @@ def translate_page(*, lang: str, path: Path) -> None:
|
||||||
agent = Agent("openai:gpt-4o")
|
agent = Agent("openai:gpt-4o")
|
||||||
|
|
||||||
prompt_segments = [
|
prompt_segments = [
|
||||||
lang_prompt_content,
|
|
||||||
general_prompt,
|
general_prompt,
|
||||||
|
lang_prompt_content,
|
||||||
]
|
]
|
||||||
if old_translation:
|
if old_translation:
|
||||||
prompt_segments.extend(
|
prompt_segments.extend(
|
||||||
|
|
@ -119,6 +161,7 @@ def iter_paths_to_translate() -> Iterable[Path]:
|
||||||
yield path
|
yield path
|
||||||
|
|
||||||
|
|
||||||
|
@app.command()
|
||||||
def translate_all(lang: str) -> None:
|
def translate_all(lang: str) -> None:
|
||||||
paths_to_process: list[Path] = []
|
paths_to_process: list[Path] = []
|
||||||
for path in iter_paths_to_translate():
|
for path in iter_paths_to_translate():
|
||||||
|
|
@ -151,12 +194,48 @@ def translate_all(lang: str) -> None:
|
||||||
print(f"Done translating: {p}")
|
print(f"Done translating: {p}")
|
||||||
|
|
||||||
|
|
||||||
def main(*, lang: str, path: Path = None) -> None:
|
@app.command()
|
||||||
if path:
|
def list_removable(lang: str) -> list[Path]:
|
||||||
translate_page(lang=lang, path=path)
|
removable_paths: list[Path] = []
|
||||||
else:
|
lang_paths = Path(f"docs/{lang}").rglob("*.md")
|
||||||
translate_all(lang=lang)
|
for path in lang_paths:
|
||||||
|
en_path = generate_en_path(lang=lang, path=path)
|
||||||
|
if not en_path.exists():
|
||||||
|
removable_paths.append(path)
|
||||||
|
print(removable_paths)
|
||||||
|
return removable_paths
|
||||||
|
|
||||||
|
|
||||||
|
@app.command()
|
||||||
|
def list_all_removable() -> list[Path]:
|
||||||
|
all_removable_paths: list[Path] = []
|
||||||
|
langs = get_langs()
|
||||||
|
for lang in langs:
|
||||||
|
if lang == "en":
|
||||||
|
continue
|
||||||
|
removable_paths = list_removable(lang)
|
||||||
|
all_removable_paths.extend(removable_paths)
|
||||||
|
print(all_removable_paths)
|
||||||
|
return all_removable_paths
|
||||||
|
|
||||||
|
|
||||||
|
@app.command()
|
||||||
|
def remove_removable(lang: str) -> None:
|
||||||
|
removable_paths = list_removable(lang)
|
||||||
|
for path in removable_paths:
|
||||||
|
path.unlink()
|
||||||
|
print(f"Removed: {path}")
|
||||||
|
print("Done removing all removable paths")
|
||||||
|
|
||||||
|
|
||||||
|
@app.command()
|
||||||
|
def remove_all_removable() -> None:
|
||||||
|
all_removable = list_all_removable()
|
||||||
|
for removable_path in all_removable:
|
||||||
|
removable_path.unlink()
|
||||||
|
print(f"Removed: {removable_path}")
|
||||||
|
print("Done removing all removable paths")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
typer.run(main)
|
app()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue