每次我们从不同的分支机构更改 .strings 文件(用于iOS本地化)时,我们都会遇到冲突。
原因似乎是git将 .strings 视为二进制文件而不是文本文件。有时它有点烦人,因为git不会自动帮助合并更改,因为它们被认为是二进制格式。
是否有任何git设置会强制它将文件视为文本文件。
我注意到SourceTree和GitLab都无法告诉它是文本文件。但XCode本身将能够向我们展示差异。不确定这是否相关。
答案 0 :(得分:13)
答案 1 :(得分:10)
在尝试Jonathan或Slawomir的解决方案后,我仍然无法正确看到差异。它们仍被视为二进制文件。
我终于弄清楚我们的 localizable.strings 文件不是UTF-8编码,而是UTF-16编码。将编码更改回UTF-8后,它可以正常工作。
是否可以更改编码?是的。 Apple实际上建议使用UTF-8。
注意:建议您使用UTF-8编码保存字符串文件,这是标准字符串文件的默认编码。当它们被复制到产品中时,Xcode会自动将字符串文件从UTF-8转码为UTF-16。
你怎么知道该文件的编码是什么?有关命令行,请参阅this,对于Xcode,请参阅this:
file -I vol34.tex
请参阅下面的评论,您可能需要手动更改文件的编码:
iconv -f UTF-16 -t UTF8 file.strings
答案 2 :(得分:4)
这些解决方案都不适合我,因此我做了更多研究,在this link我发现了这一点:
在项目主目录中,创建或编辑.gitattributes文件,并添加以下行:
<!DOCTYPE html>
<html>
<body>
<script>
var SpeechRecognition = SpeechRecognition || webkitSpeechRecognition;
var SpeechGrammarList = SpeechGrammarList || webkitSpeechGrammarList;
var SpeechRecognitionEvent = SpeechRecognitionEvent || webkitSpeechRecognitionEvent;
var grammar = '#JSGF V1.0; import <com.sun.speech.app.numbers.*>; grammar numbers; public <number> = <com.sun.speech.app.numbers.*>;'
var recognition = new SpeechRecognition();
var speechRecognitionList = new SpeechGrammarList();
speechRecognitionList.addFromString(grammar, 1);
recognition.grammars = speechRecognitionList;
//recognition.continuous = false;
recognition.lang = 'en-US';
recognition.interimResults = true;
recognition.maxAlternatives = 1;
recognition.onerror = function(event) {
console.log(event.error);
};
document.body.onclick = function() {
recognition.start();
console.log('Ready to receive a number command.');
};
recognition.onresult = function(event) {
var numbers = ['zero', 'one', 'two'];
console.log(event.results);
var last = event.results.length - 1;
var number = event.results[last][0].transcript;
console.log(numbers[number]);
var node = document.querySelector("#" + numbers[number]);
if (node) {
node.style.color = 'red';
}
};
</script>
<div id="one">one</div>
<div id="two">two</div>
</body>
</html>
在主目录的.gitconfig文件中,添加以下行:
*.strings diff=localizablestrings
这成功了。
答案 3 :(得分:1)
请在项目根目录文件.gitattributes
中添加内容:
*.strings text
现在,git会将您的文件.strings
识别为文本文件。
答案 4 :(得分:1)
这是我在Mac上使用的脚本的变体。我需要将所有.strings
文件转换为utf-8编码,包括其中某些文件已经在utf-8中的事实。从放置您的*.lproj
目录的文件夹中运行它。
STRING_FILES=$(find . -type f -name '*.strings')
for f in $STRING_FILES; do
ENCODING=$(file -I $f)
if [[ $ENCODING == *"utf-16le"* ]]; then
iconv -f UTF-16 -t UTF8 $f > $f.1;
mv -f $f.1 $f
fi
done
这个想法是从钟雨辰的答案中提取的
答案 5 :(得分:0)
我注意到SourceTree
不能只区分英语本地化文件,其他都可以。因此,似乎只有该文件有问题。
我已经用其他一些随机的Localized.strings
文件替换了英语文件,这些文件SourceTree
可以,SourceTree
复制了英语翻译,提交并确认-{{1} }。
请记住,由于必须将固定值与固定值进行比较,因此必须提交并查看其是否有效。
答案 6 :(得分:0)
我发现执行此操作的最佳方法是使用iconv转换为UTF8,其他内容不适用于在github中查看差异。
iconv -f utf-16 -t utf-8 path/to/localization/en.lproj/Localizable.strings > temp.strings
mv temp.strings path/to/localization/en.lproj/Localizable.strings > temp.strings
然后提交并合并您的更改。 后续差异将正确显示。
答案 7 :(得分:0)
按照此页面上的说明进行操作 https://gist.github.com/asmallteapot/11227602
您不必将 .strings 文件转换为 UTF-8