我正在编写一个脚本,将新的翻译添加到en.yml文件中。但是,当我将它们转储回文件时,我的字符串采用以下格式:
some_key: This is the value
我正在尝试输出:
some_key: "This is the value"
我正在写这样的翻译:
File.open(yaml_file, "w") do |f|
f.write(translations.to_yaml)
end
翻译是包含所有翻译的哈希。
除了手动解析/重写YAML文件外,还有什么方法可以添加这些引号吗?
答案 0 :(得分:5)
当标量类型不需要转义时,plan (unquotes) scalar representation是首选版本。
在您的情况下,字符串:
This is the value
不需要引号,因此,如果您提供以下YAML:
key: "This is the value"
处理器可能会返回:
key: This is the value
因为它们完全等同。但是,如果您确实要输入带引号的字符串作为值,则应使用:
key: '"This is the value"'
或逃避双引号:
key: "\"This is the value\""
我快速浏览了to_yaml
, def visit_Psych_Nodes_Scalar o
@handler.scalar o.value, o.anchor, o.tag, o.plain, o.quoted, o.style
end
调用的Psych emitter code,似乎没有强制引用标量的选项。
我甚至没有看到scalar emitter代码中实现的选项。
{{1}}
换句话说,您无法强制引用。
答案 1 :(得分:0)
更新了哈希转换
def value_stringify(hash)
hash.each do |k,v|
if v.kind_of? Hash
hash[k]= value_stringify(v)
else
hash[k]="\"#{v}\""
end
end
end
现在使用转换后的哈希来存储yaml。
File.open(yaml_file, "w") do |f|
f.write(value_stringify(translations).to_yaml)
end
现在它应该有用..
答案 2 :(得分:0)
您获得的格式是有效的YAML。但是,如果您真的想要这个,可以在转换之前暂时修改数据。
正常:
{ foo: "bar" }.to_yaml
# => foo: bar
后面有一个空格:
{ foo: "bar " }.to_yaml
# => foo: 'bar '
请注意,您会获得单引号而非双引号。因此,如果您临时修改数据,可以添加一个占位符,稍后将删除。
示例:
{ foo: "foo --REMOVE-- ", bar: "bar --REMOVE-- " }.to_yaml
.gsub(' --REMOVE-- ', '')
# => foo: 'foo'
# bar: 'bar'