diff --git a/src/main/java/com/yolo/keyborad/service/impl/KeyboardAiCompanionServiceImpl.java b/src/main/java/com/yolo/keyborad/service/impl/KeyboardAiCompanionServiceImpl.java index 8f3df20..3f89d8f 100644 --- a/src/main/java/com/yolo/keyborad/service/impl/KeyboardAiCompanionServiceImpl.java +++ b/src/main/java/com/yolo/keyborad/service/impl/KeyboardAiCompanionServiceImpl.java @@ -24,6 +24,7 @@ import com.yolo.keyborad.service.KeyboardAiCompanionService; import org.springframework.util.StringUtils; import java.util.Collections; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -36,6 +37,8 @@ import java.util.stream.Collectors; @Service public class KeyboardAiCompanionServiceImpl extends ServiceImpl implements KeyboardAiCompanionService { + private static final String DEFAULT_FALLBACK_LOCALE = "en"; + @Resource private KeyboardAiCompanionLikeService companionLikeService; @@ -326,6 +329,29 @@ public class KeyboardAiCompanionServiceImpl extends ServiceImpl getCompanionI18nMap(List companionIds, String acceptLanguage) { String locale = RequestLocaleUtils.resolveLanguage(acceptLanguage); + if (companionIds == null || companionIds.isEmpty() || !StringUtils.hasText(locale)) { + return Collections.emptyMap(); + } + Map requestedLocaleMap = queryI18nMap(companionIds, locale); + if (requestedLocaleMap.size() == companionIds.size() || DEFAULT_FALLBACK_LOCALE.equalsIgnoreCase(locale)) { + return requestedLocaleMap; + } + List missingCompanionIds = companionIds.stream() + .filter(companionId -> !requestedLocaleMap.containsKey(companionId)) + .toList(); + if (missingCompanionIds.isEmpty()) { + return requestedLocaleMap; + } + Map fallbackMap = queryI18nMap(missingCompanionIds, DEFAULT_FALLBACK_LOCALE); + if (fallbackMap.isEmpty()) { + return requestedLocaleMap; + } + Map mergedMap = new LinkedHashMap<>(requestedLocaleMap); + fallbackMap.forEach(mergedMap::putIfAbsent); + return mergedMap; + } + + private Map queryI18nMap(List companionIds, String locale) { if (companionIds == null || companionIds.isEmpty() || !StringUtils.hasText(locale)) { return Collections.emptyMap(); } diff --git a/src/main/java/com/yolo/keyborad/service/impl/KeyboardCharacterServiceImpl.java b/src/main/java/com/yolo/keyborad/service/impl/KeyboardCharacterServiceImpl.java index 134c54d..2774324 100644 --- a/src/main/java/com/yolo/keyborad/service/impl/KeyboardCharacterServiceImpl.java +++ b/src/main/java/com/yolo/keyborad/service/impl/KeyboardCharacterServiceImpl.java @@ -42,6 +42,7 @@ import java.util.stream.Stream; @Service public class KeyboardCharacterServiceImpl extends ServiceImpl implements KeyboardCharacterService{ + private static final String DEFAULT_FALLBACK_LOCALE = "en"; private static final String CHARACTER_CACHE_KEY_PREFIX = "character:"; private static final String CHARACTER_LIST_CACHE_KEY = "character:list:all"; private static final String CHARACTER_TAG_CACHE_KEY_PREFIX = "character:list:tag:"; @@ -353,6 +354,29 @@ public class KeyboardCharacterServiceImpl extends ServiceImpl requestedLocaleMap = queryI18nMap(characterIds, locale); + if (requestedLocaleMap.size() == characterIds.size() || DEFAULT_FALLBACK_LOCALE.equalsIgnoreCase(locale)) { + return requestedLocaleMap; + } + List missingCharacterIds = characterIds.stream() + .filter(characterId -> !requestedLocaleMap.containsKey(characterId)) + .toList(); + if (missingCharacterIds.isEmpty()) { + return requestedLocaleMap; + } + Map fallbackMap = queryI18nMap(missingCharacterIds, DEFAULT_FALLBACK_LOCALE); + if (fallbackMap.isEmpty()) { + return requestedLocaleMap; + } + Map mergedMap = new LinkedHashMap<>(requestedLocaleMap); + fallbackMap.forEach(mergedMap::putIfAbsent); + return mergedMap; + } + + private Map queryI18nMap(List characterIds, String locale) { + if (characterIds == null || characterIds.isEmpty() || !StringUtils.hasText(locale)) { + return Collections.emptyMap(); + } List i18nList = keyboardCharacterI18nMapper.selectList( new LambdaQueryWrapper() .eq(KeyboardCharacterI18n::getLocale, locale) diff --git a/src/main/java/com/yolo/keyborad/service/impl/TagServiceImpl.java b/src/main/java/com/yolo/keyborad/service/impl/TagServiceImpl.java index 14c854f..147ef0d 100644 --- a/src/main/java/com/yolo/keyborad/service/impl/TagServiceImpl.java +++ b/src/main/java/com/yolo/keyborad/service/impl/TagServiceImpl.java @@ -16,6 +16,7 @@ import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.util.Collections; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -27,6 +28,8 @@ import java.util.stream.Collectors; @Service public class TagServiceImpl extends ServiceImpl implements TagService { + private static final String DEFAULT_FALLBACK_LOCALE = "en"; + @Resource private KeyboardTagMapper keyboardTagMapper; @@ -63,6 +66,29 @@ public class TagServiceImpl extends ServiceImpl if (tagIds == null || tagIds.isEmpty()) { return Collections.emptyMap(); } + Map requestedLocaleMap = queryI18nMap(tagIds, locale); + if (requestedLocaleMap.size() == tagIds.size() || DEFAULT_FALLBACK_LOCALE.equalsIgnoreCase(locale)) { + return requestedLocaleMap; + } + List missingTagIds = tagIds.stream() + .filter(tagId -> !requestedLocaleMap.containsKey(tagId)) + .toList(); + if (missingTagIds.isEmpty()) { + return requestedLocaleMap; + } + Map fallbackMap = queryI18nMap(missingTagIds, DEFAULT_FALLBACK_LOCALE); + if (fallbackMap.isEmpty()) { + return requestedLocaleMap; + } + Map mergedMap = new LinkedHashMap<>(requestedLocaleMap); + fallbackMap.forEach(mergedMap::putIfAbsent); + return mergedMap; + } + + private Map queryI18nMap(List tagIds, String locale) { + if (tagIds == null || tagIds.isEmpty() || !StringUtils.hasText(locale)) { + return Collections.emptyMap(); + } List i18nList = keyboardTagI18nMapper.selectList( new LambdaQueryWrapper() .in(KeyboardTagI18n::getTagId, tagIds)