嫌らしいローカライズがされたディレクトリにアクセスする方法

主題
パスの途中に嫌らしい方法でローカライズされた名前のディレクトリある場合、そのディレクトリ中にあるディレクトリのパスを求める方法について述べる。

背景
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