我在 Android Studio 中收到有关未翻译字符串的警告 - 它告诉我它们尚未翻译成英语。这似乎是因为我有一个“en-rGB”资源文件夹。但是我尝试按照 lint 中的说明指定默认语言,但这并没有奏效。
我有以下 strings.xml 文件:
values/strings.xml:
<resources xmlns:tools="http://schemas.android.com/tools"
tools:locale="en">
<string name="string1">Howdy</string>
<string name="string2">Howdy</string>
</resources>
Run Code Online (Sandbox Code Playgroud)
values-en-rGB/strings.xml:
<resources>
<string name="string1">Hello</string>
</resources>
Run Code Online (Sandbox Code Playgroud)
values-fr/strings.xml:
<resources>
<string name="string1">Bonjour</string>
<string name="string2">Bonjour</string>
</resources>
Run Code Online (Sandbox Code Playgroud)
values-fr-rCA/strings.xml:
<resources>
<string name="string2">Bonjour</string>
</resources>
Run Code Online (Sandbox Code Playgroud)
预期结果:应该没有警告,两个字符串都被翻译成英文和法文
实际结果:Lint 会警告 string2,说它没有翻译成英文。
请注意,我已经包含了 fr-rCA 以表明它不是区域性的东西。令人高兴的是,只要将其翻译为“未区域化”的法语,它也不需要翻译为加拿大法语。在这种情况下,它不会警告 string1,即使它没有被翻译成加拿大法语,因为它已经被翻译成法语。
我无法将主资源文件夹更改为英文 ( values-en),因为这会导致没有默认资源的错误。这是真的。
我一般不想取消警告,因为我计划添加其他语言,并且我确实希望对未翻译成我包含的其他语言的字符串显示警告。
我所追求的是将默认语言通知 lint 的正确方法。我已按照“翻译不完整”警告的说明进行了操作:
您可以通过为资源文件中的根元素指定 tools:locale="languageCode" 来告诉 lint(和其他工具)哪种语言是您的 res/values/ 文件夹中的默认语言。(工具前缀指的是命名空间声明 http://schemas.android.com/tools。)
但这似乎不起作用。是我做错了,还是 lint 的问题?
我们有通过串行(蓝牙)传入的数据,它映射到特定的结构。该结构的某些部分是子字节大小,因此“显而易见”的解决方案是将传入数据映射到位字段。我无法确定的是机器或编译器的位字节顺序是否会影响它(这很难测试),以及我是否应该完全放弃位字段。
例如,我们有一条1.5字节的数据,所以我们使用结构体:
{
uint8_t data1; // lsb
uint8_t data2:4; // msb
uint8_t reserved:4;
} Data;
Run Code Online (Sandbox Code Playgroud)
保留位始终为 1
例如,如果传入的数据是 0xD2,0xF4,则值为 0x04D2,即 1234。
我们使用的结构始终适用于我们测试过的系统,但我们需要它尽可能可移植。
我的问题是:
data1无论字节序如何,总是会按预期表示正确的值(我假设是的,并且硬件/软件接口应该始终正确处理单个整个字节 - 如果发送 0xD2,则应该接收 0xD2)?
是否可能data2是reserved错误的方式,用data2代表高 4 位而不是低 4 位?
如果是:
位字节顺序(通常)是否取决于字节字节顺序,或者它们可以完全不同吗?
位字节顺序是由硬件还是编译器决定的?看起来 Intel 上的所有 Linux 系统都是一样的——对于 ARM 来说也是如此吗?(如果我们可以说我们可以支持所有 Intel 和 ARM linux 版本,那应该没问题)
是否有一种简单的方法可以在编译器中确定它的方式,并在需要时保留位字段条目?
虽然位字段是映射传入数据的最简洁的代码方式,但我想我只是想知道放弃它们并使用类似的东西是否更安全:
struct {
uint8_t data1; // lsb (0xFF)
uint8_t data2; // msb (0x0F) & reserved (0xF0)
} Data;
Data d;
int value = (d.data2 & …Run Code Online (Sandbox Code Playgroud)