cocoa - 基于 Cocoa 的 Mac OS X 应用程序面临国际化 MainMenu.xib 问题

标签 cocoa internationalization nsundomanager

我正在从事一个基于 Cocoa 的 Mac OS X 项目,并面临一个国际化 MainMenu.xib 的问题。

在菜单项中,所有标题都需要以编程方式国际化。除撤消和重做菜单项标题外,所有菜单项(如“剪切”、“复制”、“粘贴”)都可以使用 setTitle 国际化。除此之外,在项目表单的文本字段中输入任何内容后,撤消菜单项标题会动态更改为“撤消键入”。 “重做”也会发生同样的情况。

我可以使用设置其他菜单的标题和菜单项的标题,

[[[[NSApp mainMenu] itemAtIndex:1] submenu]setTitle:@"Edit_Test"] 

对于 MainMenu.xib“编辑”菜单,类似地,

[[[[[NSApp mainMenu] itemAtIndex:1] submenu]itemAtIndex:4]setTitle:@"Copy_Test"] 

对于位于“编辑”菜单下的 NSMenuItem“复制”。

但是如果我使用同一段代码,

  [[[[[NSApp mainMenu] itemAtIndex:1] submenu]itemAtIndex:0]setTitle:@"Undo_Test"] 

menuItem 标题仍保留为“Undo”

NSUndoManager 提供了 undoMenuItemTitle 和 redoMenuItemTitle 方法,但 NSUndoManager 不会向“Undo”和“Redo”菜单项发送 -setTitle: 消息。

那么我如何跟踪标题的动态变化并使“撤消键入”也国际化?

是否可以手动获取 MainMenu.xib 的第一响应者并从中获取 undomanager 对象?这样我就可以使用撤消菜单项解除第一响应程序中当前存在的撤消操作的绑定(bind),并手动执行撤消操作,或者是否可以仅以编程方式更改标题而不执行所有这些操作。

如果有人遇到过此问题并解决了该问题,请告诉我。

最佳答案

创建 NSUndoManager 的子类并覆盖 the undoMenuTitleForUndoActionName: methodthe redoMenuTitleForUndoActionName: method 。为需要撤消管理器的每个文档(或托管对象上下文或其他事物)创建此子类的实例。

关于cocoa - 基于 Cocoa 的 Mac OS X 应用程序面临国际化 MainMenu.xib 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8707861/

相关文章:

xcode - 如何强制应用程序以隐藏模式启动? (Mac 登录应用程序)

java - messages.properties 取自数据库

django - 我如何知道 Django 忽略 Accept-Language header 的原因?

iphone - 如何在附加的 C 数组中正确释放内存?

cocoa - 在 NSOutlineView 中显示行颜色?

sql - 使用 JPA/Hibernate 进行国际化的最优雅的解决方案?

objective-c - 难以实现 NSUndoManager 重做功能

iphone - 撤消在 View Controller 中所做的所有更改

ios - Xcode LLDB 打印语句失败 - NSUndoManager

macos - 无法使用 GCD 函数调用进行编译