gpt4 book ai didi

java - Android 字符串问题 : How can I centralize all strings within my app?

转载 作者:行者123 更新时间:2023-12-02 03:45:14 25 4
gpt4 key购买 nike

我正在编写一个 Android 应用程序,因此我像往常一样在我的 strings.xml 中获取了所有字符串,并按照 Android 官方文档进行了说明。

到这里一切都很好,但是当我想在 Java“标准”类中使用 String 时,问题就出现了;即,假设 Email.java 中的这个字符串:

public static final String EMAIL_NOT_VALID = "The email address provided is not valid.";

你可以说我可以将此字符串放在 strings.xml 上并执行以下操作:

getResources().getString(R.string.invalid_email_message)

这种方法的问题在于我将被迫将 Android 上下文传递给应用程序中的每个 Java 对象,并在测试时涉及到所有模拟问题。

因此,是否可以在不传递上下文的情况下执行此操作?或者我是否需要有两个文件(strings.xmlxyz.java)以及单独的字符串

我在 StackOverFlow 上搜索了几个小时这个问题的答案,但没有运气)

提前致谢。

最佳答案

您可以尝试将字符串放在 assets 文件夹中,它需要在 YourProject/app/src/main/assets 内的 asset 中创建,您可以创建一个新的名为“localization”的文件夹,此处存储您的本地化文件,如 strings_en,在此文件中将所有字符串存储在 JSON 对象中 "{"key": "value"}完成所有这些后,您需要创建一个管理所有语言的类。

public class LocalizationManager {

private static LocalizationManager mInstance = null;
public String currentLanguage = "";
JSONObject currentLanguageObject = new JSONObject();
private AssetManager assetManager = BaseApplication.getInstance().getAssets(); // BaseApplication is just a class that extends Application class

private LocalizationManager() {
}

public static LocalizationManager getInstance() {
if (mInstance == null) {
mInstance = new LocalizationManager();
}
return mInstance;
}

private boolean assetExists(String path) {
boolean bAssetOk = false;
try {
InputStream stream = assetManager.open(path);
stream.close();
bAssetOk = true;
} catch (IOException e) {
e.printStackTrace();
}
return bAssetOk;
}

public String getLocalizedString(String string) {
String language = BaseApplication.getInstance().getLanguage();
if (!currentLanguage.equalsIgnoreCase(language)) {
if (assetExists("localization/strings_" + language)) {
InputStream input;
try {
input = assetManager.open("localization/strings_" + language);
int size = input.available();
byte[] buffer = new byte[size];
input.read(buffer);
input.close();
String responseString = new String(buffer);
Object json;
try {
json = new JSONTokener(responseString).nextValue();
if (json instanceof JSONObject) {
currentLanguageObject = (JSONObject) json;
currentLanguage = language;
return currentLanguageObject.optString(string, string);
}
} catch (JSONException e) {
return string;
}
} catch (IOException e) {
return string;
}
}
} else {
return currentLanguageObject.optString(string, string);
}
return string;
}
}

然后在任何类中,您都可以调用 LocalizationManager.getInstance().getLocalizedString("Your string key")。使用这种方法,您需要在应用程序中添加“更改语言”选项,例如在首选项中将值存储为 en,并且语言将动态更改。我是这样做的:

public void setLanguage(String language) {
mPreferences = getSharedPreferences(LANGUAGE_KEY_FOR_PREFS, MODE_PRIVATE);
SharedPreferences.Editor editor = mPreferences.edit();
editor.putString("Language", language);
editor.apply();
mListener.onLanguageChanged();
}


public String getLanguage() {
mPreferences = getSharedPreferences(LANGUAGE_KEY_FOR_PREFS, MODE_PRIVATE);
return mPreferences.getString("Language", "en");
}

关于java - Android 字符串问题 : How can I centralize all strings within my app?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36355458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com