我的 OSX 应用程序无法检测 RTL 语言

tru*_*ong 1 macos objective-c internationalization

我正在开发一个 UI 非常少的 OSX 应用程序。对于内部化/本地化,我使用了一个 3rd 方库来用适当的语言替换我的所有文本(我使用 [NSLocale preferredLanguages] 检测语言)。问题是我的 NSAlert 总是以从左到右的方向显示其内容(包括文本、按钮布局...),即使我将系统语言切换为阿拉伯语。

从我的研究来看,NSAlert 似乎应该自动正确地切换方向(尽管没有明确说明的地方)。我也检查这个

NSUserInterfaceLayoutDirection direction = [NSApplication sharedApplication].userInterfaceLayoutDirection;
Run Code Online (Sandbox Code Playgroud)

并且direction总是(即使在系统语言设置为阿拉伯语的情况下),等于 NSUserInterfaceLayoutDirection::NSUserInterfaceLayoutDirectionLeftToRight. 我怀疑这是问题所在,但不太知道如何解决这个问题。

任何人都知道如何:

  • 确保 NSApplication 知道正确的布局方向?

或者

  • 确保 NSAlert 以正确的方向显示(尤其是在 RLF 语言中)?

笔记:

https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPInternational/Introduction/Introduction.html#//apple_ref/doc/uid/10000171i-CH1-SW1

它仍然没有帮助,因为为了添加对语言的支持,本指南似乎要求我有 xib 或故事板文件。我的项目恰好没有这些。

谢谢大家。

Wil*_*eke 5

为了支持阿拉伯语,应用程序内 Resources 文件夹中的空 ar-001.lproj 文件夹就可以了。

如果您不想为每种语言添加文件夹,您可以通过调用强制从右向左书写方向

[[NSUserDefaults standardUserDefaults] setObject:@"YES" forKey:@"AppleTextDirection"];
[[NSUserDefaults standardUserDefaults] setObject:@"YES" forKey:@"NSForceRightToLeftWritingDirection"];
Run Code Online (Sandbox Code Playgroud)

并切换回从左到右

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"AppleTextDirection"];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"NSForceRightToLeftWritingDirection"];
Run Code Online (Sandbox Code Playgroud)