Android 通过改造处理本地化问题
我目前正在集成一个返回通知列表的端点。问题是,通知的每个字段可能使用不同的语言:Android 通过改造处理本地化问题,android,retrofit2,Android,Retrofit2,我目前正在集成一个返回通知列表的端点。问题是,通知的每个字段可能使用不同的语言: { "title": { "fr": "...", "en": "..." }, "subtitle": { "fr": " ...", "en": "..." }, "contents": { "fr": "...", "en": "..." } } 如何定义一个能够保
{
"title": {
"fr": "...",
"en": "..."
},
"subtitle": {
"fr": " ...",
"en": "..."
},
"contents": {
"fr": "...",
"en": "..."
}
}
如何定义一个能够保存这些数据的POJO,而不列出每个字段中的每种语言
我的目标是根据当前用户区域设置检索通知内容,如果语言不可用,则返回到英语 如果您使用GSON进行解析,请尝试将标题、副标题和内容定义为Map,其中key是locale,value是本地化文本。然后创建一个用于访问数据的帮助器类/方法,如果map不包含键,则在那里执行回退操作。正如Niko所建议的,使用map可以完成这项工作 通知POJO 通知助手
public class Notification {
@SerializedName("title")
public Map<String, String> title;
@SerializedName("subtitle")
public Map<String, String> subtitle;
@SerializedName("contents")
public Map<String, String> contents;
}
public class NotificationHelper {
private static final String DEFAULT_LOCAL_KEY = Locale.ENGLISH.getLanguage().toLowerCase();
@Nullable
public static String getTitle(@NonNull Notification notification) {
Map<String, String> title = getNotificationField(notification, "title");
if (title == null) return null;
return getLocalizedValue(title);
}
@Nullable
public static String getSubtitle(@NonNull Notification notification) {
Map<String, String> subtitle = getNotificationField(notification, "subtitle");
if (subtitle == null) return null;
return getLocalizedValue(subtitle);
}
@Nullable
public static String getContents(@NonNull Notification notification) {
Map<String, String> contents = getNotificationField(notification, "contents");
if (contents == null) return null;
return getLocalizedValue(contents);
}
@Nullable
private static Map<String, String> getNotificationField(Notification notification, @NonNull String field) {
switch (field) {
case "title":
return notification.title;
case "subtitle":
return notification.subtitle;
case "contents":
return notification.contents;
default:
return null;
}
}
@Nullable
private static String getLocalizedValue(@NonNull Map<String, String> field) {
String localized = field.get(Locale.getLanguage().getCountry().toLowerCase());
if (localized == null) {
// Try to retrieve the english value instead
return field.get(DEFAULT_LOCAL_KEY);
}
return localized;
}
}