""" 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", ]