如何用Skinny Framework实现国际化(i18n)支持终极指南【免费下载链接】skinny-framework:monorail: Scala on Rails - A full-stack web app framework for rapid development in Scala项目地址: https://gitcode.com/gh_mirrors/sk/skinny-framework想要构建支持多语言的Scala Web应用吗 Skinny Framework提供了强大而简单的国际化(i18n)支持让您的应用能够轻松适应全球用户本文将为您详细介绍如何在Skinny Framework中实现完整的国际化解决方案从基础配置到高级用法一网打尽。什么是Skinny Framework国际化Skinny Framework的国际化系统基于标准的JavaLocale机制通过配置文件管理不同语言的文本消息。这个系统不仅支持简单的键值对映射还支持嵌套结构、参数替换和动态消息格式化让您的应用能够优雅地处理多语言需求。国际化配置文件结构 Skinny Framework的国际化消息存储在src/main/resources/目录下的配置文件中messages.conf- 默认语言通常是英语messages_ja.conf- 日语翻译messages_zh.conf- 中文翻译messages_fr.conf- 法语翻译配置文件使用HOCON格式支持嵌套结构。例如查看示例项目中的默认消息文件company { flash { createdThe company was created. updatedThe company was updated. deletedThe company was deleted. } listCompanies detailCompany editEdit Company newNew Company delete.confirmAre you sure? }对应的日语翻译文件在messages_ja.conf中company { flash { created会社の情報を登録しました。 updated会社の情報を更新しました。 deleted会社の情報を削除しました。 } list会社一覧 detail会社 edit会社の情報を変更 new会社を追加 delete.confirm本当に削除してもよろしいですか }核心国际化类详解 I18n类 - 国际化核心Skinny Framework的国际化核心是I18n类位于common/src/main/scala/skinny/I18n.scala。这个类提供了以下主要功能自动加载消息文件- 根据Locale自动加载对应的配置文件消息缓存- 提高性能避免重复读取文件参数化消息- 支持动态参数替换优雅降级- 找不到翻译时返回键名基本用法示例import skinny.I18n import java.util.Locale // 获取默认语言消息 val defaultI18n I18n() val name defaultI18n.get(name) // Some(Name) // 获取日语消息 val japaneseI18n I18n(new Locale(ja)) val japaneseName japaneseI18n.get(name) // Some(名前) // 带参数的消息 val formatted defaultI18n.get(error.required, Seq(Username)) // Some(Username is required)验证器国际化集成Skinny Framework的验证器系统深度集成了国际化支持。验证错误消息会自动从国际化配置文件中读取无需手动处理。查看验证器国际化支持文件I18nKeyParam.scala和Messages.scala// 自定义验证规则使用国际化 case class matches(regexp: String, regexpName: String) extends ValidationRule { override def name: String matches override def messageParams Seq(I18nKeyParam(regexpName)) override def isValid(value: Any): Boolean isEmpty(value) || value.toString.matches(regexp) }控制器中的国际化实践 基本消息获取在控制器中您可以通过skinny.Skinny对象访问国际化功能package controller import skinny._ import skinny.validator._ class MyController extends SkinnyController { def index { // 获取当前Locale的消息 val welcomeMessage i18n.getOrKey(welcome.message) val title i18n.getOrKey(page.title) // 带参数的消息 val userCount 42 val statsMessage i18n.getOrKey(user.count, Seq(userCount)) render(/my/index) } }表单验证国际化Skinny Framework的表单验证自动使用国际化消息。当验证失败时错误消息会自动从error命名空间下的配置中获取override def createForm validation( createParams, paramKey(name) is required maxLength(64), paramKey(email) is required email, paramKey(age) is required intMinMaxValue(18, 99) )对应的国际化配置error { required{0} is required maxLength{0} length must be less than or equal to {1} email{0} must be an e-mail intMinMaxValue{0} must be greater than or equal to {1} or be less than or equal to {2} }视图模板中的国际化 Scaml模板中的国际化在Scaml模板中通过s.i18n对象访问国际化消息-val s: skinny.Skinny %h1 #{s.i18n.get(page.title)} %p #{s.i18n.get(welcome.message)} %form(action{uri(/submit)} methodPOST) %label #{s.i18n.get(user.name)} %input(typetext namename placeholder{s.i18n.get(user.name.placeholder)}) %button(typesubmit classbtn btn-primary) #{s.i18n.get(submit)}查看实际的技能列表模板skills/index.html.scaml-val s: skinny.Skinny %h3 #{s.i18n.get(skill.list)} %th #{s.i18n.get(skill.id)} %th #{s.i18n.get(skill.name)}表单模板中的国际化在表单模板中结合验证错误显示国际化消息-val s: skinny.Skinny -val keyAndErrorMessages: skinny.KeyAndErrorMessages skinny.KeyAndErrorMessages() %div(classform-group) %label(classcontrol-label forname) #{s.i18n.get(skill.name)} %div(class{if(keyAndErrorMessages.hasErrors(name)) has-error else }) %input(typetext namename classform-control value{s.params.name}) - keyAndErrorMessages.get(name).map { errors - for (error - errors) %label(classcontrol-label fornameInput) #{error} - }高级国际化技巧 嵌套消息结构Skinny Framework支持无限嵌套的消息结构便于组织大型应用的翻译user { profile { titleUser Profile editEdit Profile saveSave Changes } settings { notificationNotification Settings privacyPrivacy Settings } } product { listProducts detailProduct Details price${currency} {0} }动态参数替换使用MessageFormat风格的参数替换支持复杂格式化// 配置文件 // welcome.messageWelcome back, {0}! You have {1} new messages. val username John val messageCount 5 val welcome i18n.getOrKey(welcome.message, Seq(username, messageCount)) // Welcome back, John! You have 5 new messages.区域设置自动检测Skinny Framework可以自动检测用户的语言偏好def detectLocale(request: HttpServletRequest): Locale { // 从请求头获取Accept-Language val acceptLanguage request.getHeader(Accept-Language) // 或者从会话中获取 val sessionLocale request.getSession.getAttribute(locale) // 或者从URL参数获取 val paramLocale request.getParameter(lang) // 实现您的检测逻辑 // ... }最佳实践建议 1. 保持一致的命名约定使用点分隔的层次结构如module.component.action格式确保消息键的可读性和可维护性。2. 使用参数化消息避免硬编码变量值使用参数化消息提高复用性# 好 greetingHello, {0}! # 不好 greeting.johnHello, John! greeting.janeHello, Jane!3. 组织消息文件按功能模块组织消息便于团队协作# 认证相关 auth { loginLogin logoutLogout registerRegister } # 用户界面 ui { button { saveSave cancelCancel deleteDelete } message { successOperation completed successfully errorAn error occurred } }4. 处理缺失翻译始终使用getOrKey方法提供优雅降级// 如果翻译不存在返回键名本身 val message i18n.getOrKey(some.key.that.might.not.exist)5. 测试国际化覆盖编写测试确保所有语言版本都有完整的翻译覆盖class I18nSpec extends AnyFlatSpec with Matchers { it should have complete Japanese translations in { val ja I18n(new Locale(ja)) val en I18n() // 确保所有英文键都有日文翻译 en.messages.keys.foreach { key ja.get(key) should not be None } } }常见问题解答 ❓Q: 如何添加新的语言支持A: 只需在src/main/resources/目录下创建新的配置文件如messages_fr.conf法语或messages_zh.conf中文然后使用对应的Locale对象即可。Q: 消息文件支持哪些格式A: Skinny Framework支持HOCON格式.conf文件和Properties格式.properties文件。推荐使用HOCON格式因为它支持嵌套结构和更丰富的语法。Q: 如何在运行时切换语言A: 可以通过设置HTTP请求的Locale来实现。常见做法是从URL参数获取如?langja从会话中获取从用户偏好设置获取从浏览器Accept-Language头获取Q: 性能如何A: Skinny Framework的国际化系统使用缓存机制消息文件只会在第一次访问时加载后续访问直接从内存缓存中读取性能优异。Q: 支持复数形式吗A: 虽然Skinny Framework没有内置的复数处理但可以通过参数化消息和条件逻辑实现message.item.countYou have {0} item{0,choice,0#s|1#|1s}总结 Skinny Framework的国际化系统设计简洁而强大完美体现了约定优于配置的理念。通过本文的介绍您已经掌握了✅ 国际化配置文件的结构和语法✅ 在控制器和视图中使用国际化消息✅ 验证器系统的国际化集成✅ 高级技巧和最佳实践现在就开始为您的Scala Web应用添加多语言支持吧使用Skinny Framework的国际化功能您可以轻松构建面向全球用户的应用程序提供更好的用户体验。记住好的国际化不仅仅是翻译文本更是理解不同文化背景用户的需求。Skinny Framework为您提供了强大的工具让这个复杂的过程变得简单而高效。祝您开发顺利【免费下载链接】skinny-framework:monorail: Scala on Rails - A full-stack web app framework for rapid development in Scala项目地址: https://gitcode.com/gh_mirrors/sk/skinny-framework创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
如何用Skinny Framework实现国际化(i18n)支持?终极指南
发布时间:2026/7/12 22:12:10
如何用Skinny Framework实现国际化(i18n)支持终极指南【免费下载链接】skinny-framework:monorail: Scala on Rails - A full-stack web app framework for rapid development in Scala项目地址: https://gitcode.com/gh_mirrors/sk/skinny-framework想要构建支持多语言的Scala Web应用吗 Skinny Framework提供了强大而简单的国际化(i18n)支持让您的应用能够轻松适应全球用户本文将为您详细介绍如何在Skinny Framework中实现完整的国际化解决方案从基础配置到高级用法一网打尽。什么是Skinny Framework国际化Skinny Framework的国际化系统基于标准的JavaLocale机制通过配置文件管理不同语言的文本消息。这个系统不仅支持简单的键值对映射还支持嵌套结构、参数替换和动态消息格式化让您的应用能够优雅地处理多语言需求。国际化配置文件结构 Skinny Framework的国际化消息存储在src/main/resources/目录下的配置文件中messages.conf- 默认语言通常是英语messages_ja.conf- 日语翻译messages_zh.conf- 中文翻译messages_fr.conf- 法语翻译配置文件使用HOCON格式支持嵌套结构。例如查看示例项目中的默认消息文件company { flash { createdThe company was created. updatedThe company was updated. deletedThe company was deleted. } listCompanies detailCompany editEdit Company newNew Company delete.confirmAre you sure? }对应的日语翻译文件在messages_ja.conf中company { flash { created会社の情報を登録しました。 updated会社の情報を更新しました。 deleted会社の情報を削除しました。 } list会社一覧 detail会社 edit会社の情報を変更 new会社を追加 delete.confirm本当に削除してもよろしいですか }核心国际化类详解 I18n类 - 国际化核心Skinny Framework的国际化核心是I18n类位于common/src/main/scala/skinny/I18n.scala。这个类提供了以下主要功能自动加载消息文件- 根据Locale自动加载对应的配置文件消息缓存- 提高性能避免重复读取文件参数化消息- 支持动态参数替换优雅降级- 找不到翻译时返回键名基本用法示例import skinny.I18n import java.util.Locale // 获取默认语言消息 val defaultI18n I18n() val name defaultI18n.get(name) // Some(Name) // 获取日语消息 val japaneseI18n I18n(new Locale(ja)) val japaneseName japaneseI18n.get(name) // Some(名前) // 带参数的消息 val formatted defaultI18n.get(error.required, Seq(Username)) // Some(Username is required)验证器国际化集成Skinny Framework的验证器系统深度集成了国际化支持。验证错误消息会自动从国际化配置文件中读取无需手动处理。查看验证器国际化支持文件I18nKeyParam.scala和Messages.scala// 自定义验证规则使用国际化 case class matches(regexp: String, regexpName: String) extends ValidationRule { override def name: String matches override def messageParams Seq(I18nKeyParam(regexpName)) override def isValid(value: Any): Boolean isEmpty(value) || value.toString.matches(regexp) }控制器中的国际化实践 基本消息获取在控制器中您可以通过skinny.Skinny对象访问国际化功能package controller import skinny._ import skinny.validator._ class MyController extends SkinnyController { def index { // 获取当前Locale的消息 val welcomeMessage i18n.getOrKey(welcome.message) val title i18n.getOrKey(page.title) // 带参数的消息 val userCount 42 val statsMessage i18n.getOrKey(user.count, Seq(userCount)) render(/my/index) } }表单验证国际化Skinny Framework的表单验证自动使用国际化消息。当验证失败时错误消息会自动从error命名空间下的配置中获取override def createForm validation( createParams, paramKey(name) is required maxLength(64), paramKey(email) is required email, paramKey(age) is required intMinMaxValue(18, 99) )对应的国际化配置error { required{0} is required maxLength{0} length must be less than or equal to {1} email{0} must be an e-mail intMinMaxValue{0} must be greater than or equal to {1} or be less than or equal to {2} }视图模板中的国际化 Scaml模板中的国际化在Scaml模板中通过s.i18n对象访问国际化消息-val s: skinny.Skinny %h1 #{s.i18n.get(page.title)} %p #{s.i18n.get(welcome.message)} %form(action{uri(/submit)} methodPOST) %label #{s.i18n.get(user.name)} %input(typetext namename placeholder{s.i18n.get(user.name.placeholder)}) %button(typesubmit classbtn btn-primary) #{s.i18n.get(submit)}查看实际的技能列表模板skills/index.html.scaml-val s: skinny.Skinny %h3 #{s.i18n.get(skill.list)} %th #{s.i18n.get(skill.id)} %th #{s.i18n.get(skill.name)}表单模板中的国际化在表单模板中结合验证错误显示国际化消息-val s: skinny.Skinny -val keyAndErrorMessages: skinny.KeyAndErrorMessages skinny.KeyAndErrorMessages() %div(classform-group) %label(classcontrol-label forname) #{s.i18n.get(skill.name)} %div(class{if(keyAndErrorMessages.hasErrors(name)) has-error else }) %input(typetext namename classform-control value{s.params.name}) - keyAndErrorMessages.get(name).map { errors - for (error - errors) %label(classcontrol-label fornameInput) #{error} - }高级国际化技巧 嵌套消息结构Skinny Framework支持无限嵌套的消息结构便于组织大型应用的翻译user { profile { titleUser Profile editEdit Profile saveSave Changes } settings { notificationNotification Settings privacyPrivacy Settings } } product { listProducts detailProduct Details price${currency} {0} }动态参数替换使用MessageFormat风格的参数替换支持复杂格式化// 配置文件 // welcome.messageWelcome back, {0}! You have {1} new messages. val username John val messageCount 5 val welcome i18n.getOrKey(welcome.message, Seq(username, messageCount)) // Welcome back, John! You have 5 new messages.区域设置自动检测Skinny Framework可以自动检测用户的语言偏好def detectLocale(request: HttpServletRequest): Locale { // 从请求头获取Accept-Language val acceptLanguage request.getHeader(Accept-Language) // 或者从会话中获取 val sessionLocale request.getSession.getAttribute(locale) // 或者从URL参数获取 val paramLocale request.getParameter(lang) // 实现您的检测逻辑 // ... }最佳实践建议 1. 保持一致的命名约定使用点分隔的层次结构如module.component.action格式确保消息键的可读性和可维护性。2. 使用参数化消息避免硬编码变量值使用参数化消息提高复用性# 好 greetingHello, {0}! # 不好 greeting.johnHello, John! greeting.janeHello, Jane!3. 组织消息文件按功能模块组织消息便于团队协作# 认证相关 auth { loginLogin logoutLogout registerRegister } # 用户界面 ui { button { saveSave cancelCancel deleteDelete } message { successOperation completed successfully errorAn error occurred } }4. 处理缺失翻译始终使用getOrKey方法提供优雅降级// 如果翻译不存在返回键名本身 val message i18n.getOrKey(some.key.that.might.not.exist)5. 测试国际化覆盖编写测试确保所有语言版本都有完整的翻译覆盖class I18nSpec extends AnyFlatSpec with Matchers { it should have complete Japanese translations in { val ja I18n(new Locale(ja)) val en I18n() // 确保所有英文键都有日文翻译 en.messages.keys.foreach { key ja.get(key) should not be None } } }常见问题解答 ❓Q: 如何添加新的语言支持A: 只需在src/main/resources/目录下创建新的配置文件如messages_fr.conf法语或messages_zh.conf中文然后使用对应的Locale对象即可。Q: 消息文件支持哪些格式A: Skinny Framework支持HOCON格式.conf文件和Properties格式.properties文件。推荐使用HOCON格式因为它支持嵌套结构和更丰富的语法。Q: 如何在运行时切换语言A: 可以通过设置HTTP请求的Locale来实现。常见做法是从URL参数获取如?langja从会话中获取从用户偏好设置获取从浏览器Accept-Language头获取Q: 性能如何A: Skinny Framework的国际化系统使用缓存机制消息文件只会在第一次访问时加载后续访问直接从内存缓存中读取性能优异。Q: 支持复数形式吗A: 虽然Skinny Framework没有内置的复数处理但可以通过参数化消息和条件逻辑实现message.item.countYou have {0} item{0,choice,0#s|1#|1s}总结 Skinny Framework的国际化系统设计简洁而强大完美体现了约定优于配置的理念。通过本文的介绍您已经掌握了✅ 国际化配置文件的结构和语法✅ 在控制器和视图中使用国际化消息✅ 验证器系统的国际化集成✅ 高级技巧和最佳实践现在就开始为您的Scala Web应用添加多语言支持吧使用Skinny Framework的国际化功能您可以轻松构建面向全球用户的应用程序提供更好的用户体验。记住好的国际化不仅仅是翻译文本更是理解不同文化背景用户的需求。Skinny Framework为您提供了强大的工具让这个复杂的过程变得简单而高效。祝您开发顺利【免费下载链接】skinny-framework:monorail: Scala on Rails - A full-stack web app framework for rapid development in Scala项目地址: https://gitcode.com/gh_mirrors/sk/skinny-framework创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考