有没有一种工具可以对本地化字符串文件进行差异/合并/排序?

23

用于苹果/ iPhone 应用程序本地化的本地化字符串文件具有以下格式:

/* 评论 */
"KEY" = "VALUE"

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

例如:

/* 将当前文档制作成纯文本的菜单项 */
"Make Plain Text" = "Make Plain Text";
/* 将当前文档转换为富文本的菜单项 */
"Make Rich Text" = "Make Rich Text";

我想对两个字符串文件进行差异/合并,可选择对这种类型的文件进行排序。如果在进行这些操作时保留注释就更好了。

这种格式相当简单,我可以编写一个Python脚本来完成,但如果有人已经完成了,请不要重复造轮子;)

您知道有哪个工具可以操纵字符串文件吗?

6个回答

28

在开发过程中,我迫切需要找到一种管理 Localized.strings 的良好方法,当代码中添加新的字符串时,不想手动管理所有文件。

我发现了一个名为Localization Manager的工具,它非常擅长这个。虽然没有文档说明,但它配备了一个独立的翻译程序。它会导入您的字符串,跟踪更改并将所需的 Localization.strings 文件导出回您的项目。

目前似乎是免费软件。


1
本地化管理器太棒了!这是我噩梦的终结!当这个工具比 diffstring 脚本做得更好一千倍时,它怎么能成为被接受的解决方案呢? - Martin
2
我不明白的是,为什么这个网站甚至没有提到如何使用它?那个页面上没有任何信息,而且有很多不同的文件可供下载。真是一个奇怪的项目。 - dontWatchMyProfile
一旦你理解了它,它就很棒! - Sandro Meier
3
这个应用无法在 Lion 或 SL 上运行。是否有指南我需要/可以遵循?还有人在使用这个应用吗?@Martin - Schoob

7

如我在这篇文章中所说的那样,我最近在Mac应用商店上找到了一个名为Localizable Strings Merge的免费应用程序。它完全满足您的要求,包括排序和美化。而且它是免费的。希望能对您有所帮助。


非常实用且简单,值得使用,可以节省很多时间。 - DreamOfMirrors
1
不再免费了,但无论如何我仍然觉得它非常有用。 - ivanzoid

2
我从 Three20项目 中找到了这个工具:

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

它以我最初想象的不同方式满足了我的需求: 它可以区分主要语言环境和其他语言环境,以查看每个语言环境中需要翻译的内容。 然后合并已翻译的字符串。
请注意,它会输出XML文件以提供给翻译人员。

有没有关于如何使用diffstrings.py的文档?我一直遇到错误:Traceback (most recent call last): File "diffstrings.py", line 656, in <module> main() File "diffstrings.py", line 638, in main projects = list(openProjects(projectPaths, options.locale)) ...等等。这个工具似乎非常有价值;只是我不太了解Python,无法弄清楚出了什么问题。(甚至要传递的参数似乎很神秘。"源文件?"哪些源文件?)任何帮助都将不胜感激。 - Greg Maletic
由于答案中的链接似乎是404:https://github.com/alunny/three20/blob/master/diffstrings.py - Isaac

0

丑陋但有效

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;
}

0

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   |
+----+---------+---------+-------------+---------+

-4
你可以尝试使用 /Developer/Applications/Utilities/FileMerge.app。那通常是一个好的开始。此外,你应该尝试 genstrings

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接