嫌らしいローカライズがされたディレクトリにアクセスする方法
主題
パスの途中に嫌らしい方法でローカライズされた名前のディレクトリある場合、そのディレクトリ中にあるディレクトリのパスを求める方法について述べる。
背景
macOS 10.15.x CatalinaからiTunesに代わって登場したミュージック.appだが、そのライブラリ等が含まれるフォルダ名が、従来のフォルダ名.localized
ではない方法で、ローカライズされている。
見かけ上はフォルダ名.localized
と同じだが、ターミナル.appなどで確認すると、異なっている事が分かる。
これは、開発者にとって厄介である。このタイプのローカライズが行われたディレクトリにアクセスする必要があった場合、対応する言語分の切り替え、すなわち、
// Get OS language code
let langStr = Locale.current.languageCode
var localizedMusic: String
switch langStr {
case "en":
localizedMusic = "Music"
case "de":
localizedMusic = "Musik"
case "fr":
localizedMusic = "Musique"
case "it":
localizedMusic = "Musica"
case "ja":
localizedMusic = "ミュージック"
case "zh":
localizedMusic = "音乐"
case "ko":
localizedMusic = "음악"
default:
localizedMusic = "Music"
}
のようなswitch-case文を用意するとなると、キリがない。その上、コード内部にローカライズ対応を書くことになり、望ましくない。そこで、パス中にこういうローカライズがあった場合にも対応できる方法が望まれることになる。
対策
具体的にはFileManagerの機能の一つであるsubpathsOfDirectory(atPath:)を用いる。(求めるパスがファイルの場合はsubpaths(atPath:)でも良い。)
次の関数getTargetDirectory()
は、ホームディレクトリのミュージックディレクトリに作られたミュージックに自動的に追加
フォルダのパスを、そのパスストリングにどの言語があっても取り出すことができる。
func getTargetDirectory() -> String {
let musicDirectory = NSHomeDirectory() + "/Music"
// FileManagerを用いてサブディレクトリを含めたディレクトリリスティングを取得
guard let pathes = try?
FileManager.default.subpathsOfDirectory(atPath:
musicDirectory) else {
return ""
}
var testDirectory:String
var targetDirectory:String = ""
for aPath in pathes {
// ラストパスコンポーネントにより、求めるべきディレクトリを抽出
testDirectory = (NSString(string: aPath)).lastPathComponent
if (testDirectory == "Automatically Add to Music.localized") {
targetDirectory = (musicDirectory + "/" + aPath)
break
}
}
return targetDirectory
}
以上。
この投稿へのトラックバック
トラックバックはありません。
- トラックバック URL
この投稿へのコメント