我正在尝试设置查找器显示的彩色标签。我知道的唯一函数是setResourceValue。但这需要本地化的名称!
我可以想象我的母语和英语,但其他的我都不知道。我不能相信,这应该是这样的。
are translation函数,它接受一个标准参数,如枚举或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 = 0b00001111
func 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( { $0 == colorName } ).count > 0 {
colorMask |= UInt16(1<<bitNumber)
}
}
bitNumber += 1
}
}
} catch {
// process the error here
}
return colorMask
}
字符串
5条答案
按热度按时间jaql4c8m1#
要设置单一颜色,
setResourceValue
API调用确实是你应该使用的。但是,你应该使用的资源键是NSURLLabelNumberKey
,或者Swift 3中的URLResourceKey.labelNumberKey
(不是NSURLTagNamesKey
):字符串
(This是an answer to a related Objective-C question的Swift 3端口。在Xcode 8.1,macOS Sierra 10.12.1下测试)
要设置多个颜色,您可以使用API来设置资源值和标签键。这两种编码之间的区别如下所述:http://arstechnica.com/apple/2013/10/os-x-10-9/9/-基本上标签键是在内部设置扩展属性“com.apple.metadata:_kMDItemUserTags”,它将这些标签字符串的数组存储为二进制plist,而上面显示的单色选项是设置32字节长的扩展属性值“com.apple.FinderInfo”的第10个字节。
该密钥名称中的“localized”有点令人困惑,因为实际上使用它设置的是用户在用户设置的标签名称中选择的标签集。这些标签值确实是本地化的,但仅限于根据最初创建帐户时的本地化设置进行设置的范围。为了演示,这些是我的系统上的JavaScript使用的标签值,我将其设置为芬兰本地化作为测试,并重新启动JavaScript,重新启动机器等:
型
数据在二进制plist值中编码的方式只是最喜欢的标签名称,后面是数组中的索引(固定为长度8,实际值从1开始,即按照红色,橙子,黄色,绿色,蓝色,紫色,灰色的顺序匹配七种颜色)。例如:
型
因此,系统本地化没有被考虑在内,事实上,用任何字符串后跟一个换行符,后跟一个1-7之间的数字来设置标签,将以标签索引所指示的颜色显示在屏幕上。以了解要应用的正确当前值,从而从收藏夹标签集合中获取要应用的标签(这样颜色和标签都匹配)您需要从URL偏好中读取该键(来自域'com.apple.xml'的键'FavoriteTagNames',它编码了如上所示的那些最喜欢的标签名称的数组)。
忽略上述复杂的情况下,你想得到标签名称 * 和 * 颜色正确,需要阅读从浏览器首选项域(这可能是你做不到的,取决于你的应用是否是沙盒),如果你想使用多种颜色,这里有一个直接使用扩展属性值设置颜色的示例解决方案(我使用SOExtendedAttributes来避免接触笨拙的xattr C API):
型
jvlzgdj92#
由于新的
URLResourceValues()
结构体和标记号,我在不知道颜色名称的情况下就可以让它工作。知道这些标记号中的每一个表示标记颜色:
0无
1灰
2绿色
3紫色
4个蓝色
5黄色
6红
7橙子
创建文件的URL:
字符串
它必须是一个var,因为我们要让它变异。
创建一个新的
URLResourceValues
示例(也需要是一个变量):型
像这样设置标签编号:
型
最后,将标签写入文件:
型
在我们的示例中,我们将数字标记设置为2,因此现在该文件被标记为绿色。
shyt4zoc3#
历史
首先是我之前的答案,它适用于为文件设置 one 颜色标签:https://stackoverflow.com/a/39751001/2227743。
然后@mz2发布了这个优秀的答案,它成功地将 * 几个 * 颜色标签设置到一个文件中,并解释了这个过程:https://stackoverflow.com/a/40314367/2227743。
现在这个小插件,一个简单的后续@mz2的答案。
解决方案
我只是实现了@mz2的建议:我扩展了他的enum示例,使用方法获取用户的首选项,并在将属性设置到文件之前提取正确的本地化标签颜色名称。
字符串
使用方法:
型
x7yiwoj44#
NSWorkspace具有返回所有标签名称和颜色的函数:
https://developer.apple.com/documentation/appkit/nsworkspace/1527553-filelabelcolors
https://developer.apple.com/documentation/appkit/nsworkspace/1533953-filelabels的
qv7cva1a5#
截至2023年11月,* 检索 * 多个彩色标签的最佳方法是这样的:
字符串