允许修改时区文本(尤其是在活动中)

接续自 :globe_showing_europe_africa: 新日历功能:显示本地时间 的讨论:

我们的站点几乎完全限制在我们的国家/地区内。

我们有一个特殊问题,我们的时区看起来像我们国家/地区内的某个特定地点,因此当它与紧随其后的地点字段一起显示时,可能会使用户感到困惑:

在这种情况下,(本地)活动将在距离奥克兰市约 1000 公里(在另一个城市)的一个著名的本地场所举行。其中包含(奥克兰)信息具有很大的误导性。

在链接的帖子中对此进行了一些讨论:

能够在站点级别隐藏时区(尤其是在活动中)对于本地活动将非常有帮助,但看不到如何使用 CSS 来实现这一点——并且 ask.discourse.com 也帮不上忙。

与此相关的是,能够将本地活动设置为默认值也会非常有帮助。

1 个赞

如果我理解正确:

  • 只有在事件设置中启用了“显示本地时间”时,才会显示事件时区城市
  • “显示本地时间”默认禁用

所以,我推断您有用户启用了“显示本地时间”,而您不希望这样。

如果隐藏“显示本地时间”设置,使其无法启用,怎么样?

.event-field.show-local-time {
    display: none;
}

然后,新事件将显示用户自己的本地时间和“芝加哥”。(我没有看到隐藏城市的方法,因为它是由内容生成的。)
例如,一个在菲尼克斯时间创建的事件将显示我自己的本地时间和“芝加哥”。

感谢您对此事的考虑和建议,Todd!

不完全是——这不是问题所在。时间是本地时间还是用户时间(在大多数情况下是相同的)实际上并不重要。
问题在于我们特定的时区包含的文本具有误导性(它是新西兰唯一的时区)。这对您也适用:在您上面的示例中,它暗示活动将在芝加哥的小溪(Little Creek)举行。

我正在尝试实现这个效果:

好吧,在对着“vibe coding”的墙撞了几次头之后,我在本地主题组件的 JS 标签中加入了这段 JavaScript 代码,它为我解决了问题:

import { apiInitializer } from "discourse/lib/api";

export default apiInitializer("swap-auckland-for-nz", (api) => {
  function swapTimezones(root = document) {
    root.querySelectorAll('.relative-time').forEach(elem => {
      if (elem.textContent && elem.textContent.includes('(Auckland)')) {
        elem.textContent = elem.textContent.replace('(Auckland)', '(NZ)');
      }
    });
  }

  api.onPageChange(() => {
    swapTimezones(document);

    // 设置持久的突变观察器以实现动态事件/日历输出
    const observer = new MutationObserver(() => {
      swapTimezones(document);
    });

    observer.observe(document.body, { childList: true, subtree: true });

    // 可选地,在其他导航事件后也再次运行
    window.addEventListener("hashchange", () => swapTimezones(document));
    window.addEventListener("popstate", () => swapTimezones(document));
  });
});

如果我有时间,我会将其打包成一个可安装的主题组件,以便其他人可以根据需要使用它。

我没意识到新西兰只有一个时区,但等我办完事回来时,我觉得你的问题需要用到 JavaScript。很高兴你找到了一个 JS 解决方案!

1 个赞