news 2026/9/18 0:16:24

OpenProject 语言与地区设置指南:切换界面语言与时区的完整实操与实现原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenProject 语言与地区设置指南:切换界面语言与时区的完整实操与实现原理

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::LocaleFormMy::TimeZoneFormUserPreferences::UpdateContract的实现细节。

进入语言和地区设置

在 OpenProject 中,语言与地区设置位于**账户设置(Account settings)**页面的Language and region小节。操作路径如下:

  1. 点击右上角个人头像或菜单,进入Account settings
  2. 在左侧设置列表中点击Language and region
  3. 在该页面中即可看到**语言(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方法读取。该方法遵循以下优先级:

  1. 用户显式设置的个人时区;
  2. 未设置时回退到系统默认时区Setting.user_default_timezone(管理员可在系统设置中配置);
  3. 仍未配置时,最终回退到"Etc/UTC"

提交时,UserPreferences::UpdateContracttime_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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 0:14:02

VB编程十三实践:从基础语法到二分查找的算法之旅

简介:这份PDF是针对浙江高中信息技术课程中《算法与程序设计学生活动手册》的参考答案汇编,由一线教师整理,面向浙江地区高中生及信息技术教师,服务算法与程序设计实践环节的自主校对与课堂讲评。文件为单个PDF文档,共…

作者头像 李华
网站建设 2026/9/18 0:12:34

VS Code SSH远程连接服务器配置与高频报错排查

大部分人第一次把 VS Code 和远程服务器放在一起用的场景,都差不多:手上有一台跑着训练任务或者测试环境的机器,代码在远端,本地只是一台性能普通的笔记本。于是就有了两条路——ssh 上去用 vim 硬改,或者本地写完再用…

作者头像 李华
网站建设 2026/9/18 0:05:40

C++文件I/O操作指南:从基础到高性能实践

1. 为什么每个C开发者都必须掌握文件I/O在Linux环境下用C处理文件,就像厨师用刀——看似基础却暗藏玄机。我见过太多项目因为文件操作不当导致数据损坏、性能瓶颈甚至安全漏洞。有一次排查线上服务崩溃,最终发现竟是开发者在写入日志时没检查fwrite返回值…

作者头像 李华
网站建设 2026/9/17 23:53:06

Apache Fesod替代EasyExcel:高并发Excel处理的确定性方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华