
我可以想象我的母语和英语,但我不知道所有其他人.我不敢相信,这应该是这样的.
是翻译函数,它采用像enum或int这样的标准参数并提供本地化的颜色名称?
我有一个正在运行的部分,但只有两种语言(德语和英语):
let colornamesEN = [ "None","Gray","Green","Purple","Blue","Yellow","Red","Orange" ]let colornamesDE = [ "","Grau","Grün","lila","Blau","Gelb","Rot","Orange" ]public enum Tagcolors : Int8 { case None = -1,Gray,Green,Purple,Blue,Yellow,Red,Orange,Max}//let theURL : NSURL = NSURL.fileURLWithPath("/Users/dirk/documents/MyLOG.txt")extension NSURL { // e.g. theURL.setcolors(0b01010101) func tagcolorValue(tagcolor : Tagcolors) -> UInt16 { return 1 << UInt16(tagcolor.rawValue) } func addTagcolor(tagcolor : Tagcolors) -> Bool { let bits : UInt16 = tagcolorValue(tagcolor) | self.getTagcolors() return setTagcolors(bits) } func remTagcolor(tagcolor : Tagcolors) -> Bool { let bits : UInt16 = ~tagcolorValue(tagcolor) & self.getTagcolors() return setTagcolors(bits) } func setcolors(tagcolor : Tagcolors) -> Bool { let bits : UInt16 = tagcolorValue(tagcolor) return setTagcolors(bits) } func setTagcolors(colorMask : UInt16) -> Bool { // get string for all available and requested bits let arr = colorBitsToStrings(colorMask & (tagcolorValue(Tagcolors.Max)-1)) do { try self.setResourceValue(arr,forKey: NSURLTagnamesKey) return true } catch { print("Could not write to file \(self.absoluteURL)") return false } } func getTagcolors() -> UInt16 { return getAllTagcolors(self.absoluteURL) }}// let initialBits: UInt8 = 0b00001111func colorBitsToStrings(colorMask : UInt16) -> NSArray { // translate bits to (localized!) color names let countryCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)! // I don't kNow how to automate it for all languages possible!!!! let colornames = countryCode as! String == "de" ? colornamesDE : colornamesEN var tagArray = [String]() var bitNumber : Int = -1 // ignore first loop for colorname in colornames { if bitNumber >= 0 { if colorMask & UInt16(1<<bitNumber) > 0 { tagArray.append(colorname) } } bitNumber += 1 } return tagArray}func getAllTagcolors(file : NSURL) -> UInt16 { var colorMask : UInt16 = 0 // translate (localized!) color names to bits let countryCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)! // I don't kNow how to automate it for all languages possible!!!! let colornames = countryCode as! String == "de" ? colornamesDE : colornamesEN var bitNumber : Int = -1 // ignore first loop var Tags : AnyObject? do { try file.getResourceValue(&Tags,forKey: NSURLTagnamesKey) if Tags != nil { let tagArray = Tags as! [String] for colorname in colornames { if bitNumber >= 0 { // color name Listed? if tagArray.filter( { enum Labelcolors: Int { case none case gray case green case purple case blue case yellow case red case orange func label(using List: [String] = []) -> String? { if List.isEmpty || List.count < 7 { switch self { case .none: return nil case .gray: return "Gray\n1" case .green: return "Green\n2" case .purple: return "Purple\n3" case .blue: return "Blue\n4" case .yellow: return "Yellow\n5" case .red: return "Red\n6" case .orange: return "Orange\n7" } } else { switch self { case .none: return nil case .gray: return List[0] case .green: return List[1] case .purple: return List[2] case .blue: return List[3] case .yellow: return List[4] case .red: return List[5] case .orange: return List[6] } } } static func set(colors: [Labelcolors],to url: URL,using List: [String] = []) throws { // 'setExtendedAttributeData' is part of https://github.com/billgarrison/SOExtendedAttributes try (url as NSURL).setExtendedAttributeData(propertyListData(labels: colors,using: List),name: "com.apple.Metadata:_kMDItemUserTags") } static func propertyListData(labels: [Labelcolors],using List: [String] = []) throws -> Data { let labelStrings = labels.flatMap { do { // default English label names try Labelcolors.set(colors: [.yellow,.red],to: fileURL) // localized label names let List = Labelcolors.localizedLabelnames() try Labelcolors.set(colors: [.green,.blue],to: fileURL,using: List)} catch { print("Error when setting label color(s): \(error)")}.label(using: List) } return try PropertyListSerialization.data(fromPropertyList: labelStrings,format: .binary,options: 0) } static func localizedLabelnames() -> [String] { // this doesn't work if the app is SandBoxed: // the users would have to point to the file themselves with NSOpenPanel let url = URL(fileURLWithPath: "\(NSHomeDirectory())/library/SyncedPreferences/com.apple.finder.pList") let keyPath = "values.FinderTagDict.value.FinderTags" if let d = try? Data(contentsOf: url) { if let pList = try? PropertyListSerialization.propertyList(from: d,options: [],format: nil),let pdict = pList as? NSDictionary,let fTags = pdict.value(forKeyPath: keyPath) as? [[AnyHashable: Any]] { var List = [(Int,String)]() // with '.count == 2' we ignore non-system labels for item in fTags where item.values.count == 2 { if let name = item["n"] as? String,let number = item["l"] as? Int { List.append((number,name)) } } return List.sorted { .0 < .0 }.map { "\(.1)\n\(.0)" } } } return [] }} == colorname } ).count > 0 { colorMask |= UInt16(1<<bitNumber) } } bitNumber += 1 } } } catch { // process the error here } return colorMask} 历史 首先是我之前的答案,它适用于将一个颜色标签设置为文件:https://stackoverflow.com/a/39751001/2227743.
然后@mz2发布了这个优秀的答案,成功地为文件设置了几个颜色标签并解释了这个过程:https://stackoverflow.com/a/40314367/2227743.
现在这个小插件,一个简单的follow-up到@ mz2的答案.
解
我只是简单地实现了@ mz2的建议:我已经使用获取Finder首选项的方法扩展了他的枚举示例,并在将属性设置到文件之前提取了正确的本地化标签颜色名称.
用法:
总结以上是内存溢出为你收集整理的Swift 3:设置Finder标签颜色全部内容,希望文章能够帮你解决Swift 3:设置Finder标签颜色所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)