使用不同的通用模块修改不同语言的特定字符串 (Android)

Modifying specific strings for different languages using different common modules (Android)

这里有一些非常奇怪的东西,我显然不明白发生了什么,但也许你们中的一个可以打开我大脑中的灯...

我在 AndroidStudio 上有一个项目,其中包含多个在不同应用程序中使用的通用文件(和多种语言):

|Common core
|-   default module 1
|-   default module 2
|-   default images
|- | default strings
   |-   danish (default) in "values" folder
   |-   english in "values-en" folder
   |-   swedish in "values-sv" folder
|App one
|-   specific module 3
|-   specific module 4
|-   specific images
|- | specific strings
   |-   in "values" folder
|App two
...

仅供参考,在我的应用程序中,我有一个 AppApplication.java 文件,它是应用程序中调用的第一个文件,用于设置我的应用程序,例如菜单配置、一些特定变量和语言设置。

现在,当我编译应用程序 1(例如)时,它使用来自公共核心的默认模块并且我想更改来自默认模块的任何字符串或图像,我只是将它们放入与通用默认 images/strings 文件夹中的名称相同的特定 images/strings 应用程序文件夹,它们将被覆盖。

效果很好。我对此很满意。但是...真正的问题是...

当我想设置语言配置时:


情况#1

_"I want to use the default language (danish) in my App 1"_

我的 AppApplication.java 文件没有调用任何特定的语言配置,一切正常。 (在通用核心文件中,我将本地 "DK" 设置为默认值。) 我的应用程序使用丹麦语,所有字符串都来自 "values"文件夹。

如果我想更改我的应用程序中的某些特定字符串,我将它们放入我的应用程序特定字符串 "values" 文件夹中,它们会覆盖默认字符串。 !!完美!!


情况#2

_"I want to use the swedish language in my App 1"_

我的 AppApplication.java 文件有以下几行:

LocaleAnswer[] localeAnswers = new LocaleAnswer[]{new LocaleAnswer(new Locale("sv", "SE"), "Swedish")};
    public LocaleAnswer[] getLocaleChoices(){
        return localeAnswers;
    }

(我可以毫无问题地在我的 LocaleAnswers 数组中添加多种语言。然后,公共核心将通过显示一个对话框询问您要在启动时使用哪种语言来处理它)

如果我的应用程序不需要修改任何默认字符串,那么,我没有任何特定的字符串文件需要担心,我们就可以了。该应用程序编译良好,并且该应用程序是瑞典语。优厚!!完美!!

但是,如果我需要更改一个字符串,我想的是将这个特定的字符串放在我的应用程序 "values" 文件夹中。但不是 :( :( :( :( 该字符串未被覆盖。

我想我知道为什么:项目编译所有内容,然后当我 运行 我的应用程序时,关于语言的最后一次调用是在我的 AppApplication.java文件,它说要使用瑞典语文件。因此,它按照要求使用默认 "values-sv" 文件夹中的瑞典语文件。好的。

让我们尝试通过将我的应用程序中的 "values" 文件夹重命名为 "values-sv" 来绕过这个问题,这样当应用程序调用瑞典语字符串文件时,它将使用我的特定应用程序字符串并使用那些我没有修改过的默认值。哈哈哈哈你知道吗???我只是创建了一个 "auto-reboot phone" 应用程序 :D 。应用程序编译但当它尝试安装时,phone 正在重新启动,重新启动,重新启动和重新启动一次又一次。在其中一次重启期间,我必须在 SafeMode(降低音量 + 菜单)中启动 phone,以便有可能删除我安装的应用程序,然后重启 phone 通常情况下。 Huuu :/ 这并没有多大帮助。

让我们尝试通过在我的应用程序中复制我的 "values-sv" 文件夹并将其中一个文件夹重命名为 "values" 来绕过它。所以,现在我的应用程序中有一个 "values" 和一个 "values-sv" 文件夹,它们都包含相同的字符串文件(带有我想从默认字符串更改的特定瑞典字符串)。还有 TADAAAAMMM!有效!!

太棒了,但是,如何?为什么?


问题

  1. 我不想为了修改我的字符串而将这个重复的字符串文件放在两个不同的文件夹中!当我选择一种特定语言而不是我的应用程序中只有一个字符串文件的默认语言时,如何让我的默认字符串被特定的字符串修改?
  2. 这对项目来说不是一个非常重要的问题,但是,了解为什么当您在我的应用程序中仅添加一个具有特定语言名称(如 "values-sv" 的字符串文件夹时,它会使整个 phone 重启?我会说该应用程序正在寻找默认值,这意味着 "values" 文件夹并且因为存在 none,BOUM,错误!但为什么应用程序不只是崩溃?为什么整个 phone 都在重启?

提前致谢 ;) C.

答案

  1. 事实上,在我的字符串文件中,我为内容提供者指定了 "content_provider_authority" 和 "auth_account_type"。

    如果您将这两个字符串集复制到另一个 "values-xx" 文件夹而不是默认 "values" 文件夹,phone 会崩溃并无限期地重新启动。

    所以,我现在有一个 "values" 文件夹,里面有一个 strings.xml 文件,其中只包含 "content_provider_authority" 和 "auth_account_type"。在我的 "values-sv" 文件夹中,我有另一个 strings.xml 文件,其中包含我想从默认 "values-sv" 文件夹修改的所有特定字符串(如果有的话) . :D

    它运行良好,我可以毫无困难地定义默认语言、一种特定语言或多种语言选择!!

  2. 为什么 phone 因内容提供商冲突而重新启动?为什么应用程序不只是崩溃?不知道!!!


我还需要在 "values" 文件夹而不是 "values-sv" 中设置 appName 字符串,因为它不是可翻译的字符串。如果您不这样做,应用程序将不会崩溃,但您的应用程序名称将是您的包名称 ;)

C.