diff --git a/src/main/java/io/jenkins/plugins/openmfa/MFAGlobalConfiguration.java b/src/main/java/io/jenkins/plugins/openmfa/MFAGlobalConfiguration.java
index f1f133a..e04477e 100644
--- a/src/main/java/io/jenkins/plugins/openmfa/MFAGlobalConfiguration.java
+++ b/src/main/java/io/jenkins/plugins/openmfa/MFAGlobalConfiguration.java
@@ -67,7 +67,7 @@ public String getDefaultIssuer() {
@NonNull
@Override
public String getDisplayName() {
- return UIConstants.DisplayNames.OPENMFA_GLOBAL_CONFIGURATION;
+ return Messages.DisplayNames_OPENMFA_GLOBAL_CONFIGURATION();
}
@DataBoundSetter
diff --git a/src/main/java/io/jenkins/plugins/openmfa/MFAManagementLink.java b/src/main/java/io/jenkins/plugins/openmfa/MFAManagementLink.java
index 9309ff0..5d7c858 100644
--- a/src/main/java/io/jenkins/plugins/openmfa/MFAManagementLink.java
+++ b/src/main/java/io/jenkins/plugins/openmfa/MFAManagementLink.java
@@ -133,12 +133,12 @@ public Category getCategory() {
@Override
public String getDescription() {
- return "View and manage MFA status for all users";
+ return Messages.MFAManagementLink_description();
}
@Override
public String getDisplayName() {
- return UIConstants.DisplayNames.MFA_USER_MANAGEMENT;
+ return Messages.DisplayNames_MFA_USER_MANAGEMENT();
}
/**
diff --git a/src/main/java/io/jenkins/plugins/openmfa/MFAUserPropertyDescriptor.java b/src/main/java/io/jenkins/plugins/openmfa/MFAUserPropertyDescriptor.java
index 7218533..36fec47 100644
--- a/src/main/java/io/jenkins/plugins/openmfa/MFAUserPropertyDescriptor.java
+++ b/src/main/java/io/jenkins/plugins/openmfa/MFAUserPropertyDescriptor.java
@@ -5,7 +5,6 @@
import hudson.model.User;
import hudson.model.UserPropertyDescriptor;
import hudson.model.userproperty.UserPropertyCategory;
-import io.jenkins.plugins.openmfa.constant.UIConstants;
/**
* Descriptor for {@link MFAUserProperty}.
@@ -20,7 +19,7 @@ public MFAUserPropertyDescriptor() {
@NonNull
@Override
public String getDisplayName() {
- return UIConstants.DisplayNames.MULTI_FACTOR_AUTHENTICATION;
+ return Messages.DisplayNames_MULTI_FACTOR_AUTHENTICATION();
}
@NonNull
diff --git a/src/main/java/io/jenkins/plugins/openmfa/constant/UIConstants.java b/src/main/java/io/jenkins/plugins/openmfa/constant/UIConstants.java
index a73fc63..8573713 100644
--- a/src/main/java/io/jenkins/plugins/openmfa/constant/UIConstants.java
+++ b/src/main/java/io/jenkins/plugins/openmfa/constant/UIConstants.java
@@ -23,24 +23,6 @@ private Defaults() {
}
}
- /**
- * Display names for UI components
- */
- public static final class DisplayNames {
-
- public static final String CONFIGURE_MFA = "Configure MFA";
- public static final String MFA_LOGIN = "MFA Login";
- public static final String MFA_SECURITY_REALM =
- "MFA Security Realm (wraps existing realm)";
- public static final String MFA_USER_MANAGEMENT = "MFA User Management";
- public static final String MULTI_FACTOR_AUTHENTICATION =
- "Multi-Factor Authentication (MFA)";
- public static final String OPENMFA_GLOBAL_CONFIGURATION = "OpenMFA";
-
- private DisplayNames() {
- }
- }
-
/**
* HTTP response codes
*/
diff --git a/src/main/resources/io/jenkins/plugins/openmfa/MFAGlobalConfiguration/config_zh_CN.properties b/src/main/resources/io/jenkins/plugins/openmfa/MFAGlobalConfiguration/config_zh_CN.properties
new file mode 100644
index 0000000..d0462f8
--- /dev/null
+++ b/src/main/resources/io/jenkins/plugins/openmfa/MFAGlobalConfiguration/config_zh_CN.properties
@@ -0,0 +1,4 @@
+config.section.title=OpenMFA 配置
+config.requireMFA.title=要求所有用户启用 MFA
+config.issuer.title=发行者名称
+config.mfaManagement.title=MFA 用户管理
diff --git a/src/main/resources/io/jenkins/plugins/openmfa/MFALoginAction/index_es.properties b/src/main/resources/io/jenkins/plugins/openmfa/MFALoginAction/index_es.properties
index d07569d..6e6196d 100644
--- a/src/main/resources/io/jenkins/plugins/openmfa/MFALoginAction/index_es.properties
+++ b/src/main/resources/io/jenkins/plugins/openmfa/MFALoginAction/index_es.properties
@@ -10,5 +10,9 @@ please.login=Por favor inicie sesión primero.
error.invalid.code=Código de verificación inválido. Por favor, intente de nuevo.
error.locked.title=Cuenta Bloqueada Temporalmente
error.locked.message=Demasiados intentos fallidos. Por favor, intente de nuevo en
+mfa.enabled.info=La autenticación multifactor está habilitada en su cuenta.
+mfa.already.verified=Ya ha completado la verificación MFA para esta sesión. Puede continuar usando Jenkins con seguridad.
+continue.button=Continuar a Jenkins
+redirect.in.seconds=Redirigiendo en {0} segundos...
mfa.not.enabled.title=MFA no está habilitado
mfa.not.enabled.message=No ha habilitado MFA. Habilite MFA ahora para mejorar la seguridad de su cuenta.
diff --git a/src/main/resources/io/jenkins/plugins/openmfa/MFALoginAction/index_zh_CN.properties b/src/main/resources/io/jenkins/plugins/openmfa/MFALoginAction/index_zh_CN.properties
new file mode 100644
index 0000000..f6f40b3
--- /dev/null
+++ b/src/main/resources/io/jenkins/plugins/openmfa/MFALoginAction/index_zh_CN.properties
@@ -0,0 +1,18 @@
+# MFA Login Action Messages (Simplified Chinese)
+
+title=多因素认证
+security.alt=安全
+prompt=请输入您身份验证应用中的 6 位数代码
+submit.button=验证
+lost.device=无法访问您的身份验证应用?请联系您的 Jenkins 管理员。
+no.pending.auth=没有待处理的认证
+please.login=请先登录。
+error.invalid.code=验证码无效。请重试。
+error.locked.title=账户暂时被锁
+error.locked.message=失败尝试次数过多。请在以下时间后重试
+mfa.enabled.info=您的账户已启用多因素认证。
+mfa.already.verified=您已完成本次会话的 MFA 验证。您可以安全地继续使用 Jenkins。
+continue.button=继续访问 Jenkins
+redirect.in.seconds={0} 秒后跳转...
+mfa.not.enabled.title=MFA 未启用
+mfa.not.enabled.message=您尚未启用 MFA。请立即启用 MFA以提高账户安全性。
diff --git a/src/main/resources/io/jenkins/plugins/openmfa/MFAManagementLink/index_zh_CN.properties b/src/main/resources/io/jenkins/plugins/openmfa/MFAManagementLink/index_zh_CN.properties
new file mode 100644
index 0000000..b758459
--- /dev/null
+++ b/src/main/resources/io/jenkins/plugins/openmfa/MFAManagementLink/index_zh_CN.properties
@@ -0,0 +1,48 @@
+# MFA Management Dashboard - Simplified Chinese
+
+config.link=MFA 插件设置
+
+title=MFA 用户管理
+subtitle=管理所有用户的多因素认证配置
+
+stats.total=用户总数
+stats.enabled=MFA 已启用
+stats.not.enabled=未启用
+
+users.title=用户 MFA 状态
+no.users=未找到系统中的用户。
+
+table.user=用户 ID
+table.fullname=姓名
+table.status=MFA 状态
+table.status.disabled=未启用
+table.actions=操作
+
+reset.button=重置 MFA
+reset.confirm.title=重置 MFA?
+reset.confirm.messagePrefix=您确定要为用户
+reset.confirm.messageSuffix=重置 MFA 吗?这将删除其当前的 MFA 配置,他们需要重新设置 MFA。
+reset.confirm.cancel=取消
+reset.toast.title=成功
+reset.toast.theUser=用户
+reset.toast.sSuffix=的
+reset.success=MFA 已成功重置。
+reset.error.default=重置 MFA 失败。
+set.button=启用 MFA
+
+notes.title=重要注意事项
+notes.reset.warning=重置 MFA 将删除用户的当前身份验证应用配置。他们需要重新设置 MFA。
+notes.user.setup=用户可以从其用户配置页面自行配置 MFA。
+
+search.placeholder=按用户 ID 或姓名搜索
+
+pagination.show=展示
+pagination.entries=行
+pagination.showing=展示
+pagination.to=至
+pagination.of=的
+pagination.entries.label=行记录
+pagination.first=首页
+pagination.previous=上一页
+pagination.next=下一页
+pagination.last=末页
diff --git a/src/main/resources/io/jenkins/plugins/openmfa/MFAManagementLink/mfa-mgmt-pagi.css b/src/main/resources/io/jenkins/plugins/openmfa/MFAManagementLink/mfa-mgmt-pagi.css
index 04f3f97..0a7cc7e 100644
--- a/src/main/resources/io/jenkins/plugins/openmfa/MFAManagementLink/mfa-mgmt-pagi.css
+++ b/src/main/resources/io/jenkins/plugins/openmfa/MFAManagementLink/mfa-mgmt-pagi.css
@@ -17,6 +17,10 @@
color: var(--text-color-secondary, #6b7280);
}
+.mfa-mgmt-page-size label {
+ width: 3.5em;
+}
+
.mfa-mgmt-page-size select {
min-width: 70px;
}
diff --git a/src/main/resources/io/jenkins/plugins/openmfa/MFASetupAction/index.jelly b/src/main/resources/io/jenkins/plugins/openmfa/MFASetupAction/index.jelly
index 50da520..e73defc 100644
--- a/src/main/resources/io/jenkins/plugins/openmfa/MFASetupAction/index.jelly
+++ b/src/main/resources/io/jenkins/plugins/openmfa/MFASetupAction/index.jelly
@@ -58,6 +58,7 @@
data-message="${%disable.confirm.message}"
data-cancel-text="${%disable.confirm.cancel}"
data-ok-text="${%disable.button}"
+ data-copy-feedback="${%copy.feedback}"
>
diff --git a/src/main/resources/io/jenkins/plugins/openmfa/MFASetupAction/index.properties b/src/main/resources/io/jenkins/plugins/openmfa/MFASetupAction/index.properties
index 2561245..1bd8276 100644
--- a/src/main/resources/io/jenkins/plugins/openmfa/MFASetupAction/index.properties
+++ b/src/main/resources/io/jenkins/plugins/openmfa/MFASetupAction/index.properties
@@ -29,3 +29,4 @@ error.toast.invalid_code.title=Invalid verification code
error.toast.invalid_code.message=The code you entered is incorrect or expired. Please try again.
error.toast.require_mfa.title=MFA required
error.toast.require_mfa.message=You must enable MFA to access this resource.
+copy.feedback=Copied!
diff --git a/src/main/resources/io/jenkins/plugins/openmfa/MFASetupAction/index_es.properties b/src/main/resources/io/jenkins/plugins/openmfa/MFASetupAction/index_es.properties
index 2253c9c..cedef08 100644
--- a/src/main/resources/io/jenkins/plugins/openmfa/MFASetupAction/index_es.properties
+++ b/src/main/resources/io/jenkins/plugins/openmfa/MFASetupAction/index_es.properties
@@ -29,3 +29,4 @@ error.toast.invalid_code.title=Código de verificación inválido
error.toast.invalid_code.message=El código ingresado es incorrecto o ha expirado. Intente de nuevo.
error.toast.require_mfa.title=MFA requerido
error.toast.require_mfa.message=Debe habilitar MFA para acceder a este recurso.
+copy.feedback=¡Copiado!
diff --git a/src/main/resources/io/jenkins/plugins/openmfa/MFASetupAction/index_zh_CN.properties b/src/main/resources/io/jenkins/plugins/openmfa/MFASetupAction/index_zh_CN.properties
new file mode 100644
index 0000000..b457dc0
--- /dev/null
+++ b/src/main/resources/io/jenkins/plugins/openmfa/MFASetupAction/index_zh_CN.properties
@@ -0,0 +1,32 @@
+# MFA Setup Action Messages (Simplified Chinese)
+
+title=配置多因素认证
+enabled.title=多因素认证已启用
+enabled.message=您的账户已受 TOTP 基础的 MFA 保护。
+disable.button=禁用 MFA
+disable.confirm.title=禁用 MFA?
+disable.confirm.message=您确定要禁用 MFA 吗?这将删除您当前 MFA 配置,您需要重新设置 MFA。
+disable.confirm.cancel=取消
+setup.title=多因素认证配置
+setup.message=通过启用 MFA 为您的 Jenkins 账户添加一层安全防护。
+step1.title=步骤 1:扫描二维码
+step1.message=使用您的身份验证应用(Google Authenticator、Authy 等)扫描此二维码
+step1.qrcode.alt=二维码
+step2.title=步骤 2:验证并启用
+step2.message=输入您身份验证应用中的 6 位数代码以验证并启用 MFA:
+verification.code=验证码:
+verification.placeholder=000000
+enable.button=验证并启用 MFA
+notes.title=重要注意事项:
+notes.required=您每次登录时都需要使用身份验证应用
+notes.lost=如果您无法访问身份验证应用,请联系您的 Jenkins 管理员
+notes.expiry=TOTP 代码基于时间,每 30 秒过期一次
+success.toast.title=MFA 已成功启用!
+success.toast.message=您的账户现在已受多因素认证保护。
+success.toast.disabled.title=MFA 已禁用
+success.toast.disabled.message=多因素认证已为您的账户关闭。
+error.toast.invalid_code.title=验证码无效
+error.toast.invalid_code.message=您输入的代码不正确或已过期。请重试。
+error.toast.require_mfa.title=需要 MFA
+error.toast.require_mfa.message=您必须启用 MFA 才能访问此资源。
+copy.feedback=已复制!
diff --git a/src/main/resources/io/jenkins/plugins/openmfa/MFASetupAction/mfa-setup.js b/src/main/resources/io/jenkins/plugins/openmfa/MFASetupAction/mfa-setup.js
index 1f85c22..275b697 100644
--- a/src/main/resources/io/jenkins/plugins/openmfa/MFASetupAction/mfa-setup.js
+++ b/src/main/resources/io/jenkins/plugins/openmfa/MFASetupAction/mfa-setup.js
@@ -11,6 +11,7 @@ function _getDisableDialogLabels() {
message: el.getAttribute('data-message') || '',
okText: el.getAttribute('data-ok-text') || '',
cancelText: el.getAttribute('data-cancel-text') || '',
+ copyFeedback: el.getAttribute('data-copy-feedback') || 'Copied!',
};
}
@@ -64,12 +65,14 @@ function initNotification() {
function copySecret(button) {
const input = button.previousElementSibling;
const secret = input.value;
+ const labels = _getDisableDialogLabels() || {};
+ const feedbackText = labels.copyFeedback || 'Copied!';
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard
.writeText(secret)
.then(function () {
const originalText = button.textContent;
- button.textContent = 'Copied!';
+ button.textContent = feedbackText;
button.classList.add('copied');
setTimeout(function () {
button.textContent = originalText;
@@ -78,14 +81,14 @@ function copySecret(button) {
})
.catch(function (err) {
console.error('Failed to copy:', err);
- fallbackCopy(secret, button);
+ fallbackCopy(secret, button, feedbackText);
});
} else {
- fallbackCopy(secret, button);
+ fallbackCopy(secret, button, feedbackText);
}
}
-function fallbackCopy(text, button) {
+function fallbackCopy(text, button, feedbackText) {
const textArea = document.createElement('textarea');
textArea.value = text;
textArea.style.position = 'fixed';
@@ -95,7 +98,7 @@ function fallbackCopy(text, button) {
try {
document.execCommand('copy');
const originalText = button.textContent;
- button.textContent = 'Copied!';
+ button.textContent = feedbackText;
button.classList.add('copied');
setTimeout(function () {
button.textContent = originalText;
diff --git a/src/main/resources/io/jenkins/plugins/openmfa/MFAUserProperty/config_es.properties b/src/main/resources/io/jenkins/plugins/openmfa/MFAUserProperty/config_es.properties
index 985ebf4..e0beaca 100644
--- a/src/main/resources/io/jenkins/plugins/openmfa/MFAUserProperty/config_es.properties
+++ b/src/main/resources/io/jenkins/plugins/openmfa/MFAUserProperty/config_es.properties
@@ -4,4 +4,5 @@ config.status.title=Estado de configuración
config.status.enabled=Habilitado
config.status.disabled=Deshabilitado
-config.setup.linkHelp=Ver estado de MFA
+config.setup.linkHelp=Gestionar MFA
+config.setup.linkHelpNotEnabled=Configurar MFA
diff --git a/src/main/resources/io/jenkins/plugins/openmfa/MFAUserProperty/config_zh_CN.properties b/src/main/resources/io/jenkins/plugins/openmfa/MFAUserProperty/config_zh_CN.properties
new file mode 100644
index 0000000..db52537
--- /dev/null
+++ b/src/main/resources/io/jenkins/plugins/openmfa/MFAUserProperty/config_zh_CN.properties
@@ -0,0 +1,8 @@
+# MFA User Property Messages (Simplified Chinese)
+
+config.status.title=当前状态
+config.status.enabled=已启用
+config.status.disabled=未启用
+
+config.setup.linkHelp=管理 MFA
+config.setup.linkHelpNotEnabled=设置 MFA
diff --git a/src/main/resources/io/jenkins/plugins/openmfa/Messages.properties b/src/main/resources/io/jenkins/plugins/openmfa/Messages.properties
new file mode 100644
index 0000000..2ec718f
--- /dev/null
+++ b/src/main/resources/io/jenkins/plugins/openmfa/Messages.properties
@@ -0,0 +1,12 @@
+# MFA Plugin Display Names - Default (English)
+
+# Display names for UI components
+DisplayNames.CONFIGURE_MFA=Configure MFA
+DisplayNames.MFA_LOGIN=MFA Login
+DisplayNames.MFA_SECURITY_REALM=MFA Security Realm (wraps existing realm)
+DisplayNames.MFA_USER_MANAGEMENT=MFA User Management
+DisplayNames.MULTI_FACTOR_AUTHENTICATION=Multi-Factor Authentication (MFA)
+DisplayNames.OPENMFA_GLOBAL_CONFIGURATION=OpenMFA
+
+# Management link description
+MFAManagementLink.description=View and manage MFA status for all users
diff --git a/src/main/resources/io/jenkins/plugins/openmfa/Messages_es.properties b/src/main/resources/io/jenkins/plugins/openmfa/Messages_es.properties
new file mode 100644
index 0000000..e2f217e
--- /dev/null
+++ b/src/main/resources/io/jenkins/plugins/openmfa/Messages_es.properties
@@ -0,0 +1,12 @@
+# MFA Plugin Display Names - Spanish
+
+# Display names for UI components
+DisplayNames.CONFIGURE_MFA=Configurar MFA
+DisplayNames.MFA_LOGIN=Inicio de sesi\u00f3n MFA
+DisplayNames.MFA_SECURITY_REALM=\u00c1mbito de seguridad MFA (envuelve el \u00e1mbito existente)
+DisplayNames.MFA_USER_MANAGEMENT=Gesti\u00f3n de usuarios MFA
+DisplayNames.MULTI_FACTOR_AUTHENTICATION=Autenticaci\u00f3n Multifactor (MFA)
+DisplayNames.OPENMFA_GLOBAL_CONFIGURATION=OpenMFA
+
+# Management link description
+MFAManagementLink.description=Ver y gestionar el estado de MFA para todos los usuarios
diff --git a/src/main/resources/io/jenkins/plugins/openmfa/Messages_zh_CN.properties b/src/main/resources/io/jenkins/plugins/openmfa/Messages_zh_CN.properties
new file mode 100644
index 0000000..328b0dd
--- /dev/null
+++ b/src/main/resources/io/jenkins/plugins/openmfa/Messages_zh_CN.properties
@@ -0,0 +1,12 @@
+# MFA Plugin Display Names - Simplified Chinese
+
+# Display names for UI components
+DisplayNames.CONFIGURE_MFA=配置 MFA
+DisplayNames.MFA_LOGIN=MFA 登录
+DisplayNames.MFA_SECURITY_REALM=MFA 安全域 (包裹现有域)
+DisplayNames.MFA_USER_MANAGEMENT=MFA 用户管理
+DisplayNames.MULTI_FACTOR_AUTHENTICATION=多因素认证 (MFA)
+DisplayNames.OPENMFA_GLOBAL_CONFIGURATION=OpenMFA 全局配置
+
+# Management link description
+MFAManagementLink.description=查看并管理所有用户的 MFA 状态
diff --git a/src/test/java/io/jenkins/plugins/openmfa/MFAManagementLinkTest.java b/src/test/java/io/jenkins/plugins/openmfa/MFAManagementLinkTest.java
index 0559116..87367cf 100644
--- a/src/test/java/io/jenkins/plugins/openmfa/MFAManagementLinkTest.java
+++ b/src/test/java/io/jenkins/plugins/openmfa/MFAManagementLinkTest.java
@@ -93,7 +93,7 @@ void testGetAllUsersWithoutAdminPermission(JenkinsRule j) throws Exception {
@Test
void testGetDisplayName(JenkinsRule j) {
- assertEquals("MFA User Management", action.getDisplayName());
+ assertEquals("MFA User Management", Messages.DisplayNames_MFA_USER_MANAGEMENT());
}
@Test