【问题标题】:mac os x: get localized pathmac os x:获取本地化路径
【发布时间】:2017-09-19 20:25:33
【问题描述】:

我想检索 Mac OS X 上路径的本地化名称。 我从各种来源拼凑出以下代码。

我的 Mac 当前设置为法语区域设置,将法语设置为主要语言,重新启动,我将终端中的 LANG 环境变量重置为 fr_FR.UTF-8,但我似乎无法获取文件夹的本地化路径(例如 /Users/bll/Music)。语言环境似乎有效,本地化名称确实有效 出现在取景器中(音乐)。

我在这里错过了什么?

(我不是 Mac 程序员,也不是 Objective-c 程序员,不会说法语)。

编辑:使用当前代码更新,Info.plist 文件

(我确实了解嵌入 / 字符的显示名称的问题,只是目前不担心)。

代码:

#import "Foundation/NSObject.h"
#import "Foundation/NSFileManager.h"
#import "Foundation/NSProcessInfo.h"
#include <stdio.h>
#include <stdlib.h>
#include <MacTypes.h>

int
main (int argc, const char * argv[])
{
  NSFileManager  *fm = [NSFileManager defaultManager];
  NSString       *path = @"";;
  NSString       *npath = @"";
  NSArray        *npathcomp;
  NSUInteger     count;

  if (argc > 1) {
    NSArray *arguments = [[NSProcessInfo processInfo] arguments];
    path = arguments[1];
    npath = path;
    if (*argv[1] == '/') {
      npathcomp = [fm componentsToDisplayForPath:path];
      count = npathcomp.count - 1;
      npath = [[npathcomp subarrayWithRange:NSMakeRange (1,count)] 
          componentsJoinedByString:@"/"];
    }
  }
  printf ("/%s\n", [npath UTF8String]);
  return 0;
}

Info.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>CFBundleAllowMixedLocalizations</key>
  <true/>
  <key>CFBundleDictionaryVersion</key>
  <string>6.0</string>
  <key>CFBundleDisplayName</key>
  <string>localizeddirname</string>
  <key>CFBundleExecutable</key>
  <string>localizeddirname</string>
  <key>CFBundleGetInfoString</key>
  <string>Copyright 2017 Brad Lanam, Walnut Creek CA USA</string>
  <key>CFBundleIdentifier</key>
  <string>org.bdj.localizeddirname</string>
  <key>CFBundleName</key>
  <string>localizedirname</string>
  <key>CFBundlePackageType</key>
  <string>APPL</string>
  <key>CFBundleVersion</key>
  <string>1.0.0</string>
  <key>LSMinimumSystemVersion</key>
  <string>10.6.0</string>
</dict>
</plist>

编译:

cp -p localizeddirname.plist Info.plist
clang \
-v \
    -mmacosx-version-min=10.9 \
    -framework Cocoa \
    -o localizeddirname \
    -Wl,-sectcreate,__TEXT,__info_plist,Info.plist \
    localizeddirname.m
rm -f Info.plist

【问题讨论】:

  • 如果有帮助,无论用户设置什么语言,您都可以随时访问"/Users/bll/Music" 的音乐文件夹(翻译后的名称仅为方便用户显示,但目录路径不变) .看到这个post
  • 'displayNameAtPath' 返回应用支持的语言的本地化名称。比较 Xcode 和 TextEdit 的打开对话框。
  • "...对于您的应用支持的语言":如何更改程序以表明它支持所有语言?

标签: objective-c macos


【解决方案1】:

如 cmets 中所述,本地化名称仅适用于向用户显示。你不应该将它用于其他任何事情。

其次,显示路径不是连接路径上每个项目的显示名称的结果。如果你想要显示路径,你应该使用-[NSFileManager componentsToDisplayForPath:]。请注意,这会为您提供一组显示组件。

不适合将这些与斜杠 (/) 字符连接起来组成伪路径。这部分是因为显示名称可以包含斜杠,这与 Unix 级别的路径组件不同。 (在磁盘上,这些将存储为冒号 (:)。)显示组件应显示为单独的组件(如显示当前位置的弹出菜单、大纲类型列表或 NSPathControl)。如果您必须在一行中显示路径,我会用图形元素分隔组件,例如右向三角形图像(或从右到左语言的左指向)。

要允许您的工具从它不“支持”的语言环境的框架中检索本地化字符串,您需要 1) 在 __TEXT,__info_plist 部分中将 Info.plist 嵌入其中;和 2) 包括 CFBundleAllowMixedLocalizations 键,映射为布尔值 true。要嵌入 Info.plist 文件,请使用编译器选项 -Wl,-sectcreate,__TEXT,__info_plist,Info.plist。

【讨论】:

  • 我嵌入了一个 Info.plist 文件,但它仍然没有显示本地化名称。这是一个命令行程序,还有什么需要做的吗?
  • 编辑您的问题以显示您正在嵌入的 Info.plist 文件。还不如在您使用时显示您当前的代码。
  • 用当前代码、Info.plist、编译更新了问题。
  • 嗯。它适用于其他框架本地化字符串,但似乎不适用于此。
  • 我想这必须重写才能打开正确的 NIB 文件并进行所有查找。或者重写为没有窗口的 GUI 程序(我不知道,我会尝试第一个选项)。
猜你喜欢
  • 1970-01-01
  • 2015-03-20
  • 2012-01-19
  • 2016-04-11
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多