- Email translation moves from LibreTranslate to our own translator
service (translator/): Mozilla's Firefox Translations models on the
Bergamot engine, fastText language detection (176 languages). Polish,
English, German, French, Spanish and Italian on first start (~350 MB
instead of ~10 GB); Admin panel > Email translation installs and
removes languages. Built and pushed as the `translator` image.
- Every message is translated paragraph by paragraph as plain text;
names travel with their sentence and are kept only where the model
changed them; a sentence start the model copied ("Enclosed") is tried
again in lower case; list markers are not sent
- The Translate button shows only for installed languages
- New logo: favicon, app/maskable/iPhone icons, notification badge,
email logo and calendar copy regenerated; BIMI logo rebuilt in SVG
Tiny PS with its gradients; masks render in browsers
- Launch screen background is the app's dark grey
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
31 lines
819 B
Python
31 lines
819 B
Python
"""What email translation offers (app/translation.py), for the reading pane."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from fastapi import APIRouter
|
|
from pydantic import BaseModel
|
|
|
|
from app import translation
|
|
from app.identity.deps import CurrentUser
|
|
|
|
router = APIRouter(prefix="/translation", tags=["mail"])
|
|
|
|
|
|
class LanguageOut(BaseModel):
|
|
code: str
|
|
name: str
|
|
|
|
|
|
class TranslationInfoOut(BaseModel):
|
|
available: bool
|
|
languages: list[LanguageOut]
|
|
|
|
|
|
@router.get("/languages", response_model=TranslationInfoOut)
|
|
async def translation_languages(user: CurrentUser) -> TranslationInfoOut:
|
|
found = await translation.languages()
|
|
return TranslationInfoOut(
|
|
available=len(found) > 1, # English alone translates nothing
|
|
languages=[LanguageOut(code=x.code, name=x.name) for x in found],
|
|
)
|