【问题标题】:Is there a tool to diff/merge/sort localizable strings files?是否有工具来区分/合并/排序可本地化的字符串文件?
【发布时间】:2010-12-13 22:07:07
【问题描述】:

用于 Apple/iPhone 应用本地化的可本地化字符串文件具有以下格式:

/*评论*/
"键" = "值"

请注意,KEY 在给定的 strings 文件中是唯一的。
COMMENT 是可选的,但它可以帮助翻译人员提供一些额外的信息。

例子:

/* 使当前文档变成纯文本的菜单项 */ "制作纯文本" = "制作纯文本"; /* 使当前文档变为富文本的菜单项 */ "制作富文本" = "制作富文本";

我想区分/合并两个字符串文件,并可选择对此类文件进行排序。 如果在执行这些操作时保留 cmets,那就太好了。

格式非常简单,我可以编写一个 python 脚本来执行此操作,但如果有人已经这样做了,我不想重新发明轮子;)

你知道可以操作字符串文件的工具吗?

【问题讨论】:

    标签: iphone macos scripting localization string


    【解决方案1】:

    你可以试试/Developer/Applications/Utilities/FileMerge.app。这总是一个好的开始。另外,你应该试试genstrings

    【讨论】:

      【解决方案2】:

      我从Three20 project找到了这个工具:

      http://github.com/facebook/three20/blob/master/diffstrings.py

      它以与我想象不同的方式满足了我最初的需求:
      它可以区分主要语言环境和其他语言环境,以查看需要在其他语言环境中翻译的内容。 然后将翻译后的字符串合并回来。

      请注意,它会输出 xml 文件以提供给翻译人员。

      【讨论】:

      • 是否有关于如何使用 diffstrings.py 的文档?我不断收到错误: Traceback(最近一次调用最后一次):文件“diffstrings.py”,第 656 行,在 main() 文件“diffstrings.py”,第 638 行,在 main projects = list(openProjects(projectPaths , options.locale)) ...等等。这个工具似乎非常有价值。我只是对 Python 了解得不够多,无法弄清楚出了什么问题。 (即使是作为路径传递的参数似乎也很神秘。“源文件?”哪些源文件?)任何帮助将不胜感激。
      • 因为答案中的链接似乎是 404:github.com/alunny/three20/blob/master/diffstrings.py
      【解决方案3】:

      当代码中添加了新字符串并且您不想手动管理所有文件时,我迫切希望找到一种体面的方法来管理 Localized.strings

      我发现 Localization Manager 做得很好。它有一个不存在的文档,但带有一个单独的翻译程序。它会导入您的字符串、跟踪更改并将所需的 Localization.strings 文件导出回您的项目。

      到目前为止,它似乎是免费软件。

      【讨论】:

      • 本地化管理器很棒!我的噩梦结束了!当这个工具的性能提高 1000 倍时,diffstring 脚本怎么能成为这里公认的解决方案!?
      • 我不明白的是,为什么这个网站甚至没有提到如何使用它?该页面上的信息为零,并且需要下载许多不同的文件。真是奇怪的项目。
      • 一旦你明白了,那就太好了!
      • 我无法让这个应用程序在 Lion 或 SL 上运行。我需要/可以遵循一些指南吗?有人还在用这个应用吗? @马丁
      【解决方案4】:

      就像我在this post 中所说的那样,我最近在 Mac App Store 上发现了一个名为 Localizable Strings Merge 的免费应用程序。它完全按照您的要求进行,甚至是排序/美化。它是免费的。希望对您有所帮助。

      【讨论】:

      • 非常好用又简单,值得一用,节省不少时间。
      • 不再免费,但无论如何我觉得它非常有用。
      【解决方案5】:

      丑陋但有效

      int main(int argc, const char * argv[])
      {
          @autoreleasepool {
              NSString* f1 = [NSString stringWithCString:argv[1] encoding:NSUTF8StringEncoding];
              NSString* f2 = [NSString stringWithCString:argv[2] encoding:NSUTF8StringEncoding];
      
              //
      
              NSLog(@" Comparing %@ to %@\n", f1, f2);
      
              //
      
              NSError* error;
              if ( [f1 hasPrefix:@"~"] ) {
                  f1 = [f1 stringByReplacingOccurrencesOfString:@"~" withString:NSHomeDirectory()];
              }
              if ( [f2 hasPrefix:@"~"] ) {
                  f2 = [f2 stringByReplacingOccurrencesOfString:@"~" withString:NSHomeDirectory()];
              }
      
              NSStringEncoding encoding;
              NSString* f1Content = [NSString stringWithContentsOfFile:f1 usedEncoding:&encoding error:&error];
              NSString* f2Content = [NSString stringWithContentsOfFile:f2 usedEncoding:&encoding error:&error];
      
              //
      
              NSArray* f1Strings = [f1Content componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];
              NSArray* f2Strings = [f2Content componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];
      
              for (NSString* keyString in f1Strings) {
                  NSString* trimKey = [keyString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
                  if ( !trimKey || [trimKey isEqualToString:@""] )
                      continue;
      
                  NSString* key = [keyString componentsSeparatedByString:@" = "][0];
      
                  BOOL found = NO;
                  for (NSString* keyString2 in f2Strings) {
                      if ( [keyString2 hasPrefix:key] ) {
                          found = YES;
                          break;
                      }
                  }
      
                  if ( !found ) {
                      printf("%s\n\n", [keyString UTF8String]);
                  }
              }
          }
          return 0;
      }
      

      【讨论】:

        【解决方案6】:

        https://github.com/luckytianyiyan/TyStrings

        $ tystrings diff diff1.strings diff2.strings
        
        >>> Parsing File1 Reference...
        >>> Parsing File2 Reference...
        >>> Comparing...
        +----+---------+---------+-------------+---------+
        |    | File1   | File2   | Key         | Value   |
        |----+---------+---------+-------------+---------|
        | +  | 2       |         | diff.test.0 | Test0   |
        | -  |         | 2       | diff.test.0 | Test    |
        | -  |         | 5       | diff.test.4 | Test4   |
        | +  | 8       |         | diff.test.2 | Test2   |
        | -  |         | 11      | diff.test.3 | Test3   |
        +----+---------+---------+-------------+---------+
        

        【讨论】:

          猜你喜欢
          • 2020-05-14
          • 2011-03-09
          • 1970-01-01
          • 2023-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-26
          相关资源
          最近更新 更多