gpt4 book ai didi

java - 如何将Spotlight for Help插入Java中的本地化macOS应用程序中?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:20:07 24 4
gpt4 key购买 nike

我正在使用macOS上的Swing GUI框架实现Java应用程序。当使用系统外观和屏幕菜单栏时,Swing会自动将名为Spotlight for Help的搜索字段插入到框架菜单栏的第一个标有"Help"的菜单中:
Help menu with search feature

System.setProperty("apple.laf.useScreenMenuBar", "true");

try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}

JFrame frame = new JFrame();
JMenuBar menuBar = new JMenuBar();
JMenu helpMenu = new JMenu("Help");
menuBar.add(helpMenu);
frame.setJMenuBar(menuBar);
由于我的应用程序已本地化,因此英语字符串 "Help"在其他语言环境中也有所不同(例如法语中的 "Aide")。但是在那种情况下,Swing不会插入Spotlight for Help,因为字符串是不同的:
Help menu without search feature

最佳答案

解决方案

  • Bundle使用Oracle的Java Archive.class文件和应用程序的资源(图像,声音,视频,本地化文件等)放在.jar文件中。
  • Bundle使用Oracle的AppBundler(在Java 7+中,它替换了旧的Apple在Java 6中的JarBundler)中的.jar目录中的.app文件。
  • 将应用程序应支持的每个语言环境的.app目录添加到Contents/Resources/<locale>.lproj目录中(您可以让语言环境目录为空,因为本地化文件已经在.jar文件中了)。
  • 启动您的应用程序(双击Finder中的应用程序图标或在Terminal中键入open <application>.app)。

  • 搜索字段Spotlight for Help将会出现。
    解释
    我将做出一个猜测,那就是您正在直接执行 .class文件(例如,从IDE)或 .jar文件,因为据我所知这应该是可行的。
    尽管大多数消息人士都说过,但Swing根植于系统调用,因此依赖OS来实现许多功能,例如本例。理想情况下,这应该由 setHelpMenu(JMenu) 方法覆盖,但是您会注意到 this has never been implemented
    如果先检查,您会发现 JMenuBar 中没有添加任何额外的组件,您对此无能为力。如果您尝试使用AWT的 MenuBar 代替,则您会看到行为完全相同,尽管足够令人惊讶的是,实际上实现了 setHelpMenu(Menu) 方法,但是如果菜单命名的名称不同于 "Help",则不会添加搜索字段。
    在这一点上,我找到了一种解决方法,将菜单标签设置为 "Help",并在显示后(不要使用 ComponentListener.componentShown(ComponentEvent) ,这将不起作用,请使用 AncestorListener.ancestorAdded(AncestorEvent) )将菜单标签更改为本地化标签。这会将搜索字段添加到帮助菜单。但是,搜索字段将为英文,标签为 "Search"
    检查API,很明显,在Swing中,此功能是 not implemented,完全依赖于AWT。另一方面,AWT具有 partly implemented对操作系统的 native 调用,但 it's not wired to be invokable。达到这一点,并知道搜索字段确实出现在我们的应用程序中,并且在其他运行在Java中的应用程序中,它已经正确地本地化,这使我们暗示这是OS本身的一个特征(在这一点上我可能是错的,而且实际上是AWT所做的事情)肮脏的工作,但无法找到直接执行此工作的任何代码,尽管在Objective C中您可以定义任何代码)。
    阅读有关 how to localize a Java application in MacOS的文档时,我们注意到:
  • ,要求将应用程序捆绑在.app目录中,并包含Contents/Resources/<os-locale>.lproj目录,以便OS识别该应用程序支持的OS语言环境,因此需要一个标有OS本地化的"Help"字符串的菜单才能添加该菜单的OS本地化搜索字段;
  • 否则使用
  • ,操作系统会将应用程序视为本地化的en_US,因此需要一个标有en_US本地化的"Help"字符串的菜单,以便将en_US本地化的搜索字段添加到该菜单。

  • 现在,您可以在终端中键入 open <application>.app,您的应用程序将在OS本地化搜索字段添加到帮助菜单的情况下启动。
    请注意,Apple有其自己的机制来强制应用程序使用不同于操作系统语言环境的其他语言环境,并且它使用的是 -AppleLanguages选项( open <application>.app --args -AppleLanguages "(<locale>)")。 Language Switcher实用程序在后台执行相同的操作。同样,应该存在适当的 Contents/Resources/<locale>.lproj目录,否则操作系统会将应用程序视为本地化的 en_US
    从应用程序的 .app文件和资源(图像,声音,视频,本地化文件等)中如何 make an .class directory超出了此问题的范围,因为它取决于您所使用的平台,但是Oracle提供了 Java Archive(制作中间的 .jar文件)和 AppBundler(制作 .app目录)实用程序。
    截图

    在此屏幕快照中,操作系统已以西类牙语进行了本地化,但应用程序已以法语进行了本地化,因为它是使用 -AppleLanguages "(fr)"选项启动的。

    关于java - 如何将Spotlight for Help插入Java中的本地化macOS应用程序中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42620642/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com