Skip to content

Commit

Permalink
🧑‍💻 Add translate_shell.tools.po
Browse files Browse the repository at this point in the history
  • Loading branch information
Freed-Wu committed Jul 16, 2023
1 parent e63717d commit 346d08f
Show file tree
Hide file tree
Showing 8 changed files with 149 additions and 76 deletions.
5 changes: 2 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ LABEL org.opencontainers.image.source=https://github.com/Freed-Wu/translate-shel
LABEL org.opencontainers.image.description="Translate .po of one repo"
LABEL org.opencontainers.image.licenses=GPL-3.0

RUN pip install polib translate_shell tqdm
COPY scripts/entrypoint.py /
RUN pip install 'translate_shell[po]'

ENTRYPOINT ["/entrypoint.py"]
ENTRYPOINT ["python", "-m", "translate_shell.tools.po"]
19 changes: 5 additions & 14 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,39 +4,30 @@ description: Translate .po of one repo
inputs:
files:
description: files need to be translated, support glob
required: false
default: "**/*.po"
target_lang:
target-lang:
description: target language, po's metadata's Language override it
required: false
default: zh-cn
source_lang:
source-lang:
description: source language
required: false
default: en
translator:
description: translator
required: false
default: google
wrapwidth:
description: wrap the width by polib
required: false
default: "76"
progress:
description: display progress of translation
required: false
default: "false"
verbose:
description: display diff of translation
required: false
default: "true"
dry_run:
description: don't translate
required: false
dry-run:
description: do nothing
default: "false"
force:
description: force retranslate translated po
required: false
description: force to retranslate translated po
default: "false"
branding:
icon: check
Expand Down
5 changes: 4 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ Source = "https://github.com/Freed-Wu/translate-shell"
trans = "translate_shell.__main__:main"

[tool.setuptools.package-data]
translate_shell = ["py.typed", "assets/**"]
translate_shell = ["py.typed", "assets/**", "action.yml"]

[tool.setuptools.data-files]
"share/applications" = ["assets/desktop/translate-shell.desktop"]
Expand Down Expand Up @@ -90,6 +90,9 @@ file = "requirements/notification.txt"
[tool.setuptools.dynamic.optional-dependencies.openai]
file = "requirements/openai.txt"

[tool.setuptools.dynamic.optional-dependencies.po]
file = "requirements/po.txt"

[tool.setuptools.dynamic.optional-dependencies.rich]
file = "requirements/rich.txt"

Expand Down
4 changes: 4 additions & 0 deletions requirements/po.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/usr/bin/env -S pip install -r

polib
tqdm
58 changes: 0 additions & 58 deletions scripts/entrypoint.py

This file was deleted.

68 changes: 68 additions & 0 deletions src/translate_shell/tools/po/__main__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
r"""This module can be called by
`python -m <https://docs.python.org/3/library/__main__.html>`_.
"""
import os
from argparse import ArgumentParser, RawDescriptionHelpFormatter
from datetime import datetime

import yaml

from ... import __name__ as NAME
from ... import __version__

try:
import shtab
except ImportError:
from ...external import shtab

NAME = NAME.replace("_", "-")
VERSION = rf"""{NAME} {__version__}
Copyright (C) {datetime.now().year}
Written by Wu Zhenyu
"""
EPILOG = """
Report bugs to <wuzhenyu@ustc.edu>.
"""


def get_parser() -> ArgumentParser:
r"""Get a parser for unit test."""
action = yaml.safe_load(
open(os.path.join(os.path.dirname(__file__), "action.yml"))
)
parser = ArgumentParser(
description=action["description"],
epilog=EPILOG,
formatter_class=RawDescriptionHelpFormatter,
)
parser.add_argument("--version", version=VERSION, action="version")
shtab.add_argument_to(parser)
for input, info in action["inputs"].items():
parser.add_argument(
"--" + input,
# https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#example-specifying-inputs
default=os.getenv(
"INPUT_" + input.upper().replace("-", "_"), info["default"]
),
help=info["description"] + ". default: %(default)s",
)
parser.add_argument(
"workspace",
default=os.getenv("GITHUB_WORKSPACE", "."),
help="the directory which contains *.po. default: %(default)s",
)
return parser


def main() -> None:
r"""Parse arguments and provide shell completions."""
parser = get_parser()
args = parser.parse_args()

from .main import run

run(args)


if __name__ == "__main__":
main()
1 change: 1 addition & 0 deletions src/translate_shell/tools/po/action.yml
65 changes: 65 additions & 0 deletions src/translate_shell/tools/po/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
r"""Refer ``action.yml``."""
import os
from argparse import Namespace
from difflib import Differ
from glob import glob

from polib import pofile
from tqdm import tqdm

from translate_shell.translate import translate


def run(args: Namespace) -> None:
"""Run.
:param args:
:type args: Namespace
:rtype: None
"""
fnames = args.files
default_target_lang = args.target_lang
source_lang = args.source_lang
translator = args.translator
wrapwidth = int(args.wrapwidth)
progress = args.progress.lower() == "true"
verbose = args.verbose.lower() == "true"
dry_run = args.dry_run.lower() == "true"
force = args.force.lower() == "true"
workspace = args.workspace

differ = Differ()
files = sum(
[
glob(os.path.join(workspace, fname), recursive=True)
for fname in fnames.splitlines()
],
[],
)
for file in files:
po = pofile(file, wrapwidth=wrapwidth)
target_lang = po.metadata.get("Language", default_target_lang)
entries = po.untranslated_entries()
if force:
entries += po.translated_entries()
print(f"{po.fpath}: {len(entries)}")
if dry_run:
continue
if progress:
entries = tqdm(entries)
for entry in entries:
old = str(entry).splitlines()
try:
entry.msgstr = translate(
entry.msgid, target_lang, source_lang, [translator]
).results[0]["paraphrase"]
except Exception: # skipcq: PYL-W0703
po.save()
continue
entry.fuzzy = False # type: ignore
if verbose:
new = str(entry).splitlines()
diff = differ.compare(old, new)
print("\n".join(diff))
if len(entries):
po.save()

0 comments on commit 346d08f

Please sign in to comment.