LibreTranslate/app/init.py

95 lines
3.4 KiB
Python
Raw Normal View History

2020-12-20 16:55:56 +00:00
from pathlib import Path
import polyglot
from argostranslate import package, translate
import app.language
2020-12-19 22:40:37 +00:00
2021-05-18 03:41:02 +00:00
def boot(load_only=None):
2021-05-16 14:42:58 +00:00
try:
check_and_install_models(load_only_lang_codes=load_only)
check_and_install_transliteration()
except Exception as e:
print("Cannot update models (normal if you're offline): %s" % str(e))
2020-12-19 22:40:37 +00:00
2021-05-18 03:41:02 +00:00
def check_and_install_models(force=False, load_only_lang_codes=None):
if len(package.get_installed_packages()) < 2 or force:
2021-02-08 15:56:45 +00:00
# Update package definitions from remote
print("Updating language models")
package.update_package_index()
# Load available packages from local package index
2022-09-17 06:45:59 +00:00
available_packages = package.get_available_packages()
2021-02-08 15:56:45 +00:00
print("Found %s models" % len(available_packages))
if load_only_lang_codes is not None:
# load_only_lang_codes: List[str] (codes)
# Ensure the user does not use any unavailable language code.
unavailable_lang_codes = set(load_only_lang_codes)
for pack in available_packages:
unavailable_lang_codes -= {pack.from_code, pack.to_code}
if unavailable_lang_codes:
2021-05-18 03:41:02 +00:00
raise ValueError(
"Unavailable language codes: %s."
% ",".join(sorted(unavailable_lang_codes))
)
# Keep only the packages that have both from_code and to_code in our list.
available_packages = [
pack
for pack in available_packages
if pack.from_code in load_only_lang_codes and pack.to_code in load_only_lang_codes
]
if not available_packages:
2021-05-18 03:41:02 +00:00
raise ValueError("no available package")
print("Keep %s models" % len(available_packages))
2021-02-08 15:56:45 +00:00
# Download and install all available packages
for available_package in available_packages:
2021-05-18 03:41:02 +00:00
print(
"Downloading %s (%s) ..."
% (available_package, available_package.package_version)
)
2021-02-08 15:56:45 +00:00
download_path = available_package.download()
package.install_from_path(download_path)
# reload installed languages
2022-09-17 06:45:59 +00:00
app.language.languages = translate.get_installed_languages()
2021-05-18 03:41:02 +00:00
print(
"Loaded support for %s languages (%s models total)!"
2022-09-17 06:45:59 +00:00
% (len(translate.get_installed_languages()), len(available_packages))
2021-05-18 03:41:02 +00:00
)
def check_and_install_transliteration(force=False):
# 'en' is not a supported transliteration language
2021-05-18 03:41:02 +00:00
transliteration_languages = [
2022-06-21 18:22:12 +00:00
l.code for l in app.language.load_languages() if l.code != "en"
2021-05-18 03:41:02 +00:00
]
# check installed
install_needed = []
if not force:
t_packages_path = Path(polyglot.polyglot_path) / "transliteration2"
for lang in transliteration_languages:
2021-05-18 03:41:02 +00:00
if not (
t_packages_path / lang / f"transliteration.{lang}.tar.bz2"
).exists():
install_needed.append(lang)
else:
install_needed = transliteration_languages
# install the needed transliteration packages
if install_needed:
2021-05-18 03:41:02 +00:00
print(
f"Installing transliteration models for the following languages: {', '.join(install_needed)}"
)
from polyglot.downloader import Downloader
2021-05-18 03:41:02 +00:00
downloader = Downloader()
for lang in install_needed:
downloader.download(f"transliteration2.{lang}")