在 Thunderbird Lightning Extension 的周视图和日视图中显示来自不同时区的 2 次

Show 2 Times from Different Time Zones in Week and Day View in Thunderbird Lightning Extension

Thunderbird Lightning 扩展在 WeekDay 视图的左侧显示时间,如此处所示...

我希望时间显示 2 个不同的时区(例如当地时间和太平洋时间),如下所示...

是否有配置参数可以做到这一点?是否有另一个扩展可以调整这个?如果没有,我该如何破解 Thunderbird 扩展程序来执行此操作?

作为参考,Outlook 有这个 functionality. Also, this answer 展示了如何破解 Lightning 扩展。

我不知道有任何现有的附加组件可以执行此操作,但我可以告诉您它是如何完成的。首先创建一个典型的 Thunderbird 扩展骨架,在 Firefox 世界中,如果您正在搜索文档,这称为 "legacy" 扩展。它应该包含一个 install.rdf 和一个 chrome.manifest。我假设您选择 view-zones 作为 chrome.manifest.

中的标识符

接下来您需要创建一个 CSS 文件,该文件将允许您覆盖 calendar-time-bar 绑定。请注意,使用此方法只能有一个覆盖绑定的扩展。内容将如下所示:

calendar-time-bar { 
    -moz-binding: url(chrome://view-zones/content/bindings.xml#calendar-time-bar) !important;
}

这将使用您将在 bindings.xml 文件中创建的绑定覆盖时间栏。它扩展了内置时间栏,但在重新布局后添加了一些代码以添加这些额外的标签。 CSS 文件需要在 chrome.manifest 文件中用 style 指令引用,并且可以扩展 chrome://calendar/skin/calendar-views.css。然后,您必须为 chrome://view-zones/content/bindings.xml:

创建 xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
   - License, v. 2.0. If a copy of the MPL was not distributed with this
   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->

<bindings id="calendar-multiday-view-bindings"
          xmlns="http://www.mozilla.org/xbl"
          xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
          xmlns:xbl="http://www.mozilla.org/xbl">
  <binding id="calendar-time-bar" 
           extends="chrome://calendar/content/calendar-multiday-view.xml#calendar-time-bar">
    <implementation>
      <method name="relayout">
        <body><![CDATA[
          this.__proto__.__proto__.relayout.call(this);
          let XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
          let topbox = document.getAnonymousElementByAttribute(this, "anonid", "topbox");
          for (let box of topbox.childNodes) {
            let timelabel = box.appendChild(document.createElementNS(XUL_NS, "label"));
            timelabel.setAttribute("value", "10:00 PT");
          }
        ]]></body>
      </method>
    </implementation>
  </binding>
</bindings>

我暂时将标签保留为静态,但您可以想出一些逻辑,根据其他标签或 [=19] 中使用的相同算法将 "10:00 PT" 更改为实际时间=].您还可以添加 类 和样式以使其看起来不同。

也就是说,也许您有兴趣将此功能添加到核心 Lightning 中?我认为这将是一个很好的补充。我很确定我们为此打开了一个错误,但我现在找不到它,所以如果你有兴趣,也许你可以 file a bug and I can give you more information on how to get set up. In that case it would be a matter of changing the binding 显示多个标签并添加用户可见的首选项可以选择时区。

我没有解决一般情况下的问题。我只是让时间显示在当前时区,并显示前一小时。就我而言,当前时区是美国山地时间,而前一小时最终是美国太平洋时间。

必须编辑以下 jar 文件中的文件 calendar-multiday-view.xml,而 Thunderbird 不是 运行。

C:\Users\nreynold.ORADEV\AppData\Roaming\Thunderbird\Profiles\profile\extensions\{e2fda1a4-762b-4020-b5ad-a41df1933103}\chrome.jar

方法 makeTimeBox() 必须按照评论的指示进行更改:

function makeTimeBox(timestr, time2str, size) {             // Add time2str parameter
   var box = createXULElement("box");
   box.setAttribute("orient", orient);
   box.setAttribute("align", "left");                       // Add

   if (orient == "horizontal") {
      box.setAttribute("width", size);
   } else {
      box.setAttribute("height", size);
   }

   var label = createXULElement("label");
   label.setAttribute("class", "calendar-time-bar-label");
   label.setAttribute("value", timestr);
   label.setAttribute("style", "color: #4080C0; font-weight: bold;");   // Replace "align"

   box.appendChild(label);

   var label = createXULElement("label");                   // Add
   label.setAttribute("class", "calendar-time-bar-label");  // Add
   label.setAttribute("value", time2str);                   // Add

   box.appendChild(label);                                  // Add

   return box;
}

makeTimeBox()后添加如下方法。

function makeTime(hour) {
   var h = hour % 12;

   if (h == 0)
      h = 12;

   var s = hour >= 12 ? " pm" : " am";
   var result = h + s;

   return result;
}

去掉makeTimeBox()

下面几行出现的下面一行
var formatter = Components.classes["@mozilla.org/intl/scriptabledateformat;1"].
                getService(Components.interfaces.nsIScriptableDateFormat);

更改以下行...

var timeString;

...成为...

var timeString, time2String;

下约 25 行,替换以下行...

timeString = formatter.FormatTime("",
                                  Components.interfaces.nsIScriptableDateFormat.timeFormatNoSeconds,
                                  theHour, 0, 0);
box = makeTimeBox(timeString, durPix);

...成为...

timeString = makeTime(theHour) + " MT";

ptHour  = theHour - 1;
ptHour += 23;
ptHour %= 24;
ptHour += 1;

time2String = makeTime(ptHour) + " PT";
box = makeTimeBox(timeString, time2String, durPix);