Skip to content

Commit

Permalink
feat: add freetranslators
Browse files Browse the repository at this point in the history
  • Loading branch information
versun committed Jun 19, 2024
1 parent cefa68c commit ef7f21b
Show file tree
Hide file tree
Showing 9 changed files with 232 additions and 1,621 deletions.
1,685 changes: 84 additions & 1,601 deletions locale/zh_Hans/LC_MESSAGES/django.po

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions requirements/dev.txt
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,6 @@ google-generativeai
#django-taggit
#django-tagulous
git+https://github.com/versun/django-tagulous2
easytranslator
translators
langdetect
3 changes: 3 additions & 0 deletions requirements/prod.txt
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,6 @@ google-generativeai
#django-taggit
#django-tagulous
git+https://github.com/versun/django-tagulous2
easytranslator
translators
langdetect
13 changes: 13 additions & 0 deletions translator/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,18 @@ class GroqTranslatorAdmin(BaseTranslatorAdmin):
"base_url",
]

class FreeTranslatorsAdmin(BaseTranslatorAdmin):
fields = [
"name",
"proxies",
"max_characters",
]
list_display = [
"name",
"is_valid",
"proxies",
]


class Translated_ContentAdmin(admin.ModelAdmin):
fields = [
Expand Down Expand Up @@ -367,6 +379,7 @@ class TestTranslatorAdmin(BaseTranslatorAdmin):
core_admin_site.register(TogetherAITranslator, TogetherAITranslatorAdmin)
core_admin_site.register(OpenRouterAITranslator, OpenRouterAITranslatorAdmin)
core_admin_site.register(GroqTranslator, GroqTranslatorAdmin)
core_admin_site.register(FreeTranslators, FreeTranslatorsAdmin)

if settings.DEBUG:
core_admin_site.register(Translated_Content, Translated_ContentAdmin)
Expand Down
29 changes: 29 additions & 0 deletions translator/migrations/0035_freetranslators.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Generated by Django 5.0.6 on 2024-06-19 01:05

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('translator', '0034_rename_new_hash_translated_content_hash'),
]

operations = [
migrations.CreateModel(
name='FreeTranslators',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100, unique=True, verbose_name='Name')),
('valid', models.BooleanField(null=True, verbose_name='Valid')),
('is_ai', models.BooleanField(default=False, editable=False)),
('translators', models.TextField(blank=True, default='', null=True)),
('proxies', models.URLField(blank=True, default=None, help_text='e.g. http://127.0.0.1:7890, https://127.0.0.1:1080', null=True, verbose_name='Proxy(optional)')),
('max_characters', models.IntegerField(default=5000)),
],
options={
'verbose_name': 'Free Translators',
'verbose_name_plural': 'Free Translators',
},
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 5.0.6 on 2024-06-19 05:09

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('translator', '0035_freetranslators'),
]

operations = [
migrations.AlterField(
model_name='googletranslatewebtranslator',
name='base_url',
field=models.URLField(blank=True, help_text='It is recommended to leave this blank in order to automatically select the best server', null=True, verbose_name='URL'),
),
migrations.AlterField(
model_name='googletranslatewebtranslator',
name='interval',
field=models.IntegerField(default=1, verbose_name='Request Interval(s)'),
),
]
2 changes: 1 addition & 1 deletion translator/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,6 @@
from .togetherai import TogetherAITranslator
from .openrouterai import OpenRouterAITranslator
from .groq import GroqTranslator

from .free_translators import FreeTranslators

from .dev import TestTranslator
59 changes: 59 additions & 0 deletions translator/models/free_translators.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
from .base import TranslatorEngine
import logging
from django.db import models
from django.utils.translation import gettext_lazy as _
from easytranslator import EasyTranslator
from langdetect import detect


class FreeTranslators(TranslatorEngine):
translators = models.TextField(null=True, blank=True, default="") # list[dict]
proxies = models.URLField(
_("Proxy(optional)"),
null=True,
blank=True,
default=None,
help_text=("e.g. http://127.0.0.1:7890, https://127.0.0.1:1080"),
)
max_characters = models.IntegerField(default=5000)

class Meta:
verbose_name = "Free Translators"
verbose_name_plural = "Free Translators"

def _init(self):
# if not self.translators:
# self.translators = []
return EasyTranslator(translators=[], top_n=10)

def validate(self) -> bool:
return True

def translate(self, text: str, target_language: str, source_language:str="auto", **kwargs) -> dict:
et = self._init()
source_language = detect(text) if source_language == "auto" else source_language
results = et.translate(
text=text, dest_lang=target_language, src_lang=source_language, proxies=self.proxies
)

translated_text = (
results.get("translated_text") if results.get("status") == "success" else ""
)
return {"text": translated_text, "characters": len(text)}

def translate_batch(self, text_list: list, target_language: str, **kwargs) -> dict:
et = self._init()
results = et.translate_batch(
text_list=text_list, dest_lang=target_language, proxies=self.proxies
)

return results
"""
{
original_text: {
"translated_text": "...",
"status": "success" / "error"
"error_info": error info if got error
}
}
"""
36 changes: 17 additions & 19 deletions translator/models/google_translate_web.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@
import logging
from django.db import models
from django.utils.translation import gettext_lazy as _
import translators as ts


class GoogleTranslateWebTranslator(TranslatorEngine):
base_url = models.URLField(
_("URL"), default="https://translate.googleapis.com/translate_a/single"
)
_("URL"), null=True, blank=True, help_text=_("It is recommended to leave this blank in order to automatically select the best server")
) # https://translate.googleapis.com/translate_a/single
proxy = models.URLField(_("Proxy(optional)"), null=True, blank=True, default=None)
interval = models.IntegerField(_("Request Interval(s)"), default=3)
interval = models.IntegerField(_("Request Interval(s)"), default=1)
max_characters = models.IntegerField(default=1000)
language_code_map = {
"English": "en",
Expand Down Expand Up @@ -55,22 +56,19 @@ def translate(self, text: str, target_language: str, **kwargs) -> dict:
)
return {"text": translated_text, "characters": len(text)}
try:
params = {
"client": "gtx",
"sl": "auto",
"tl": target_language,
"dt": "t",
"q": text,
}
resp = httpx.get(self.base_url, params=params, timeout=10, proxy=self.proxy)
resp.raise_for_status()
resp_json = resp.json()
if resp_json:
translated_text = resp_json[0][0][0]
else:
logging.error(
"GoogleTranslateWebTranslator->Invalid response: %s", resp.text
)
# params = {
# "client": "gtx",
# "sl": "auto",
# "tl": target_language,
# "dt": "t",
# "q": text,
# }
# resp = httpx.get(self.base_url, params=params, timeout=10, proxy=self.proxy)
# resp.raise_for_status()
# resp_json = resp.json()
results = ts.translate_text(text, to_language=target_language, translator="google", reset_host_url=self.base_url, proxies=self.proxy)
if results:
translated_text = results
except Exception as e:
logging.error("GoogleTranslateWebTranslator->%s: %s", e, text)
finally:
Expand Down

0 comments on commit ef7f21b

Please sign in to comment.