html - 使用 Cocoa Webkit 进行国际化显示前修改 HTML 的方法

标签 html objective-c macos cocoa webkit

在 Objective C 中构建 Mac OSX (Cocoa) 应用程序时,我使用 native Webkit 小部件来显示具有 file:// URL 的本地文件,从以下文件夹中提取:

MyApp.app/Contents/Resources/lang/en/html 

这一切都很好直到我开始需要德语版本。这意味着我必须将 en/html 复制为 de/html,然后让人替换 HTML 中的措辞(并且有些在 Javascript 中(比如模态对话框))带有德语短语。这是相当大量的工作!

好吧,这似乎是可行的,直到这引起了我的头痛,我必须为我需要支持的每种语言不断维护 html 文件夹的多个版本。

然后我就想到了......

Why not just replace the phrasing with template tags like %CONTINUE% and then, before the page is rendered, intercept it and swap it out with strings pulled from a language plist file?

  1. 通过此小部件的某些 API,是否可以在渲染 HTML 之前拦截 HTML 并替换文本?

  2. 如果可能的话,会不会明显慢到不值得?

  3. 或者,您是否建议我采取一种策略,在我的工作站上构建一个生成器,该生成器从主模板为我构建每个 HTML 文件夹,然后部署那些已通过我的设置完成的文件夹一旦我从设置应用程序确定用户的语言,应用程序?

最佳答案

通过大量实验,我发现了一种丑陋的模板制作方法。就像我说的,这是不可取的,并且有一些副作用:

  • 您将在第一个窗口加载时看到闪烁。首次加载具有 WebKit 小部件的应用程序窗口时,您需要隐藏该窗口,直到第二次显示页面内容。我猜你必须为此使用一个属性。

  • 导航时,每个页面都会加载两次。它几乎不引人注目,但还不足以实现良好的开发。

  • 我发现 Bootstrap CSS 有一个奇怪的怪癖,它使我的表格网格行非常大,并且由于某些奇怪的原因没有正确应用 CSS。我也许可以调整 CSS 来解决这个问题。

不幸的是,除了 didFinishLoadForFrame 之外,我没有发现其他可以拦截的事件。然而,到那时,页面已经下载并呈现至少一次,持续一微秒。在此之前拦截一些事件会很棒,我有完整的 HTML,并在显示之前进行交换。我没有找到这样的事件。然而,如果有人发现这样的事件——这可能会成为一个很好的模板解决方案。

- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
{
    DOMHTMLElement * htmlNode =
        (DOMHTMLElement *) [[[frame DOMDocument] getElementsByTagName: @"html"] item: 0];
    NSString *s = [htmlNode outerHTML];
        if ([s containsString:@"<!-- processed -->"]) {
            return;
        }
        NSURL *oBaseURL = [[[frame dataSource] request] URL];
        s = [s stringByReplacingOccurrencesOfString:@"%EXAMPLE%" withString:@"ZZZ"];
        s = [s stringByReplacingOccurrencesOfString:@"</head>" withString:@"<!-- processed -->\n</head>"];
        [frame loadHTMLString:s baseURL:oBaseURL];

}

上面的代码将查看包含 %EXAMPLE% 的 HTML,并将其替换为 ZZZ

最后,我意识到由于页面闪存的原因,这是低效的,并且,在需要大量替换的长文本上,可能会有一些相当明显的延迟。更好的方法是创建一个编译时生成器。这将创建一个 HTML 文件夹,其中包含 %PARAMETERIZED_TAGS% 而不是英文文本。然后,在“构建阶段”中创建一个“运行脚本”,运行您以任何语言创建的程序/脚本,从目录中所有可用的 lang-XX.plist 文件生成每个 HTML 文件夹,其中 XX是语言代码,如“en”、“de”等。它读取 HTML 文件,在 lang-XX.plist 文件中查找参数化标记匹配,然后将该文本替换为该语言的文本。这样,编译后,每种语言都会有多个 HTML 文件夹,并且已经在使用翻译后的字符串。这是高效的,因为它允许您在一个 HTML 文件夹中处理代码,而不必执行以每种语言创建每个 HTML 文件夹的极其繁琐的过程,也不必维护这种困惑。编译时生成器会为你做这件事。但是 - 您必须构建编译时生成器。

关于html - 使用 Cocoa Webkit 进行国际化显示前修改 HTML 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35121259/

相关文章:

javascript - 如何在禁用 JavaScript 时隐藏部分 HTML?

objective-c - 在 objective-c 中转义 %

swift - 快速创建空文件

ruby-on-rails - ruby on rails 无法在 os x mountain lion 上启动服务器

macos - 有没有办法知道 shell/终端命令/应用程序的选项?

html - 如何使用 CSS3 Transition 使图像独立于周围的元素移动?

html - 如何找到未关闭的div标签

php - 表格不显示空记录

iphone - iPhone 中可以添加多少条记录?

iphone - 如何更改 UIImagePickerController 导航栏上的按钮颜色?