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;
    }
}