如何更改对话窗口的确定/取消按钮的标签?

时间:2012-09-16 06:34:36

标签: javascript firefox xul xpcom

如何更改/转换XPCOM对话窗口的OK/Cancel按钮的标签?您可以看到此类按钮的列表here

确实,我想要本地化Zotero Firefox附加组件。显示此类对话框的部分代码位于:

var regenerate = promptService.confirmEx(
    window, 
    Zotero.getString('integration.revert.title'),
    Zotero.getString('integration.revert.body'),
    promptService.STD_OK_CANCEL_BUTTONS + promptService.BUTTON_POS_1_DEFAULT,
    null, null, null, null, out
);​

3 个答案:

答案 0 :(得分:3)

嗯,首先,如果您想学习XUL,我强烈建议您使用XUL Explorer,这是一个交互式工具,您可以使用它来构建片段并预览您正在设计的内容。

如果您之前从未在XUL中工作过,这将派上用场,就好像它看起来像HTML一样 lot ,它不是相同的元素和方法阵容。它实际上比HTML更高,因为它用于构建桌面应用程序,可用于构建以下内容:

https://developer.mozilla.org/en-US/docs/tag/tools

大多数这些程序都可以像下载文档一样下载源代码并查看它。您还会注意到几个扩展,例如Firefox Web Developer插件。这是source,这里是some of the XUL files。这恰好包括dialogs目录和message.xul

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/"?>
<?xml-stylesheet href="chrome://web-developer/content/dialogs/style-sheets/message.css"?>
<!DOCTYPE dialog SYSTEM "chrome://web-developer/locale/dialogs/message.dtd">
<dialog buttons="accept" id="web-developer-message-dialog" onload="WebDeveloper.Message.initialize()" title="&webdeveloper.message.title;" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
    <script src="chrome://web-developer/content/common/common.js"/>
    <script src="chrome://web-developer/content/dialogs/javascript/message.js"/>

    <vbox id="web-developer-message-details">
        <description id="web-developer-message"/>
        <description id="web-developer-more-information" value="&webdeveloper.more.information;" onclick="WebDeveloper.Message.moreInformation()" class="url"/>
    </vbox>
</dialog>​

So you can use a Dialog for this,让您创建不同类型的提示。例如,我在不久前做了以下的教程:

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<dialog id="myDialog" title="My Dialog"
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
        onload="window.sizeToContent();"
        buttons="accept,cancel"
        buttonlabelaccept="Set Favorite"
        buttonaccesskeyaccept="S"
        ondialogaccept="return doSave();"
        buttonlabelcancel="Cancel"
        buttonaccesskeycancel="n"
        ondialogcancel="return doCancel();">
  <script>
  function doSave(){
      //doSomething()
      return true;
  }
  function doCancel(){
      return true;
  }
  </script>
  <dialogheader title="My dialog" description="Example dialog"/>
  <groupbox flex="1">
    <caption label="Select favorite fruit"/>
    <radiogroup>
      <radio id="1" label="Oranges because they are fruity"/>
      <radio id="2" selected="true" label="Strawberries because of color"/>
      <radio id="3" label="Bananna because it pre packaged"/>
    </radiogroup>
  </groupbox>
</dialog>

看起来像:

enter image description here

所以你真的有很多选择,如果你愿意的话,nsIPromptService ......

var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
                        .getService(Components.interfaces.nsIPromptService);

var check = {value: false};                  // default the checkbox to false

var flags = prompts.BUTTON_POS_0 * prompts.BUTTON_TITLE_SAVE +
            prompts.BUTTON_POS_1 * prompts.BUTTON_TITLE_IS_STRING  +
            prompts.BUTTON_POS_2 * prompts.BUTTON_TITLE_CANCEL;
// This value of flags will create 3 buttons. The first will be "Save", the
// second will be the value of aButtonTitle1, and the third will be "Cancel"

var button = prompts.confirmEx(null, "Title of this Dialog", "What do you want to do?",
                               flags, "", "Button 1", "", null, check);

还有一种叫做PopupNotifications.jsm的东西。那里有很多,所以我相信你可以找到你想要做的事情。还有Zotero source

答案 1 :(得分:1)

如果您需要自定义标签,那么您就不应该使用默认按钮:

promptService.confirmEx(
    window, 
    Zotero.getString('integration.revert.title'),
    Zotero.getString('integration.revert.body'),
    promptService.BUTTON_POS_0 * BUTTON_POS_0_DEFAULT,
    Zotero.getString('integration.revert.OK'),
    Zotero.getString('integration.revert.cancel'),
    null, null, out
);​

这会将第一个按钮声明为默认值,除此之外不需要指定任何标志 - 指定了两个标签,这样就会显示两个按钮。

答案 2 :(得分:0)

在支持每个浏览器的同时执行此操作的唯一方法是使用对话框库创建它,jQueryUI作为一个时尚的库有点像它的生命,但仍然真的功能齐全。