首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android对讲公告本地化

Android对讲公告本地化
EN

Stack Overflow用户
提问于 2017-06-08 12:49:32
回答 2查看 1.1K关注 0票数 3

我有一个duo lingo (英语+西班牙语)的android应用程序。我正在我的应用程序中实现辅助功能,我希望Talkback能够读取西班牙语单词和英语单词。英语和西班牙语单词将显示在不同的文本视图中。我的应用程序区域设置是英语,因此Talkback + google text to speech引擎不会读取西班牙语中的西班牙语单词,它们是用英语读取的,而且更多的时候它们的字母会被读出(预期行为)。

是否有任何工作或android推荐的解决方案来实现同样的目标。

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

EN

回答 2

Stack Overflow用户

发布于 2017-06-09 07:02:17

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

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

代码语言:javascript
复制
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做它自己的事情吧。

票数 1
EN

Stack Overflow用户

发布于 2017-07-10 18:45:19

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44426853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档