Files
Android-pyApi/android_pyapi/android/view_translation.py
T
shuiyu1123 506f9ac725 feat: 新增 42 个 Android API 模块
新增模块覆盖:
系统层 (14): system, security, print, opengl, renderscript, transition,
test, service_notification, service_controls, service_quicksettings,
service_wallpaper, service_autofill, service_dreams, service_vr

应用层 (13): app_admin, app_backup, app_job, app_usage, app_role,
app_people, appwidget, companion, credentials, mtp, sip, telecom, speech

硬件媒体层 (15): hardware_display, hardware_fingerprint, hardware_usb,
hardware_input, media_audiofx, media_browse, media_session, media_tv,
media_midi, media_projection, uwb, se, view_autofill, view_textclassifier,
view_translation

总计 94 个模块,75,342 行代码
2026-06-24 12:00:28 +00:00

435 lines
16 KiB
Python

"""
Android view.translation 组件 — TranslationManager, TranslationRequest, TranslationResponse 等
方法签名完全对齐 Android SDK
"""
from typing import Any, Callable, Dict, List, Optional
from .._core import Stub, AndroidOnlyError
# ═══════════════════════════════════════════════════════════════
# TranslationSpec
# ═══════════════════════════════════════════════════════════════
class TranslationSpec(Stub):
"""TranslationSpec — 翻译规格"""
DATA_TYPE_TEXT = 0
DATA_TYPE_UI = 1
def __init__(self):
super().__init__()
self._locale: Optional[str] = None
self._data_type = TranslationSpec.DATA_TYPE_TEXT
def setLocale(self, locale: str) -> "TranslationSpec":
self._locale = locale
return self
def setDataType(self, dataType: int) -> "TranslationSpec":
self._data_type = dataType
return self
def getLocale(self) -> Optional[str]:
return self._locale
def getDataType(self) -> int:
return self._data_type
# ═══════════════════════════════════════════════════════════════
# TranslationContext
# ═══════════════════════════════════════════════════════════════
class TranslationContext(Stub):
"""TranslationContext — 翻译上下文"""
def __init__(self, sourceLocale: str = "", targetLocale: str = "",
translationFlags: int = 0):
super().__init__()
self._source_locale = sourceLocale
self._target_locale = targetLocale
self._translation_flags = translationFlags
def getSourceLocale(self) -> str:
return self._source_locale
def getTargetLocale(self) -> str:
return self._target_locale
def getTranslationFlags(self) -> int:
return self._translation_flags
# ═══════════════════════════════════════════════════════════════
# TranslationCapability
# ═══════════════════════════════════════════════════════════════
class TranslationCapability(Stub):
"""TranslationCapability — 翻译能力"""
STATE_AVAILABLE = 0
STATE_UNAVAILABLE = 1
STATE_CAPABLE = 2
STATE_NOT_CAPABLE = 3
STATE_DOWNLOADING = 4
STATE_NOT_ALLOWED = 5
def __init__(self, state: int = STATE_UNAVAILABLE,
sourceLocale: str = "", targetLocale: str = "",
uiTranslationEnabled: bool = False,
textTranslationEnabled: bool = False,
translationService: str = "desktop"):
super().__init__()
self._state = state
self._source_locale = sourceLocale
self._target_locale = targetLocale
self._ui_translation_enabled = uiTranslationEnabled
self._text_translation_enabled = textTranslationEnabled
self._translation_service = translationService
def getState(self) -> int:
return self._state
def getSourceLocale(self) -> str:
return self._source_locale
def getTargetLocale(self) -> str:
return self._target_locale
def isUiTranslationEnabled(self) -> bool:
return self._ui_translation_enabled
def isTextTranslationEnabled(self) -> bool:
return self._text_translation_enabled
def getTranslationService(self) -> str:
return self._translation_service
# ═══════════════════════════════════════════════════════════════
# TranslationResult
# ═══════════════════════════════════════════════════════════════
class TranslationResult(Stub):
"""TranslationResult — 翻译结果"""
def __init__(self, translatedText: str = "", sourceText: str = "",
translationStatus: int = 0):
super().__init__()
self._translated_text = translatedText
self._source_text = sourceText
self._translation_status = translationStatus
def getTranslatedText(self) -> str:
return self._translated_text
def getSourceText(self) -> str:
return self._source_text
def getTranslationStatus(self) -> int:
return self._translation_status
# ═══════════════════════════════════════════════════════════════
# TranslationRequest
# ═══════════════════════════════════════════════════════════════
class TranslationRequest(Stub):
"""TranslationRequest — 翻译请求"""
class Builder(Stub):
"""TranslationRequest.Builder — 翻译请求构建器"""
def __init__(self):
super().__init__()
self._source_text: str = ""
self._source_locale: str = ""
self._target_locale: str = ""
self._translation_flags: int = 0
self._ui_translation_result: Any = None
self._request_id: int = 0
self._translation_config: Any = None
def setSourceText(self, text: str) -> "TranslationRequest.Builder":
self._source_text = text
return self
def setSourceLocale(self, locale: str) -> "TranslationRequest.Builder":
self._source_locale = locale
return self
def setTargetLocale(self, locale: str) -> "TranslationRequest.Builder":
self._target_locale = locale
return self
def setTranslationFlags(self, flags: int) -> "TranslationRequest.Builder":
self._translation_flags = flags
return self
def setUiTranslationResult(self, result: Any) -> "TranslationRequest.Builder":
self._ui_translation_result = result
return self
def setRequestId(self, id: int) -> "TranslationRequest.Builder":
self._request_id = id
return self
def setTranslationConfig(self, config: Any) -> "TranslationRequest.Builder":
self._translation_config = config
return self
def build(self) -> "TranslationRequest":
req = TranslationRequest()
req._source_text = self._source_text
req._source_locale = self._source_locale
req._target_locale = self._target_locale
req._translation_flags = self._translation_flags
req._ui_translation_result = self._ui_translation_result
req._request_id = self._request_id
req._translation_config = self._translation_config
return req
def __init__(self):
super().__init__()
self._source_text: str = ""
self._source_locale: str = ""
self._target_locale: str = ""
self._request_id: int = 0
self._translation_flags: int = 0
self._ui_translation_result: Any = None
self._translation_config: Any = None
def getSourceText(self) -> str:
return self._source_text
def getSourceLocale(self) -> str:
return self._source_locale
def getTargetLocale(self) -> str:
return self._target_locale
def getRequestId(self) -> int:
return self._request_id
def getTranslationFlags(self) -> int:
return self._translation_flags
# ═══════════════════════════════════════════════════════════════
# TranslationResponse
# ═══════════════════════════════════════════════════════════════
class TranslationResponse(Stub):
"""TranslationResponse — 翻译响应"""
class Builder(Stub):
"""TranslationResponse.Builder — 翻译响应构建器"""
def __init__(self):
super().__init__()
self._translation_result: Optional[TranslationResult] = None
self._status: int = 0
def setTranslationResult(self, result: TranslationResult) -> "TranslationResponse.Builder":
self._translation_result = result
return self
def setStatus(self, status: int) -> "TranslationResponse.Builder":
self._status = status
return self
def build(self) -> "TranslationResponse":
resp = TranslationResponse()
resp._translation_result = self._translation_result
resp._status = self._status
return resp
def __init__(self):
super().__init__()
self._translation_result: Optional[TranslationResult] = None
self._status: int = 0
def getTranslationResult(self) -> Optional[TranslationResult]:
return self._translation_result
def getStatus(self) -> int:
return self._status
# ═══════════════════════════════════════════════════════════════
# Translator
# ═══════════════════════════════════════════════════════════════
class Translator(Stub):
"""Translator — 翻译器"""
def __init__(self):
super().__init__()
self._supported_locales: List[str] = ["en", "zh", "ja", "ko", "fr", "de", "es"]
def translate(self, text: str, sourceLocale: str,
targetLocale: str) -> str:
# Basic stub: return original text with a prefix
if sourceLocale == targetLocale:
return text
return f"[{sourceLocale}->{targetLocale}] {text}"
def destroy(self):
pass
def getSupportedLocales(self) -> List[str]:
return list(self._supported_locales)
# ═══════════════════════════════════════════════════════════════
# TranslationManager
# ═══════════════════════════════════════════════════════════════
class TranslationManager(Stub):
"""TranslationManager — 翻译管理器"""
EXTRA_CAPABILITIES_FROM_FRAMEWORK = "android.view.translation.extra.CAPABILITIES_FROM_FRAMEWORK"
EXTRA_TRANSLATION_REQUEST_RESULT = "android.view.translation.extra.TRANSLATION_REQUEST_RESULT"
def __init__(self):
super().__init__()
self._translators: Dict[str, Translator] = {}
def startTranslation(self, request: TranslationRequest) -> TranslationResponse:
builder = TranslationResponse.Builder()
try:
source = request.getSourceLocale()
target = request.getTargetLocale()
text = request.getSourceText()
translator = self._get_or_create_translator()
translated = translator.translate(text, source, target)
result = TranslationResult(
translatedText=translated,
sourceText=text,
translationStatus=0
)
builder.setTranslationResult(result)
builder.setStatus(0)
except Exception as e:
builder.setStatus(1)
return builder.build()
def createOnDeviceTranslation(self) -> Translator:
translator = Translator()
return translator
def getTranslationCapabilities(self, sourceLocale: str,
targetLocale: str) -> List[TranslationCapability]:
return [
TranslationCapability(
state=TranslationCapability.STATE_AVAILABLE,
sourceLocale=sourceLocale,
targetLocale=targetLocale,
textTranslationEnabled=True
)
]
def onTranslationRequest(self, request: TranslationRequest):
pass
def isTranslationSupported(self) -> bool:
return True
def isOnDeviceTranslationSupported(self) -> bool:
return True
def isULTRADeviceSupported(self) -> bool:
return False
def _get_or_create_translator(self) -> Translator:
return Translator()
# ═══════════════════════════════════════════════════════════════
# ViewTranslation / ViewTranslationRequest / ViewTranslationResponse (stubs)
# ═══════════════════════════════════════════════════════════════
class ViewTranslation(Stub):
"""ViewTranslation — 视图翻译"""
def __init__(self, autofillId: Any = None, value: str = "",
translationResult: Optional[TranslationResult] = None):
super().__init__()
self._autofill_id = autofillId
self._value = value
self._translation_result = translationResult
def getAutofillId(self) -> Any:
return self._autofill_id
def getValue(self) -> str:
return self._value
def getTranslationResult(self) -> Optional[TranslationResult]:
return self._translation_result
def setTranslationResult(self, result: TranslationResult):
self._translation_result = result
class ViewTranslationRequest(Stub):
"""ViewTranslationRequest — 视图翻译请求"""
def __init__(self, autofillId: Any = None, value: str = "",
requestId: int = 0):
super().__init__()
self._autofill_id = autofillId
self._value = value
self._request_id = requestId
def getAutofillId(self) -> Any:
return self._autofill_id
def getValue(self) -> str:
return self._value
def getRequestId(self) -> int:
return self._request_id
class ViewTranslationResponse(Stub):
"""ViewTranslationResponse — 视图翻译响应"""
def __init__(self, autofillId: Any = None, value: str = "",
extras: Any = None):
super().__init__()
self._autofill_id = autofillId
self._value = value
self._extras = extras
def getAutofillId(self) -> Any:
return self._autofill_id
def getValue(self) -> str:
return self._value
def getExtras(self) -> Any:
return self._extras
# ═══════════════════════════════════════════════════════════════
# __all__
# ═══════════════════════════════════════════════════════════════
__all__ = [
"TranslationManager",
"TranslationRequest",
"TranslationResponse",
"TranslationResult",
"TranslationCapability",
"Translator",
"TranslationContext",
"TranslationSpec",
"ViewTranslation",
"ViewTranslationRequest",
"ViewTranslationResponse",
]