如何让 Android WebView 本地化它的错误页面?

How to get Android WebView to localise its error pages?

我的应用程序使用 WebView 显示来自网络服务器的一些信息。 由于我支持多种语言,例如葡萄牙语,我注意到如果将所需页面加载到 WebView 并且 phone 语言设置为葡萄牙语时发生错误,WebView 将以英语显示错误页面,不像我期望的那样是葡萄牙语。

谁知道为什么以及如何在不捕获错误并加载自定义错误页面的情况下解决这个问题?

谢谢。

WebView可以显示的错误页面其实有两种。第一类是WebView自身产生的错误页面。这些页面在 WebView 由于某种原因无法连接到服务器时显示,例如,如果您尝试在设备处于飞行模式时导航。这些页面是本地化的——至少在我刚刚检查过的 KitKat 和 Lollipop 上是这样,但我很确定在早期版本上也是如此。唯一的问题是 WebView 显示的不是可读的错误描述,而是一个神秘的错误标记,例如"net::ERR_NAME_NOT_RESOLVED",确实没有本地化(实际上,这只是 Chromium 代码中一个常量的名称)。如果覆盖 WebViewClient.onReceivedError 回调,您可以显示自己的错误页面。

现在还有第二种错误页面——从服务器接收到的错误页面,例如“404 未找到”或“500 服务器错误”。这些页面的本地化是服务器的责任。唯一需要注意的是,服务器需要以某种方式知道您希望它使用的语言(例如,通过 cookie 或查询参数,这在很大程度上取决于您使用的服务器)。如果服务器不提供发送本地化错误页面的功能,那么您对此无能为力,因为 WebView 实际上并没有告诉您,如果它收到了具有 HTTP 错误状态的页面。你能做的最好的事情是通过 WebView.getTitle 阅读页面标题或检索页面内容(不幸的是,这也是 non-trivial,请参阅 how to get html content from a webview?