首页 文章

Android对讲公告本地化

提问于
浏览
3

我有一个duo lingo(英语西班牙语)android应用程序 . 我正在我的应用程序中实现辅助功能,我希望Talkback能够阅读西班牙语中的西班牙语单词和英语中的英语单词 . 英语和西班牙语单词将在单独的文本视图中 . 我的应用程序区域设置是英语,因此Talkback谷歌文本到语音引擎不会读取西班牙语中的西班牙语单词,它们用英语阅读,更常见的是它们的字母被读出(预期的行为) .

是否有任何工作或Android推荐的解决方案来实现相同 .

最后,我希望Talkback或自定义辅助功能服务能够读出英语单词和西班牙语单词 .

2 回答

  • 0

    免责声明:您必须非常小心这个解决方案!覆盖TalkBack的TTS行为非常非常粗略 . 从可访问性的角度来看,有许多边缘情况可能会使这种行为变得笨拙,笨拙且非常糟糕 . 仅当公告的样式是特定于应用程序和必需功能的行为时,才应使用此解决方案 . 否则,此解决方案会破坏与用户代理兼容的各种WCAG 2.0成功标准,从可访问性/可用性的角度来看,这通常是一个糟糕的想法!

    在很多情况下,当我看到这样的问题时,我对提供答案犹豫不决,以免给开发人员提供他们不理解的工具 . 请不要在典型的应用程序中这样做,这是一个糟糕的主意 . 话虽如此,我相信这种特殊情况需要它,鉴于这种情况,这是一个非常干净的解决方案 . 在创建活动时,请执行以下操作:

    findViewById(android.R.id.content).setAccessibilityDelegate(new View.AccessibilityDelegate() {
    
        private TextToSpeech mTts = new TextToSpeech(MainActivity.this, new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int status) {
                mTts.setLanguage(new Locale("es"));
                //Probably other things you should do to ensure TTS is initialized before requesting it speaks something.
            }
        });
    
        private boolean isSpanishView(View view) {
            return true;
        }
    
        @Override
        public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child, AccessibilityEvent event) {
    
            switch (event.getEventType()) {
                case AccessibilityEvent.TYPE_ANNOUNCEMENT:
                case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED: {
                    if (isSpanishView(child)) {
                        String speakableText = null;
    
                        if (event.getText() != null) {
                            speakableText = event.getText().toString();
                        } else if (event.getContentDescription() != null) {
                            speakableText = event.getContentDescription().toString();
                        }
    
                        if (speakableText != null) {
                            mTts.speak(speakableText.toString(), TextToSpeech.QUEUE_ADD, null);
    
                            //Prevent the default propagation of this event, have have handled it.
                            return false;
                        }
                    }
                }
    
                default:
                    return super.onRequestSendAccessibilityEvent(host, child, event);
            }
        }
    });
    

    基本上我们在这里说的是将可访问性委托附加到我们活动的根视图 . 查看弹出的所有辅助功能事件 . 检查是否是宣布某事的事件 . 如果是,请检查它是否包含西班牙文本 . 如果是,请允许我们的西班牙语TTS引擎宣布它,而不是允许通风口传播 . 在所有其他情况下让android做它的事情 .

  • 0

    谷歌宣布了一项更新,允许您指定要大声朗读文本的语言 . 这里提供了一个链接答案:https://stackoverflow.com/a/44461540/494879

相关问题