From 61e560500bb10a064dd1c099dee5a66488eb8779 Mon Sep 17 00:00:00 2001 From: jmal Date: Tue, 10 Sep 2024 12:02:45 +0800 Subject: [PATCH 1/4] feat: add i18n config --- .../com/jmal/clouddisk/config/WebConfig.java | 19 ++++++++++++++ .../HeaderLocaleChangeInterceptor.java | 25 +++++++++++++++++++ .../service/impl/AuthServiceImpl.java | 20 +++++++++------ src/main/resources/application.yml | 3 +++ src/main/resources/i18n/messages.properties | 1 + .../resources/i18n/messages_en_US.properties | 1 + .../resources/i18n/messages_zh_CN.properties | 1 + 7 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/jmal/clouddisk/interceptor/HeaderLocaleChangeInterceptor.java create mode 100644 src/main/resources/i18n/messages.properties create mode 100644 src/main/resources/i18n/messages_en_US.properties create mode 100644 src/main/resources/i18n/messages_zh_CN.properties diff --git a/src/main/java/com/jmal/clouddisk/config/WebConfig.java b/src/main/java/com/jmal/clouddisk/config/WebConfig.java index 0fd7e2c9..41de1a09 100644 --- a/src/main/java/com/jmal/clouddisk/config/WebConfig.java +++ b/src/main/java/com/jmal/clouddisk/config/WebConfig.java @@ -2,15 +2,20 @@ import com.jmal.clouddisk.interceptor.AuthInterceptor; import com.jmal.clouddisk.interceptor.FileInterceptor; +import com.jmal.clouddisk.interceptor.HeaderLocaleChangeInterceptor; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.config.annotation.*; +import org.springframework.web.servlet.i18n.CookieLocaleResolver; import java.io.File; +import java.util.Locale; /** * WebConfig @@ -33,6 +38,7 @@ public class WebConfig implements WebMvcConfigurer { */ @Override public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(localeChangeInterceptor()); registry.addInterceptor(authInterceptor).addPathPatterns("/**"). excludePathPatterns("/login/**", "/public/**", "/articles/**", "/error/**", "/file/**" , "/files/**","/swagger-ui/**"); registry.addInterceptor(fileInterceptor).addPathPatterns("/file/**").addPathPatterns("/files/**"); @@ -69,4 +75,17 @@ public void configureAsyncSupport(@NotNull AsyncSupportConfigurer configurer) { // configurer.setDefaultTimeout(3000); WebMvcConfigurer.super.configureAsyncSupport(configurer); } + + @Bean + public LocaleResolver localeResolver() { + CookieLocaleResolver resolver = new CookieLocaleResolver("locale"); + resolver.setDefaultLocale(Locale.US); + return resolver; + } + + @Bean + public HeaderLocaleChangeInterceptor localeChangeInterceptor() { + return new HeaderLocaleChangeInterceptor(); + } + } diff --git a/src/main/java/com/jmal/clouddisk/interceptor/HeaderLocaleChangeInterceptor.java b/src/main/java/com/jmal/clouddisk/interceptor/HeaderLocaleChangeInterceptor.java new file mode 100644 index 00000000..1453afba --- /dev/null +++ b/src/main/java/com/jmal/clouddisk/interceptor/HeaderLocaleChangeInterceptor.java @@ -0,0 +1,25 @@ +package com.jmal.clouddisk.interceptor; + +import cn.hutool.core.util.StrUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.jetbrains.annotations.NotNull; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; + +import java.util.Locale; + +public class HeaderLocaleChangeInterceptor extends LocaleChangeInterceptor { + + @Override + public boolean preHandle(HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler) { + String lang = request.getHeader("lang"); + if (StrUtil.isNotBlank(lang) && lang.indexOf("_") > 0) { + Locale locale = Locale.forLanguageTag(lang.replace("_", "-")); + LocaleContextHolder.setLocale(locale); + } else { + LocaleContextHolder.setLocale(Locale.US); + } + return true; + } +} diff --git a/src/main/java/com/jmal/clouddisk/service/impl/AuthServiceImpl.java b/src/main/java/com/jmal/clouddisk/service/impl/AuthServiceImpl.java index 1b0dbcf9..ddc23ef9 100644 --- a/src/main/java/com/jmal/clouddisk/service/impl/AuthServiceImpl.java +++ b/src/main/java/com/jmal/clouddisk/service/impl/AuthServiceImpl.java @@ -19,6 +19,8 @@ import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; +import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Query; import org.springframework.ldap.AuthenticationException; @@ -54,7 +56,11 @@ public class AuthServiceImpl implements IAuthService { private final IUserService userService; - private static final String LOGIN_ERROR = "用户名或密码错误"; + private final MessageSource messageSource; + + public String loginError() { + return messageSource.getMessage("login.error", null, LocaleContextHolder.getLocale()); + } @PostConstruct private void init() { @@ -94,14 +100,14 @@ public ResponseResult login(HttpServletResponse response, ConsumerDTO co // ldap登录 return ldapLogin(response, consumerDTO); } - return ResultUtil.error(LOGIN_ERROR); + return ResultUtil.error(loginError()); } else { String hashPassword = consumerDO.getPassword(); if (!CharSequenceUtil.isBlank(password) && PasswordHash.validatePassword(password, hashPassword)) { return loginValidSuccess(response, consumerDTO, consumerDO); } } - return ResultUtil.error(LOGIN_ERROR); + return ResultUtil.error(loginError()); } private static ResponseResult loginValidSuccess(HttpServletResponse response, ConsumerDTO userDTO, ConsumerDO consumerDO) { @@ -122,7 +128,7 @@ private ResponseResult ldapLogin(HttpServletResponse response, ConsumerD LdapQuery query = LdapQueryBuilder.query().where(ldapLoginName).is(consumerDTO.getUsername()); ldapTemplate.authenticate(query, consumerDTO.getPassword()); } catch (Exception e) { - return ResultUtil.error(LOGIN_ERROR); + return ResultUtil.error(loginError()); } LdapConfigDO ldapConfigDO = mongoTemplate.findOne(new Query(), LdapConfigDO.class); if (ldapConfigDO != null) { @@ -132,7 +138,7 @@ private ResponseResult ldapLogin(HttpServletResponse response, ConsumerD ConsumerDO consumerDO = userService.add(consumerDTO); return loginValidSuccess(response, consumerDTO, consumerDO); } - return ResultUtil.error(LOGIN_ERROR); + return ResultUtil.error(loginError()); } /** @@ -163,14 +169,14 @@ public ResponseResult logout(String token, HttpServletResponse response) public ResponseResult validOldPass(String userId, String password) { ConsumerDO user = mongoTemplate.findById(userId, ConsumerDO.class, UserServiceImpl.COLLECTION_NAME); if (user == null) { - return ResultUtil.warning(LOGIN_ERROR); + return ResultUtil.warning(loginError()); } else { String userPassword = user.getPassword(); if (!CharSequenceUtil.isBlank(password) && PasswordHash.validatePassword(password, userPassword)) { return ResultUtil.success(); } } - return ResultUtil.warning(LOGIN_ERROR); + return ResultUtil.warning(loginError()); } @Override diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index dc82be01..9f6360e3 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -24,6 +24,9 @@ spring: type: caffeine caffeine: spec: initialCapacity=100,maximumSize=500,expireAfterWrite=3600s + messages: + basename: i18n/messages + encoding: UTF-8 springdoc: packages-to-scan: com.jmal.clouddisk.controller,com.jmal.clouddisk.oss api-docs: diff --git a/src/main/resources/i18n/messages.properties b/src/main/resources/i18n/messages.properties new file mode 100644 index 00000000..d23001b3 --- /dev/null +++ b/src/main/resources/i18n/messages.properties @@ -0,0 +1 @@ +login.error=Invalid username or password diff --git a/src/main/resources/i18n/messages_en_US.properties b/src/main/resources/i18n/messages_en_US.properties new file mode 100644 index 00000000..d23001b3 --- /dev/null +++ b/src/main/resources/i18n/messages_en_US.properties @@ -0,0 +1 @@ +login.error=Invalid username or password diff --git a/src/main/resources/i18n/messages_zh_CN.properties b/src/main/resources/i18n/messages_zh_CN.properties new file mode 100644 index 00000000..5f9ccc26 --- /dev/null +++ b/src/main/resources/i18n/messages_zh_CN.properties @@ -0,0 +1 @@ +login.error=账号或密码错误 From d26d511b528852c0d8ec63a3283f928796f01fde Mon Sep 17 00:00:00 2001 From: jmal Date: Tue, 10 Sep 2024 15:22:03 +0800 Subject: [PATCH 2/4] feat: add menu i18n config --- .../jmal/clouddisk/model/rbac/MenuDTO.java | 8 +- .../service/impl/AuthServiceImpl.java | 11 +- .../clouddisk/service/impl/MenuService.java | 12 +- .../com/jmal/clouddisk/util/MessageUtil.java | 41 +++++++ src/main/resources/db/menu.json | 108 +++++++++--------- src/main/resources/i18n/messages.properties | 54 +++++++++ .../resources/i18n/messages_en_US.properties | 54 +++++++++ .../resources/i18n/messages_zh_CN.properties | 55 +++++++++ 8 files changed, 273 insertions(+), 70 deletions(-) create mode 100644 src/main/java/com/jmal/clouddisk/util/MessageUtil.java diff --git a/src/main/java/com/jmal/clouddisk/model/rbac/MenuDTO.java b/src/main/java/com/jmal/clouddisk/model/rbac/MenuDTO.java index ca7b8cfd..16bcefa1 100644 --- a/src/main/java/com/jmal/clouddisk/model/rbac/MenuDTO.java +++ b/src/main/java/com/jmal/clouddisk/model/rbac/MenuDTO.java @@ -26,7 +26,7 @@ public class MenuDTO implements Comparable{ @Schema(name = "parentId", title = "父级菜单Id") String parentId; @NotNull(message = "菜单名称不能为空") - @Schema(name = "name", title = "菜单名称", required = true) + @Schema(name = "name", title = "菜单名称", requiredMode = Schema.RequiredMode.REQUIRED) String name; @Schema(name = "authority", title = "权限标识") String authority; @@ -37,13 +37,13 @@ public class MenuDTO implements Comparable{ @Schema(name = "icon", title = "菜单图标") String icon; @NotNull(message = "排序号不能为空") - @Schema(name = "sortNumber", title = "排序号", required = true) + @Schema(name = "sortNumber", title = "排序号", requiredMode = Schema.RequiredMode.REQUIRED) Integer sortNumber; @NotNull(message = "菜单类型不能为空") - @Schema(name = "menuType", title = "菜单类型 0:菜单,1:按钮", required = true) + @Schema(name = "menuType", title = "菜单类型 0:菜单,1:按钮", requiredMode = Schema.RequiredMode.REQUIRED) Integer menuType; @NotNull(message = "是否隐藏不能为空") - @Schema(name = "hide", title = "是否隐藏", required = true) + @Schema(name = "hide", title = "是否隐藏", requiredMode = Schema.RequiredMode.REQUIRED) Boolean hide; /*** * 子菜单 diff --git a/src/main/java/com/jmal/clouddisk/service/impl/AuthServiceImpl.java b/src/main/java/com/jmal/clouddisk/service/impl/AuthServiceImpl.java index ddc23ef9..5de96409 100644 --- a/src/main/java/com/jmal/clouddisk/service/impl/AuthServiceImpl.java +++ b/src/main/java/com/jmal/clouddisk/service/impl/AuthServiceImpl.java @@ -11,16 +11,11 @@ import com.jmal.clouddisk.model.rbac.ConsumerDTO; import com.jmal.clouddisk.service.IAuthService; import com.jmal.clouddisk.service.IUserService; -import com.jmal.clouddisk.util.CaffeineUtil; -import com.jmal.clouddisk.util.PasswordHash; -import com.jmal.clouddisk.util.ResponseResult; -import com.jmal.clouddisk.util.ResultUtil; +import com.jmal.clouddisk.util.*; import jakarta.annotation.PostConstruct; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; -import org.springframework.context.MessageSource; -import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Query; import org.springframework.ldap.AuthenticationException; @@ -56,10 +51,10 @@ public class AuthServiceImpl implements IAuthService { private final IUserService userService; - private final MessageSource messageSource; + private final MessageUtil messageUtil; public String loginError() { - return messageSource.getMessage("login.error", null, LocaleContextHolder.getLocale()); + return messageUtil.getMessage("login.error"); } @PostConstruct diff --git a/src/main/java/com/jmal/clouddisk/service/impl/MenuService.java b/src/main/java/com/jmal/clouddisk/service/impl/MenuService.java index e5dbb93f..a8ccb649 100644 --- a/src/main/java/com/jmal/clouddisk/service/impl/MenuService.java +++ b/src/main/java/com/jmal/clouddisk/service/impl/MenuService.java @@ -9,14 +9,12 @@ import com.jmal.clouddisk.model.rbac.MenuDO; import com.jmal.clouddisk.model.rbac.MenuDTO; import com.jmal.clouddisk.service.IUserService; -import com.jmal.clouddisk.util.MongoUtil; -import com.jmal.clouddisk.util.ResponseResult; -import com.jmal.clouddisk.util.ResultUtil; -import com.jmal.clouddisk.util.TimeUntils; +import com.jmal.clouddisk.util.*; import jakarta.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; @@ -29,6 +27,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Locale; /** * @Description 菜单管理 @@ -50,6 +49,9 @@ public class MenuService { @Autowired private MongoTemplate mongoTemplate; + @Autowired + private MessageUtil messageUtil; + @PostConstruct public void init() { // 启动时更新菜单 @@ -98,9 +100,11 @@ public List tree(QueryMenuDTO queryDTO) { query.addCriteria(Criteria.where("component").regex(queryDTO.getPath(), "i")); } List menuDOList = mongoTemplate.find(query, MenuDO.class, COLLECTION_NAME); + Locale locale = LocaleContextHolder.getLocale(); List menuDTOList = menuDOList.parallelStream().map(menuDO -> { MenuDTO menuDTO = new MenuDTO(); BeanUtils.copyProperties(menuDO, menuDTO); + menuDTO.setName(messageUtil.getMessage(menuDO.getName(), locale)); return menuDTO; }).toList(); return getSubMenu(null, menuDTOList); diff --git a/src/main/java/com/jmal/clouddisk/util/MessageUtil.java b/src/main/java/com/jmal/clouddisk/util/MessageUtil.java new file mode 100644 index 00000000..b6d60375 --- /dev/null +++ b/src/main/java/com/jmal/clouddisk/util/MessageUtil.java @@ -0,0 +1,41 @@ +package com.jmal.clouddisk.util; + +import lombok.RequiredArgsConstructor; +import org.springframework.context.MessageSource; +import org.springframework.context.NoSuchMessageException; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.stereotype.Component; + +import java.util.Locale; + +@Component +@RequiredArgsConstructor +public class MessageUtil { + + private final MessageSource messageSource; + + /** + * 获取国际化消息 + * @param messageKey 消息的键 + * @return 国际化消息 + */ + public String getMessage(String messageKey) { + return getMessage(messageKey, LocaleContextHolder.getLocale()); + } + + /** + * 获取国际化消息 + * @param messageKey 消息的键 + * @param locale 语言 + * @return 国际化消息 + */ + public String getMessage(String messageKey, Locale locale) { + String result = messageKey; + try { + result = messageSource.getMessage(messageKey, null, locale); + } catch (NoSuchMessageException ignored) { + } + return result; + } + +} diff --git a/src/main/resources/db/menu.json b/src/main/resources/db/menu.json index 84f80e04..6ab5b4b9 100644 --- a/src/main/resources/db/menu.json +++ b/src/main/resources/db/menu.json @@ -7,7 +7,7 @@ "icon": "ziyuan", "id": "5ffc36b89a2c787ef115f97a", "menuType": 0, - "name": "home", + "name": "menu.home", "parentId": "", "path": "/", "sortNumber": 0, @@ -21,7 +21,7 @@ "icon": "zuijinyuedu", "id": "5ffc36d89a2c787ef115f97b", "menuType": 0, - "name": "最近", + "name": "menu.recently", "parentId": "", "path": "/recently", "sortNumber": 1, @@ -35,7 +35,7 @@ "icon": "Favoritestarrate", "id": "5ffc37439a2c787ef115f97c", "menuType": 0, - "name": "收藏", + "name": "menu.favorite", "parentId": "", "path": "/favorite", "sortNumber": 2, @@ -49,7 +49,7 @@ "icon": "gongxiangzhongxin", "id": "5ffc37649a2c787ef115f97d", "menuType": 0, - "name": "分享", + "name": "menu.share", "parentId": "", "path": "/share", "sortNumber": 3, @@ -63,7 +63,7 @@ "icon": "file_music", "id": "5ffc378b9a2c787ef115f97e", "menuType": 0, - "name": "音乐", + "name": "menu.audio", "parentId": "", "path": "/audio", "sortNumber": 4, @@ -77,7 +77,7 @@ "icon": "video", "id": "5ffc37a19a2c787ef115f97f", "menuType": 0, - "name": "视频", + "name": "menu.video", "parentId": "", "path": "/video", "sortNumber": 5, @@ -91,7 +91,7 @@ "icon": "image", "id": "5ffc37db9a2c787ef115f980", "menuType": 0, - "name": "图片", + "name": "menu.image", "parentId": "", "path": "/image", "sortNumber": 6, @@ -105,7 +105,7 @@ "icon": "document", "id": "63b79129a7b6db0f8c1f2ad9", "menuType": 0, - "name": "文档", + "name": "menu.document", "parentId": "", "path": "/document", "sortNumber": 7, @@ -119,7 +119,7 @@ "icon": "UserSettings", "id": "5ffb1b38eb9cf770a889b7ea", "menuType": 2, - "name": "个人信息", + "name": "menu.userinfo", "parentId": "", "path": "/setting/user", "sortNumber": 10, @@ -133,7 +133,7 @@ "icon": "huaban", "id": "5ffb1b57eb9cf770a889b7eb", "menuType": 2, - "name": "用户管理", + "name": "menu.managerUser", "parentId": "6020dec9cfb7a66f628397a8", "path": "/setting/manager-users", "sortNumber": 0, @@ -147,7 +147,7 @@ "icon": "role", "id": "5ffb1b60eb9cf770a889b7ec", "menuType": 2, - "name": "角色管理", + "name": "menu.managerRole", "parentId": "6020dec9cfb7a66f628397a8", "path": "/setting/manager-roles", "sortNumber": 1, @@ -161,7 +161,7 @@ "icon": "menu", "id": "5ffb1b68eb9cf770a889b7ed", "menuType": 2, - "name": "菜单管理", + "name": "menu.managerMenu", "parentId": "6020dec9cfb7a66f628397a8", "path": "/setting/manager-menus", "sortNumber": 2, @@ -175,7 +175,7 @@ "icon": "wangzhanguanli", "id": "5ffb1b6feb9cf770a889b7ee", "menuType": 2, - "name": "网站管理", + "name": "menu.managerWebsite", "parentId": "", "path": "/setting/website", "sortNumber": 14, @@ -189,7 +189,7 @@ "icon": "yunshezhi", "id": "5ffb1cf6eb9cf770a889b7f3", "menuType": 2, - "name": "网盘设置", + "name": "menu.managerCloud", "parentId": "", "path": "/setting/cloudManager", "sortNumber": 15, @@ -203,7 +203,7 @@ "icon": "guanlizhuanjiawenzhang", "id": "5ffd02373d0a062755a22609", "menuType": 2, - "name": "文章", + "name": "menu.articles", "parentId": "5ffb1b6feb9cf770a889b7ee", "path": "manager-articles", "sortNumber": 0, @@ -217,7 +217,7 @@ "icon": "yemianshezhi", "id": "5ffd02863d0a062755a2260a", "menuType": 2, - "name": "独立页面", + "name": "menu.alonePage", "parentId": "5ffb1b6feb9cf770a889b7ee", "path": "manager-alone-page", "sortNumber": 1, @@ -231,7 +231,7 @@ "icon": "pifu", "id": "5ffd0af43d0a062755a2260b", "menuType": 2, - "name": "外观", + "name": "menu.appearance", "parentId": "5ffb1b6feb9cf770a889b7ee", "path": "manager-blog", "sortNumber": 2, @@ -245,7 +245,7 @@ "icon": "fenlei", "id": "5ffd0b203d0a062755a2260c", "menuType": 2, - "name": "分类", + "name": "menu.categories", "parentId": "5ffb1b6feb9cf770a889b7ee", "path": "manager-categories", "sortNumber": 3, @@ -259,7 +259,7 @@ "icon": "biaoqian", "id": "5ffd0b4a3d0a062755a2260d", "menuType": 2, - "name": "标签", + "name": "menu.tags", "parentId": "5ffb1b6feb9cf770a889b7ee", "path": "manager-tags", "sortNumber": 4, @@ -273,7 +273,7 @@ "icon": "", "id": "5ffd38d529d8463da1186730", "menuType": 1, - "name": "删除文件", + "name": "menu.deleteFile", "parentId": "", "path": "", "sortNumber": 104, @@ -287,7 +287,7 @@ "icon": "", "id": "5ffd38ed29d8463da1186731", "menuType": 1, - "name": "下载文件", + "name": "menu.downloadFile", "parentId": "", "path": "", "sortNumber": 101, @@ -301,7 +301,7 @@ "icon": "", "id": "5ffd390e29d8463da1186732", "menuType": 1, - "name": "查询文件", + "name": "menu.queryFile", "parentId": "", "path": "", "sortNumber": 102, @@ -315,7 +315,7 @@ "icon": "", "id": "5ffd392629d8463da1186733", "menuType": 1, - "name": "修改文件", + "name": "menu.updateFile", "parentId": "", "path": "", "sortNumber": 103, @@ -329,7 +329,7 @@ "icon": "", "id": "5ffd395029d8463da1186734", "menuType": 1, - "name": "上传文件", + "name": "menu.uploadFile", "path": "", "sortNumber": 100, "updateTime": 1610431850844 @@ -342,7 +342,7 @@ "icon": "", "id": "5ffd396829d8463da1186735", "menuType": 1, - "name": "修改网盘设置", + "name": "menu.updateCloudSet", "parentId": "5ffb1cf6eb9cf770a889b7f3", "path": "", "sortNumber": 5, @@ -356,7 +356,7 @@ "icon": "", "id": "5ffd39e829d8463da1186736", "menuType": 1, - "name": "添加菜单", + "name": "menu.addMenu", "parentId": "5ffb1b68eb9cf770a889b7ed", "path": "", "sortNumber": 1, @@ -370,7 +370,7 @@ "icon": "", "id": "5ffd3a2229d8463da1186737", "menuType": 1, - "name": "删除菜单", + "name": "menu.deleteMenu", "parentId": "5ffb1b68eb9cf770a889b7ed", "path": "", "sortNumber": 3, @@ -384,7 +384,7 @@ "icon": "", "id": "5ffd3a3329d8463da1186738", "menuType": 1, - "name": "查询菜单", + "name": "menu.queryMenu", "parentId": "5ffb1b68eb9cf770a889b7ed", "path": "", "sortNumber": 0, @@ -398,7 +398,7 @@ "icon": "", "id": "5ffd3a5329d8463da1186739", "menuType": 1, - "name": "修改菜单", + "name": "menu.updateMenu", "parentId": "5ffb1b68eb9cf770a889b7ed", "path": "", "sortNumber": 2, @@ -412,7 +412,7 @@ "icon": "", "id": "5ffd3dc829d8463da118673a", "menuType": 1, - "name": "查询角色", + "name": "menu.queryRole", "parentId": "5ffb1b60eb9cf770a889b7ec", "path": "", "sortNumber": 0, @@ -426,7 +426,7 @@ "icon": "", "id": "5ffd3e2a29d8463da118673b", "menuType": 1, - "name": "添加角色", + "name": "menu.addRole", "parentId": "5ffb1b60eb9cf770a889b7ec", "path": "", "sortNumber": 1, @@ -440,7 +440,7 @@ "icon": "", "id": "5ffd3e6b29d8463da118673c", "menuType": 1, - "name": "修改角色", + "name": "menu.updateRole", "parentId": "5ffb1b60eb9cf770a889b7ec", "path": "", "sortNumber": 2, @@ -454,7 +454,7 @@ "icon": "", "id": "5ffd3e9c29d8463da118673d", "menuType": 1, - "name": "删除角色", + "name": "menu.deleteRole", "parentId": "5ffb1b60eb9cf770a889b7ec", "path": "", "sortNumber": 0, @@ -468,7 +468,7 @@ "icon": "", "id": "5ffd3ecf29d8463da118673e", "menuType": 1, - "name": "查询用户", + "name": "menu.queryUser", "parentId": "5ffb1b57eb9cf770a889b7eb", "path": "", "sortNumber": 0, @@ -482,7 +482,7 @@ "icon": "", "id": "5ffd3f4629d8463da118673f", "menuType": 1, - "name": "添加用户", + "name": "menu.addUser", "parentId": "5ffb1b57eb9cf770a889b7eb", "path": "", "sortNumber": 1, @@ -496,7 +496,7 @@ "icon": "", "id": "5ffd3f5f29d8463da1186740", "menuType": 1, - "name": "修改用户", + "name": "menu.updateUser", "parentId": "5ffb1b57eb9cf770a889b7eb", "path": "", "sortNumber": 2, @@ -510,7 +510,7 @@ "icon": "", "id": "5ffd3f7929d8463da1186741", "menuType": 1, - "name": "删除用户", + "name": "menu.deleteUser", "parentId": "5ffb1b57eb9cf770a889b7eb", "path": "", "sortNumber": 3, @@ -524,7 +524,7 @@ "icon": "", "id": "5ffd6ff129d84649e3f02cd7", "menuType": 1, - "name": "网站内容查询", + "name": "menu.queryWebsiteContent", "parentId": "5ffb1b6feb9cf770a889b7ee", "path": "", "sortNumber": 10, @@ -538,7 +538,7 @@ "icon": "", "id": "5ffd702829d84649e3f02cd8", "menuType": 1, - "name": "网站内容添加", + "name": "menu.addWebsiteContent", "parentId": "5ffb1b6feb9cf770a889b7ee", "path": "", "sortNumber": 11, @@ -552,7 +552,7 @@ "icon": "", "id": "5ffd705929d84649e3f02cd9", "menuType": 1, - "name": "网站内容修改", + "name": "menu.updateWebsiteContent", "parentId": "5ffb1b6feb9cf770a889b7ee", "path": "", "sortNumber": 12, @@ -566,7 +566,7 @@ "icon": "", "id": "5ffd707129d84649e3f02cda", "menuType": 1, - "name": "网站内容删除", + "name": "menu.deleteWebsiteContent", "parentId": "5ffb1b6feb9cf770a889b7ee", "path": "", "sortNumber": 13, @@ -580,7 +580,7 @@ "icon": "pifu", "id": "600a672db5a9d881713ea266", "menuType": 3, - "name": "网站外观", + "name": "menu.websiteAppearance", "parentId": "", "path": "/setting/website/manager-blog", "sortNumber": 201, @@ -594,7 +594,7 @@ "icon": "shezhi", "id": "600a694fb5a9d881713ea267", "menuType": 4, - "name": "基本设置", + "name": "menu.basicSettings", "parentId": "", "path": "/setting/user", "sortNumber": 202, @@ -622,7 +622,7 @@ "icon": "blogger", "id": "600a6d62b5a9d881713ea269", "menuType": 3, - "name": "博客", + "name": "menu.blog", "parentId": "", "path": "http://blog/", "sortNumber": 200, @@ -636,7 +636,7 @@ "icon": "shouquan", "id": "600cf2ef194ba43988898423", "menuType": 2, - "name": "授权应用", + "name": "menu.authAPP", "parentId": "", "path": "/setting/authAPP", "sortNumber": 17, @@ -650,7 +650,7 @@ "icon": "file-conf", "id": "6020dec9cfb7a66f628397a8", "menuType": 2, - "name": "系统管理", + "name": "menu.managerSystem", "parentId": "", "path": "/setting/sys", "sortNumber": 11, @@ -664,7 +664,7 @@ "icon": "file-log", "id": "6020e0efcfb7a66f628397f5", "menuType": 2, - "name": "登陆日志", + "name": "menu.logLogin", "parentId": "6020dec9cfb7a66f628397a8", "path": "/setting/log-login", "sortNumber": 3, @@ -678,7 +678,7 @@ "icon": "wulianwang-", "id": "6020e165cfb7a66f62839805", "menuType": 2, - "name": "操作日志", + "name": "menu.logOperation", "parentId": "6020dec9cfb7a66f628397a8", "path": "/setting/log-operation", "sortNumber": 4, @@ -692,7 +692,7 @@ "icon": "file-db", "id": "642e202195d19c039e02d4ff", "menuType": 2, - "name": "OSS管理", + "name": "menu.ossManager", "parentId": "", "path": "/setting/ossManager", "sortNumber": 300, @@ -706,7 +706,7 @@ "icon": "", "id": "642e206695d19c039e02d502", "menuType": 1, - "name": "读取oss配置", + "name": "menu.queryOSS", "parentId": "642e202195d19c039e02d4ff", "path": "", "sortNumber": 301, @@ -720,7 +720,7 @@ "icon": "", "id": "642e208895d19c039e02d508", "menuType": 1, - "name": "修改oss配置", + "name": "menu.updateOSS", "parentId": "642e202195d19c039e02d4ff", "path": "", "sortNumber": 302, @@ -734,7 +734,7 @@ "icon": "", "id": "642e209995d19c039e02d50b", "menuType": 1, - "name": "删除oss配置", + "name": "menu.deleteOSS", "parentId": "642e202195d19c039e02d4ff", "path": "", "sortNumber": 303, @@ -748,7 +748,7 @@ "icon": "gengxinjindu", "id": "66630732fc290e06878516f0", "menuType": 2, - "name": "任务进度", + "name": "menu.taskProgress", "parentId": "", "path": "/setting/taskProgress", "sortNumber": 16, @@ -762,7 +762,7 @@ "icon": "huishouzhan", "id": "6683c67cf66d83694bc9fe5c", "menuType": 0, - "name": "回收站", + "name": "menu.trash", "parentId": "", "path": "/trash", "sortNumber": 8, diff --git a/src/main/resources/i18n/messages.properties b/src/main/resources/i18n/messages.properties index d23001b3..18822b87 100644 --- a/src/main/resources/i18n/messages.properties +++ b/src/main/resources/i18n/messages.properties @@ -1 +1,55 @@ login.error=Invalid username or password +menu.home=Home +menu.recently=Recently +menu.favorite=Favorite +menu.share=Share +menu.audio=Audio +menu.video=Video +menu.image=Image +menu.document=Document +menu.userinfo=UserInfo +menu.managerUser=User +menu.managerRole=Role +menu.managerMenu=Menu +menu.managerWebsite=Website +menu.managerCloud=JmalCloud +menu.articles=Articles +menu.alonePage=Alone Page +menu.appearance=Appearance +menu.categories=Categories +menu.tags=Tags +menu.deleteFile=Delete File +menu.downloadFile=Download File +menu.queryFile=Query File +menu.updateFile=Update File +menu.uploadFile=Upload File +menu.updateCloudSet=Update jmalCloud Setting +menu.addMenu=Add Menu +menu.deleteMenu=Delete Menu +menu.queryMenu=Query Menu +menu.updateMenu=Update Menu +menu.queryRole=Query Role +menu.addRole=Add Role +menu.updateRole=Update Role +menu.deleteRole=Delete Role +menu.queryUser=Query User +menu.addUser=Add User +menu.updateUser=Update User +menu.deleteUser=Delete User +menu.queryWebsiteContent=Query Website Content +menu.addWebsiteContent=Add Website Content +menu.updateWebsiteContent=Update Website Content +menu.deleteWebsiteContent=Delete Website Content +menu.websiteAppearance=Website Appearance +menu.basicSettings=Settings +menu.blog=Blog +menu.authAPP=Auth Apps +menu.managerSystem=SysAdmin +menu.logLogin=Login Log +menu.logOperation=OpLog +menu.ossManager=S3 +menu.queryOSS=Query OSS +menu.updateOSS=Update OSS +menu.deleteOSS=Delete OSS +menu.taskProgress=Task Prog +menu.trash=Recycle Bin diff --git a/src/main/resources/i18n/messages_en_US.properties b/src/main/resources/i18n/messages_en_US.properties index d23001b3..18822b87 100644 --- a/src/main/resources/i18n/messages_en_US.properties +++ b/src/main/resources/i18n/messages_en_US.properties @@ -1 +1,55 @@ login.error=Invalid username or password +menu.home=Home +menu.recently=Recently +menu.favorite=Favorite +menu.share=Share +menu.audio=Audio +menu.video=Video +menu.image=Image +menu.document=Document +menu.userinfo=UserInfo +menu.managerUser=User +menu.managerRole=Role +menu.managerMenu=Menu +menu.managerWebsite=Website +menu.managerCloud=JmalCloud +menu.articles=Articles +menu.alonePage=Alone Page +menu.appearance=Appearance +menu.categories=Categories +menu.tags=Tags +menu.deleteFile=Delete File +menu.downloadFile=Download File +menu.queryFile=Query File +menu.updateFile=Update File +menu.uploadFile=Upload File +menu.updateCloudSet=Update jmalCloud Setting +menu.addMenu=Add Menu +menu.deleteMenu=Delete Menu +menu.queryMenu=Query Menu +menu.updateMenu=Update Menu +menu.queryRole=Query Role +menu.addRole=Add Role +menu.updateRole=Update Role +menu.deleteRole=Delete Role +menu.queryUser=Query User +menu.addUser=Add User +menu.updateUser=Update User +menu.deleteUser=Delete User +menu.queryWebsiteContent=Query Website Content +menu.addWebsiteContent=Add Website Content +menu.updateWebsiteContent=Update Website Content +menu.deleteWebsiteContent=Delete Website Content +menu.websiteAppearance=Website Appearance +menu.basicSettings=Settings +menu.blog=Blog +menu.authAPP=Auth Apps +menu.managerSystem=SysAdmin +menu.logLogin=Login Log +menu.logOperation=OpLog +menu.ossManager=S3 +menu.queryOSS=Query OSS +menu.updateOSS=Update OSS +menu.deleteOSS=Delete OSS +menu.taskProgress=Task Prog +menu.trash=Recycle Bin diff --git a/src/main/resources/i18n/messages_zh_CN.properties b/src/main/resources/i18n/messages_zh_CN.properties index 5f9ccc26..32ee1820 100644 --- a/src/main/resources/i18n/messages_zh_CN.properties +++ b/src/main/resources/i18n/messages_zh_CN.properties @@ -1 +1,56 @@ login.error=账号或密码错误 +menu.home=首页 +menu.recently=最近 +menu.favorite=收藏 +menu.share=分享 +menu.audio=音频 +menu.video=视频 +menu.image=图片 +menu.document=文档 +menu.userinfo=用户信息 +menu.managerUser=用户管理 +menu.managerRole=角色管理 +menu.managerMenu=菜单管理 +menu.managerWebsite=网站管理 +menu.managerCloud=网盘管理 +menu.articles=文章 +menu.alonePage=独立页面 +menu.appearance=外观 +menu.categories=分类 +menu.tags=标签 +menu.deleteFile=删除文件 +menu.downloadFile=下载文件 +menu.queryFile=查询文件 +menu.updateFile=更新文件 +menu.uploadFile=上传文件 +menu.updateCloudSet=更新网盘设置 +menu.addMenu=添加菜单 +menu.deleteMenu=删除菜单 +menu.queryMenu=查询菜单 +menu.updateMenu=更新菜单 +menu.queryRole=查询角色 +menu.addRole=添加角色 +menu.updateRole=更新角色 +menu.deleteRole=删除角色 +menu.queryUser=查询用户 +menu.addUser=添加用户 +menu.updateUser=更新用户 +menu.deleteUser=删除用户 +menu.queryWebsiteContent=查询网站内容 +menu.addWebsiteContent=添加网站内容 +menu.updateWebsiteContent=更新网站内容 +menu.deleteWebsiteContent=删除网站内容 +menu.websiteAppearance=网站外观 +menu.basicSettings=基础设置 +menu.blog=博客 +menu.authAPP=授权应用 +menu.managerSystem=系统管理 +menu.logLogin=登录日志 +menu.logOperation=操作日志 +menu.ossManager=OSS 管理 +menu.queryOSS=查询 OSS +menu.updateOSS=更新 OSS +menu.deleteOSS=删除 OSS +menu.taskProgress=任务进度 +menu.trash=回收站 + From ee2547f2e8d20587f4190dc010aaac0868e3b7c3 Mon Sep 17 00:00:00 2001 From: jmal Date: Tue, 10 Sep 2024 15:36:07 +0800 Subject: [PATCH 3/4] feat: add role i18n config --- .../clouddisk/service/impl/RoleService.java | 8 +++++ src/main/resources/db/role.json | 32 +++++++++---------- src/main/resources/i18n/messages.properties | 19 +++++++++++ .../resources/i18n/messages_en_US.properties | 19 +++++++++++ .../resources/i18n/messages_zh_CN.properties | 18 +++++++++++ 5 files changed, 80 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/jmal/clouddisk/service/impl/RoleService.java b/src/main/java/com/jmal/clouddisk/service/impl/RoleService.java index 942b4adc..8bc3f5b9 100644 --- a/src/main/java/com/jmal/clouddisk/service/impl/RoleService.java +++ b/src/main/java/com/jmal/clouddisk/service/impl/RoleService.java @@ -49,6 +49,9 @@ public class RoleService { @Autowired private IUserService userService; + @Autowired + private MessageUtil messageUtil; + /*** * 角色列表 * @param queryDTO 角色查询条件 @@ -68,6 +71,11 @@ public ResponseResult> list(QueryRoleDTO queryDTO) { query.addCriteria(Criteria.where("remarks").regex(queryDTO.getRemarks(), "i")); } List roleDTOList = mongoTemplate.find(query, RoleDTO.class, COLLECTION_NAME); + // to i18n + roleDTOList = roleDTOList.stream().peek(roleDTO -> { + roleDTO.setName(messageUtil.getMessage(roleDTO.getName())); + roleDTO.setRemarks(messageUtil.getMessage(roleDTO.getRemarks())); + }).collect(Collectors.toList()); return ResultUtil.success(roleDTOList).setCount(count); } diff --git a/src/main/resources/db/role.json b/src/main/resources/db/role.json index c167920d..a053a831 100644 --- a/src/main/resources/db/role.json +++ b/src/main/resources/db/role.json @@ -60,8 +60,8 @@ "642e208895d19c039e02d508", "642e209995d19c039e02d50b" ], - "name": "超级管理员", - "remarks": "超级管理员", + "name": "role.superAdministrators", + "remarks": "role.superAdministrators", "updateTime": 1720334128676 }, { @@ -108,8 +108,8 @@ "642e208895d19c039e02d508", "642e209995d19c039e02d50b" ], - "name": "管理员", - "remarks": "所有菜单(只读)", + "name": "role.administrators", + "remarks": "role.allMenu_readonly", "updateTime": 1720334138113 }, { @@ -132,8 +132,8 @@ "5ffd390e29d8463da1186732", "600a694fb5a9d881713ea267" ], - "name": "网站访问者", - "remarks": "网站个人信息(只读)", + "name": "role.websiteVisitors", + "remarks": "role.wpi_ro", "updateTime": 1611300621152 }, { @@ -175,8 +175,8 @@ "600a694fb5a9d881713ea267", "600a6bbbb5a9d881713ea268" ], - "name": "网站编辑者", - "remarks": "所有网站菜单可写", + "name": "role.websiteEditors", + "remarks": "role.asma_w", "updateTime": 1720334159599 }, { @@ -213,8 +213,8 @@ "600a672db5a9d881713ea266", "600a694fb5a9d881713ea267" ], - "name": "网站管理员", - "remarks": "网站-所有菜单(只读)", + "name": "role.websiteAdministrators", + "remarks": "role.wam_ro", "updateTime": 1720334165458 }, { @@ -238,8 +238,8 @@ "5ffd390e29d8463da1186732", "600a694fb5a9d881713ea267" ], - "name": "访问者", - "remarks": "部分菜单(只读)", + "name": "role.visitors", + "remarks": "role.pm_ro", "updateTime": 1611300921005 }, { @@ -279,8 +279,8 @@ "600cf2ef194ba43988898423", "600a694fb5a9d881713ea267" ], - "name": "系统管理员", - "remarks": "系统管理菜单可写", + "name": "role.sysAdministrators", + "remarks": "role.sam_w", "updateTime": 1613719045841 }, { @@ -309,8 +309,8 @@ "5ffd38d529d8463da1186730", "600a694fb5a9d881713ea267" ], - "name": "普通用户", - "remarks": "普通网盘用户", + "name": "role.generalUsers", + "remarks": "role.gju", "updateTime": 1720334191182 } ] diff --git a/src/main/resources/i18n/messages.properties b/src/main/resources/i18n/messages.properties index 18822b87..617eef71 100644 --- a/src/main/resources/i18n/messages.properties +++ b/src/main/resources/i18n/messages.properties @@ -1,4 +1,6 @@ login.error=Invalid username or password + +# Menu menu.home=Home menu.recently=Recently menu.favorite=Favorite @@ -53,3 +55,20 @@ menu.updateOSS=Update OSS menu.deleteOSS=Delete OSS menu.taskProgress=Task Prog menu.trash=Recycle Bin + +# Role +role.superAdministrators=Super Administrators +role.administrators=Administrators +role.allMenu_readonly=All Menu (Read-Only) +role.websiteVisitors=Website Visitors +role.wpi_ro=Website Personal Information (Read-Only) +role.websiteEditors=Website Editors +role.asma_w=All site menus are writable +role.websiteAdministrators=Website Administrators +role.wam_ro=Website - All Menus (Read-Only) +role.visitors=Visitors +role.pm_ro=Partial menu (read-only) +role.sysAdministrators=Sys Administrators +role.sam_w=System administration menu writable +role.generalUsers=General Users +role.gju=General jmalcloud user diff --git a/src/main/resources/i18n/messages_en_US.properties b/src/main/resources/i18n/messages_en_US.properties index 18822b87..617eef71 100644 --- a/src/main/resources/i18n/messages_en_US.properties +++ b/src/main/resources/i18n/messages_en_US.properties @@ -1,4 +1,6 @@ login.error=Invalid username or password + +# Menu menu.home=Home menu.recently=Recently menu.favorite=Favorite @@ -53,3 +55,20 @@ menu.updateOSS=Update OSS menu.deleteOSS=Delete OSS menu.taskProgress=Task Prog menu.trash=Recycle Bin + +# Role +role.superAdministrators=Super Administrators +role.administrators=Administrators +role.allMenu_readonly=All Menu (Read-Only) +role.websiteVisitors=Website Visitors +role.wpi_ro=Website Personal Information (Read-Only) +role.websiteEditors=Website Editors +role.asma_w=All site menus are writable +role.websiteAdministrators=Website Administrators +role.wam_ro=Website - All Menus (Read-Only) +role.visitors=Visitors +role.pm_ro=Partial menu (read-only) +role.sysAdministrators=Sys Administrators +role.sam_w=System administration menu writable +role.generalUsers=General Users +role.gju=General jmalcloud user diff --git a/src/main/resources/i18n/messages_zh_CN.properties b/src/main/resources/i18n/messages_zh_CN.properties index 32ee1820..a9c17efd 100644 --- a/src/main/resources/i18n/messages_zh_CN.properties +++ b/src/main/resources/i18n/messages_zh_CN.properties @@ -1,4 +1,6 @@ login.error=账号或密码错误 + +# 菜单 menu.home=首页 menu.recently=最近 menu.favorite=收藏 @@ -54,3 +56,19 @@ menu.deleteOSS=删除 OSS menu.taskProgress=任务进度 menu.trash=回收站 +# 角色 +role.superAdministrators=超级管理员 +role.administrators=管理员 +role.allMenu_readonly=所有菜单(只读) +role.websiteVisitors=网站访客 +role.wpi_ro=网站个人信息(只读) +role.websiteEditors=网站编辑 +role.asma_w=所有站点菜单可写 +role.websiteAdministrators=网站管理员 +role.wam_ro=网站 - 所有菜单(只读) +role.visitors=访客 +role.pm_ro=部分菜单(只读) +role.sysAdministrators=系统管理员 +role.sam_w=系统管理菜单可写 +role.generalUsers=普通用户 +role.gju=普通网盘用户 From 17e3814f3e9cbd565154fa5c19aec6f7572485fd Mon Sep 17 00:00:00 2001 From: jmal Date: Tue, 10 Sep 2024 17:54:09 +0800 Subject: [PATCH 4/4] update: i18n config --- .../java/com/jmal/clouddisk/controller/sse/SseController.java | 2 +- src/main/resources/i18n/messages.properties | 2 +- src/main/resources/i18n/messages_en_US.properties | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/jmal/clouddisk/controller/sse/SseController.java b/src/main/java/com/jmal/clouddisk/controller/sse/SseController.java index 2786131d..5562bf2a 100644 --- a/src/main/java/com/jmal/clouddisk/controller/sse/SseController.java +++ b/src/main/java/com/jmal/clouddisk/controller/sse/SseController.java @@ -104,7 +104,7 @@ public void heartbeat() { emitters.forEach((uuid, emitter) -> { try { emitter.send("h"); - } catch (IOException ignored) { + } catch (IOException | IllegalStateException ignored) { } }); } diff --git a/src/main/resources/i18n/messages.properties b/src/main/resources/i18n/messages.properties index 617eef71..80f5dd12 100644 --- a/src/main/resources/i18n/messages.properties +++ b/src/main/resources/i18n/messages.properties @@ -14,7 +14,7 @@ menu.managerUser=User menu.managerRole=Role menu.managerMenu=Menu menu.managerWebsite=Website -menu.managerCloud=JmalCloud +menu.managerCloud=Setting menu.articles=Articles menu.alonePage=Alone Page menu.appearance=Appearance diff --git a/src/main/resources/i18n/messages_en_US.properties b/src/main/resources/i18n/messages_en_US.properties index 617eef71..80f5dd12 100644 --- a/src/main/resources/i18n/messages_en_US.properties +++ b/src/main/resources/i18n/messages_en_US.properties @@ -14,7 +14,7 @@ menu.managerUser=User menu.managerRole=Role menu.managerMenu=Menu menu.managerWebsite=Website -menu.managerCloud=JmalCloud +menu.managerCloud=Setting menu.articles=Articles menu.alonePage=Alone Page menu.appearance=Appearance