Java 如何为开发者和最终用户提供i18n服务

Java 如何为开发者和最终用户提供i18n服务,java,android,internationalization,culture,Java,Android,Internationalization,Culture,许多android应用程序对i18n的支持非常差,这是可以理解的,因为它为开发人员增加了很多工作 从直观和文化的角度来看,如果最终用户可以自己翻译应用程序,并且OTA可以共享翻译,而无需重新安装应用程序本身,这将是一件好事 在概念上;作为维基百科,有些人很容易添加内容,有些人只使用那里的内容 当然,对于应用程序开发人员和愿意转录的人来说,该服务尽可能容易使用是很重要的 为了简单起见,这是我正在考虑的解决方案 开发者视角: 开发人员在打开活动/布局时使用自定义的setContentView来搜索

许多android应用程序对i18n的支持非常差,这是可以理解的,因为它为开发人员增加了很多工作

从直观和文化的角度来看,如果最终用户可以自己翻译应用程序,并且OTA可以共享翻译,而无需重新安装应用程序本身,这将是一件好事

在概念上;作为维基百科,有些人很容易添加内容,有些人只使用那里的内容

当然,对于应用程序开发人员和愿意转录的人来说,该服务尽可能容易使用是很重要的

为了简单起见,这是我正在考虑的解决方案

开发者视角:

  • 开发人员在打开活动/布局时使用自定义的setContentView来搜索xml条目的字符串。(下文)

  • 定制版本作为一个可免费下载的库/类…提供,使i18n功能或多或少成为一个单行程序

用户视角:

  • 用户无需翻译即可下载应用程序

  • 当应用程序启动时,它会检查手机上运行的语言环境,并在SD的共享空间中查找翻译后的xml文件

  • 如果没有或旧的转录xml(如上),请尝试从internet服务(ansync)下载新的。这都是由上面的库完成的,不需要意图

译者视角:

  • 单独的应用程序为使用上述i18n服务的任何应用程序提供翻译。(可能只是一个网络应用程序),并对翻译/输入进行某种形式的QA
问题: 现在,要使其高效工作,开发人员甚至需要使用AeasyAP,最流畅的解决方案是定制版本的setContentView,它只需从外部xml而不是apk中加载转换后的值

这有可能吗?如果没有,你建议的解决方案是什么

(当然,新年快乐,费利兹·阿诺·诺沃、布莱德恩·纽伊德·达达、戈特·尼托、康坦·阿内·努沃、斯齐兹·利韦戈·诺伊戈·罗库……)

问候,,
/T

是的,只有当有人(可能是你、我或其他人)将重写
setContentView()
,这才有可能,因为我只在那里看到问题的根源。让我解释一下:

  • 布局XML存储在res/Layout中,并封装在APK中
  • 无法修改APK运行时(至少我从未听说过)
  • 这意味着基本上不能在res/layout中重新定义在线/运行时定制/国际化的布局XML
  • 所以您需要一个存储定制XML的地方:在首选项中或在SQLite中
  • 在这两种情况下,都需要在活动/对话框中膨胀XML,这可以通过
    setContentView
  • 因此,最后,您必须重新定义setContentView
  • 怎么做?2种选择:

    • 英雄:在Android源代码中完全重写setContentView
    • 不那么英勇:创建您自己的
      OwnActivity
      类,该类将重新定义
      setContentView(intID)
      。例如:
      OwnActivity.setContentView()
    EDIT1:

    您可以像这样覆盖它:

    public class MyActivity extends Activity
    {
        @Override
        public void setContentView(int id)
        {
            if(checkPresenceInStorage(id))
                //...
            else
                super.setContentView(id);
        }
    }
    

    关于问题的第二部分,可以使用现有的翻译服务,如,它在gettext的.po文件上运行。 然而,还有android2po,它可以在Android的XML和gettext.po格式之间进行转换

    Launchpad上已经有一些Android翻译,例如ConnectBot,但是该服务需要登录才能提供。或者,您应该查看可用的基于gettext的web翻译器套件,您也可以自己运行,比如Pootle


    对不起,我不允许发布多个URL。请用谷歌搜索剩下的:(

    layoutinflator.factory是我一直在寻找的…

    感谢您的回答,澄清一下,资源在编译时不会硬编码到布局中,对吧?因为它会破坏确实有i18n的应用程序,所以这是应该被钩住的功能。我想英雄式的方法应该由谷歌来完成,即使这样,也会留下大量的curr耳鼻喉科手机(2.1)在寒冷中。如果我能用“进入”进行调试,我的目标就是不那么英勇的方法在setContentView上,我可以使用请求的扩展功能重新创建一个类,但我不能这样做?这没有意义,我知道所有内容都在apk中,但没有硬编码到布局中。一些链接必须在运行时执行,否则可绘制的ldpi/mdpi/hdpi将无法运行。您的任务是将XML膨胀为真正的de副作用不是拦截它的工作方式,而是膨胀所需的XML(本地化的)。因此,在我看来,它应该是这样的:从存储中读取正确的XML,并在setContentView()期间膨胀它,而不是那些存储在res/layoutI新it中的XML。Romain Guy甚至在询问“ViewInflateClass”之前就来拯救它,谢谢你提供的信息。不过,对于UGC来说,我相信这种方法必须简单得多。