【问题标题】:Android Talkback Announcement LocalizationAndroid 对讲公告本地化
【发布时间】:2017-06-08 04:49:32
【问题描述】:

我有一个双语(英语 + 西班牙语)安卓应用程序。我正在我的应用程序中实现可访问性,并且我希望 Talkback 能够读取西班牙语中的西班牙语单词和英语中的英语单词。英语和西班牙语单词将在单独的文本视图中。我的应用程序语言环境是英语,因此 Talkback + google 文本到语音引擎没有用西班牙语读取西班牙语单词,它们是用英语读取的,并且更经常地读出它们的字母(预期行为)。

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

最终,我希望 Talkback 或自定义无障碍服务能够读出英语中的英语单词和西班牙语中的西班牙语单词。

【问题讨论】:

    标签: android accessibility talkback


    【解决方案1】:

    免责声明:您必须格外小心此解决方案! 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 做它的事情。

    【讨论】:

      【解决方案2】:

      Google 宣布了一项更新,允许您指定希望朗读文本的语言。此处提供了带有链接的答案:https://stackoverflow.com/a/44461540/494879

      【讨论】:

      • 这已被其他人作为答案发布并删除。对 Android O 及更低版本有要求。
      • 在 Android O 中使用 span 不起作用?为什么他们会在 IO17 宣布一些新的东西然后立即放弃它:|
      • 可能是只支持Android O及以上,不符合他的要求……我不记得了。我从来没有需要它,但我知道这个答案是不够的,这就是为什么我把那个怪物拼凑在一起...... :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-22
      • 1970-01-01
      • 1970-01-01
      • 2020-03-16
      • 1970-01-01
      • 1970-01-01
      • 2022-07-05
      相关资源
      最近更新 更多