好的Java属性文件编辑器

好的Java属性文件编辑器,java,ide,resources,properties,editor,Java,Ide,Resources,Properties,Editor,我从事一个开源Java项目,我们有很多资源属性文件,其中包含可本地化的消息资源。这些文件由志愿者翻译成20多种语言,我是一名主要编辑代码的开发人员 在Java中,不同地区的资源文件按照命名约定分组在一起。例如,如果默认(通常为英语)资源是“foo.properties”,日语资源是“foo_ja.properties”,法语资源是“foo_fr.properties”,等等。为了解决这个问题,我们将这个组称为“资源组” 现在,我经常需要重构这些资源文件。此外,我需要该工具来支持属性文件的基础知识

我从事一个开源Java项目,我们有很多资源属性文件,其中包含可本地化的消息资源。这些文件由志愿者翻译成20多种语言,我是一名主要编辑代码的开发人员

在Java中,不同地区的资源文件按照命名约定分组在一起。例如,如果默认(通常为英语)资源是“foo.properties”,日语资源是“foo_ja.properties”,法语资源是“foo_fr.properties”,等等。为了解决这个问题,我们将这个组称为“资源组”

现在,我经常需要重构这些资源文件。此外,我需要该工具来支持属性文件的基础知识。总而言之,我的需求清单如下:

  • 重命名属性键名称,我需要一个工具来重命名同一组中所有文件中的所有键,而无需我单独查看它们
  • 将属性从一个资源组移动到另一个资源组,我需要一个工具来为组中的每个资源文件执行此操作
  • 在Java中,资源文件采用ISO-8859-1编码,而不是平台默认编码
  • 我不想在编辑/浏览属性文件时看到\uxxx,但我希望该工具能够保留它们
  • 我不想让工具重新排列资源文件中属性的顺序,也不想弄乱注释。我希望这个工具能保存它们
  • 我希望该工具能够处理资源文件的其他语法细节,例如多行文本
  • 不幸的是,我没有找到任何符合这些标准的好工具。我主要是IntelliJ IDEA的用户,但它不适用于第二和第三种情况。Eclipse内置的属性文件编辑器甚至更糟糕,而且它不能做到1、2、4。事实上,它缺少跨同一组中的资源文件的视图。NetBeans也很原始。NetBeans也是如此,尽管它是4


    有谁知道一个好的工具适合这个要求吗?

    我使用了eclipse插件。我觉得这个,

    可以,允许添加和重命名属性,如果属性未翻译为所有支持的语言,则显示警告等


    它的缺点是它总是对unicode字符使用“\uxxx”表示法。因此,您必须使用此插件读取创建的文件。这使得搜索非常困难。我不知道是否可以将其配置为创建UTF-8编码包

    (Eclipse插件)确实做到了4。其他任何事情都不需要它。

    事实证明IntelliJ应该能够做到#3(除非它在当前版本中不起作用)。因此,我只需要#2

    目前(对于手头的问题),我认为编写Groovy脚本比尝试这些工具要快:

    #!/usr/bin/env groovy
    // base name of the resource group to move a property from
    File base = new File(args[0])
    // key name of the property to move
    String from = args[1]
    // base name of the resource group to move the property to
    File dst  = new File(args[2])
    // name of the new property after move
    String to = args[3]
    
    /*
    TODO:
      support multi-line
      insert the text in a better place, in the sort order
    */
    
    base.parentFile.eachFileMatch(~"${base.name}(_.*)?\\.properties") { f ->
      def l = f.name.substring(base.name.length())
      println "${f}"
    
      def tmp = new File(f.path+".tmp")
    
      // delete this property from the source, and remember it
      def dropped = null;
      tmp.withWriter("iso-8859-1") { w ->
        f.filterLine(w,"iso-8859-1") { line ->
          if (line.startsWith(from)) {
            dropped = line;
            return false;
          } else {
            return true;
          }
        }
      }
      tmp.renameTo(f)
    
      if (dropped==null)    return; // nothing to copy to
    
      // append
      f = new File(dst.path+l)
      tmp = new File(f.path+".tmp")
      println "-> ${f}"
    
      existing = f.bytes
      needsLF = (existing[existing.length-1]!='\n')
    
      f.withWriterAppend("iso-8859-1") { w ->
        if (needsLF) w.write('\n')
        w.write(to+dropped.substring(from.length()))
        w.write('\n')
      }
    }
    
    此脚本是一种黑客行为,不理解属性文件语法,因此可靠性不高。但风投可以通过让你准确地看到脚本的作用来弥补这一缺点

    我仍然希望能找到一个好的工具,这样从长远来看我会更有效率。所以请继续回答

    我已经使用了一段时间,我认为它可以满足您的要求:

  • 可以通过更改表视图中的键列来完成
  • 可以通过复制键列来完成,键列将实际复制不同语言中的键和所有值,然后将其粘贴到不同的表视图中,从而将键和值插入到表视图的不同列中
  • 可以使用\uxxx对字符进行转义,但不确定是否仅对非ISO-8591-1字符或甚至对所有非US-ASCII字符进行转义
  • \uxxx将被编辑器解码并作为\uxxx写入文件
  • 属性的顺序没有改变,不确定它如何处理注释
  • 您可以输入多行文字,它将正确写入属性文件

  • 在这一点上,我想答案是Java中没有一个好的属性文件编辑器符合列出的标准。prbeditor听起来很有希望,但它已经不存在了,IntelliJ IDEA在纸上看起来不错,但遇到了一个严重的错误,然后Eclipse插件都有些原始。

    查看j18n 它可以满足您的需要,并引入资源继承,还为所有编辑提供版本控制。如果您仍在寻找此类插件,请签出:


    只缺少#6要求。

    查看在线工具POEditor。它基于项目。

    这是一个古老的工具,但却是一个很好的工具

    JRC编辑器:除了重新排序键(对它们进行排序)之外,它可以帮你做所有的事情,这可能不是你想要的。(可能是此功能可以关闭)


    虽然重新排序密钥可能不太好,但我发现当许多人在一个资源包上工作时,它非常有用。源代码管理工具,如SVN,有更好的机会合并已排序的资源包。

    +1对于这个伟大的问题和Kohsuke(我喜欢这个地方,到处都是摇滚明星!)(您可能知道)在Java6中,您可以在其他编码中使用属性文件。即将到来的Eclipse也支持这一点。所以您可以在UTF-8中拥有您的属性,并在Eclipse中很好地显示它们!彼得:你是说属性。加载(读卡器)?但是人们应该使用ResourceBundle来加载特定于语言环境的资源,我看不到有任何东西可以指定编码(我也看不到有必要这样做。)啊,你说得对。我有一个自定义资源包类,它使用properties加载属性。加载(读取器)方法:-(将语言文件保存在utf-8中对我们来说效果更好。Peter:+1。我很好奇为什么ResourceBundle的第一个版本选择iso-8859-1作为资源文件编码。utf-8会更明智。谢谢,但这一版本似乎不支持任何跨资源组中所有文件的重构。或者是吗?它仍然支持看起来比IntelliJ差多了。谢谢你的指点。