2017-09-19 5 views
1

Mac OS Xでパスのローカライズされた名前を取得したい。 以下のコードをさまざまなソースから一緒に冠した。mac os x:ローカライズされたパスを取得

私のMacは現在フランス語のロケールに設定されており、フランス語を主言語に設定して再起動し、端末のLANG環境変数をfr_FR.UTF-8にリセットしていますが、フォルダ(例:/ Users/bll/Music)。ロケールが機能しているようですが、ローカライズされた名前はファインダー(Musique)に と表示されます。

私はここで何が欠けていますか?

(私はMacのプログラマーではなく、目的のプログラマーではなく、フランス語を話さないでください)。

編集:現在のコードで更新し、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 
+0

もしあなたが助けることができれば、ユーザーが設定した言語に関係なく、いつでも/ "/ Users/bll/Music"の音楽フォルダにアクセスできます(翻訳された名前は便宜上ユーザーに表示されますが、ディレクトリパスは変更なし)。 this [post](https://stackoverflow.com/a/28550564/4418092) – JMM

+0

'displayNameAtPath'は、アプリケーションがサポートする言語のローカライズされた名前を返します。 XcodeとTextEditの開いているダイアログを比較してください。 – Willeke

+0

"...あなたのアプリがサポートしている言語のためのもの":プログラムがすべての言語をサポートすることを示すためにプログラムを変更するには? –

答えて

1

コメント欄で述べたように、ローカライズされた名前は、ユーザへの表示のためにのみ適切です。他には使用しないでください。

第2に、表示パスはではなく、で、パス上の各アイテムの表示名を連結した結果になります。表示パスを使用する場合は、-[NSFileManager componentsToDisplayForPath:]を使用する必要があります。これは、表示コンポーネントの配列を提供することに注意してください。

スラッシュ(/)文字を連結して疑似パスを構成することは適切ではありません。これは、Unixレベルのパスコンポーネントとは異なり、表示名にスラッシュを含めることができるためです。ディスク上には、コロン(:)で保存されます。表示コンポーネントは、現在の場所を示すポップアップメニュー、アウトラインタイプのリスト、またはNSPathControlのように、別々のコンポーネントとして表示する必要があります。パスを1行で表示する必要がある場合は、コンポーネントを、右向きの三角形のイメージ(または右から左の言語の場合は左向き)などのグラフィカル要素で区切ります。

ローカライズされた文字列を、サポートしていないロケールのフレームワークから取得できるようにするには、1)Info.plistを__TEXT,__info_plistセクションに埋め込みます。 2)ブール値trueにマップされたCFBundleAllowMixedLocalizationsキーを含めます。 Info.plistファイルを埋め込むには、コンパイラオプション-Wl,-sectcreate,__TEXT,__info_plist,Info.plistを使用します。

+0

優れています。ポインタをありがとう。私はこれに取り組んでいきます。 –

+0

私は情報を埋め込んでいます。plistファイルが、まだローカライズされた名前を表示していません。これはコマンドラインプログラムです。何か別のことが必要ですか? –

+0

質問を編集して、埋め込んでいるInfo.plistファイルを表示してください。また、現在のコードを表示することもできます。 –