OpenProject 语言与地区设置指南:切换界面语言与时区的完整实操与实现原理
【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject
本篇指南围绕 OpenProject 的Account settings(账户设置)→ Language and region(语言和地区)功能展开,介绍普通用户如何切换界面语言、选择工作时区,并深入仓库源码解释语言列表、时区列表的生成机制,以及系统管理员如何激活更多语言。读完本文,你将掌握在 OpenProject 中完成个人语言与地区配置的完整操作路径,并理解其背后My::LocaleForm、My::TimeZoneForm与UserPreferences::UpdateContract的实现细节。
进入语言和地区设置
在 OpenProject 中,语言与地区设置位于**账户设置(Account settings)**页面的Language and region小节。操作路径如下:
- 点击右上角个人头像或菜单,进入Account settings;
- 在左侧设置列表中点击Language and region;
- 在该页面中即可看到**语言(Language)与时区(Time zone)**两个下拉选择框。
该页面对应表单由两个独立组件组合而成。在 app/forms/my/locale_form.rb 中可以看到,语言选择框与时区选择框被渲染在同一个表单内:语言字段由My::LocaleForm自身负责,时区字段则通过fields_for(:pref, ...)委托给My::TimeZoneForm,最后统一提交。
修改你的语言
在Language and region页面中,从**语言(Language)**下拉列表选择你希望使用的界面语言,然后点击Save(保存)按钮即可生效。
可选语言范围
OpenProject 支持超过30 种语言,涵盖德语、中文、法语、意大利语、韩语、拉脱维亚语、立陶宛语、波兰语、葡萄牙语、俄语、西班牙语、土耳其语等多种语言。语言名称以该语言自身的本地化名称展示(例如德语显示为 Deutsch、中文显示为 中文),并按照字母顺序排序。
从源码层面看,语言下拉列表由 app/forms/my/locale_form.rb 中的available_languages方法生成:
- 它首先取
valid_languages(即当前实例上已激活的语言集合),然后调用translate_language将语言代码转换为对应语言的自称名称(见 lib_static/redmine/i18n.rb 中的实现,实际读取cldr.language_name翻译条目); - 最后按名称字母序排序,保证下拉列表稳定可预期。
值得注意的是,语言选择框还支持一个特殊选项:当用户可用的有效语言集合等于系统全部语言集合时(见 locale_form.rb 的include_auto?判断),下拉列表会额外提供一个Auto(自动)选项,让界面语言跟随浏览器或系统设置自动适配。
为什么看不到我的语言
如果你在账户设置的语言下拉列表中找不到自己的首选语言,说明该语言尚未被系统管理员在系统设置中激活。OpenProject 的实例管理员可以在系统设置 → Languages(语言)页面中,从可用语言列表里勾选需要启用的语言。激活后,这些语言即可供所有用户在自己的账户设置中选择,同时也可被设置为整个实例的默认语言。
管理员操作界面如下图所示,详细说明可参考 系统管理员指南 - Languages:
语言选项的校验逻辑
即便语言由管理员集中激活,用户提交的语言值也会经过严格校验。语言表单依赖Redmine::I18n.valid_languages(lib_static/redmine/i18n.rb)以及find_language方法(lib_static/redmine/i18n.rb)做匹配校验——该方法只接受形如[a-z-]+的语言代码,并依次尝试直接匹配(如en)与父语言匹配(如用en匹配en-GB),防止提交任意非法语言代码污染用户偏好。
修改你的时区
在Language and region页面中,从**时区(Time zone)**下拉列表选择你工作所在地的时区,然后点击Save(保存)按钮即可生效。
时区列表如何生成
时区下拉列表由 app/forms/my/time_zone_form.rb 的available_time_zones方法生成,其数据源是UserPreferences::UpdateContract.assignable_time_zones(app/contracts/user_preferences/base_contract.rb)。该方法的实现要点如下:
- 它基于
ActiveSupport::TimeZone.all获取时区集合,但会按tzinfo.name分组,同一组内只保留“同名(namesake)”的那个时区(见 base_contract.rb 的namesake_time_zone); - 这样做的原因在源码注释中有明确说明:OpenProject 只提供能被无歧义地反向解析的时区选项——多个
ActiveSupport::TimeZone可能映射到同一个 TZInfo 时区,而系统(尤其是提醒邮件实现与表单展示)只接受 TZInfo 兼容的数据,因此需要去重,保证保存后的时区值能够准确还原; - 表单展示时(time_zone_form.rb)会为每个时区拼接
(UTC+偏移量)前缀与对应的时区名称列表,方便用户直观判断。
时区保存与默认回退
用户选择的时区保存在个人偏好(UserPreference)的settings["time_zone"]中,由 app/models/user_preference.rb 的time_zone方法读取。该方法遵循以下优先级:
- 用户显式设置的个人时区;
- 未设置时回退到系统默认时区
Setting.user_default_timezone(管理员可在系统设置中配置); - 仍未配置时,最终回退到
"Etc/UTC"。
提交时,UserPreferences::UpdateContract的time_zone_correctness校验(app/contracts/user_preferences/base_contract.rb)会确认提交的时区存在于assignable_time_zones中,确保不会写入非法时区标识。
保存设置
无论修改语言还是时区,都需点击页面底部的Save(保存)按钮完成提交。表单的提交按钮在 app/forms/my/locale_form.rb 中定义,为:primary方案的主按钮,提交后设置立即生效——界面语言会切换为所选语言,后续邮件通知、提醒、日期时间展示等也会遵循该语言与地区配置。
为翻译做贡献
OpenProject 的界面翻译由社区共同维护,目前已有超过 30 种语言。如果你希望帮助新增语言或完善母语翻译,可以参与 OpenProject 的 Crowdin 翻译项目;同时,管理员激活语言时也会在 Languages 管理页面 中看到引导用户参与社区翻译的说明(对应文档 翻译 OpenProject 指南 位于仓库的 contributions-guide 目录)。翻译成果合并后,最终会以语言翻译文件的形式落入 config/locales 目录,成为实例可选语言的一部分。
小结
- 语言与地区设置在Account settings → Language and region中完成,选择后点击Save立即生效;
- 语言下拉列表仅展示实例已激活的语言(超过 30 种),未出现目标语言时请联系系统管理员在 系统设置 → Languages 中激活;
- 时区列表由
assignable_time_zones去重生成,保证存储值可无歧义解析;未设置时依次回退到系统默认时区与Etc/UTC; - 相关核心实现位于 app/forms/my/locale_form.rb、app/forms/my/time_zone_form.rb 与 app/contracts/user_preferences/base_contract.rb。
【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考