Output modified bcp47 tag in ResTable_config::toString()
We expect to be able to parse the output of ResTable_config::toString(), so it should use modified bcp47 (b+en+Latn+US). Change-Id: I597a1779a1fa5cff171c473e6a0368d93b9c7722
This commit is contained in:
@@ -1195,6 +1195,12 @@ struct ResTable_config
|
||||
// Example: en-US, en-Latn-US, en-POSIX.
|
||||
void getBcp47Locale(char* out) const;
|
||||
|
||||
// Append to str the resource-qualifer string representation of the
|
||||
// locale component of this Config. If the locale is only country
|
||||
// and language, it will look like en-rUS. If it has scripts and
|
||||
// variants, it will be a modified bcp47 tag: b+en+Latn+US.
|
||||
void appendDirLocale(String8& str) const;
|
||||
|
||||
// Sets the values of language, region, script and variant to the
|
||||
// well formed BCP-47 locale contained in |in|. The input locale is
|
||||
// assumed to be valid and no validation is performed.
|
||||
|
||||
@@ -2550,6 +2550,58 @@ bool ResTable_config::match(const ResTable_config& settings) const {
|
||||
return true;
|
||||
}
|
||||
|
||||
void ResTable_config::appendDirLocale(String8& out) const {
|
||||
if (!language[0]) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!localeScript[0] && !localeVariant[0]) {
|
||||
// Legacy format.
|
||||
if (out.size() > 0) {
|
||||
out.append("-");
|
||||
}
|
||||
|
||||
char buf[4];
|
||||
size_t len = unpackLanguage(buf);
|
||||
out.append(buf, len);
|
||||
|
||||
if (country[0]) {
|
||||
out.append("-r");
|
||||
len = unpackRegion(buf);
|
||||
out.append(buf, len);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// We are writing the modified bcp47 tag.
|
||||
// It starts with 'b+' and uses '+' as a separator.
|
||||
|
||||
if (out.size() > 0) {
|
||||
out.append("-");
|
||||
}
|
||||
out.append("b+");
|
||||
|
||||
char buf[4];
|
||||
size_t len = unpackLanguage(buf);
|
||||
out.append(buf, len);
|
||||
|
||||
if (localeScript[0]) {
|
||||
out.append("+");
|
||||
out.append(localeScript, sizeof(localeScript));
|
||||
}
|
||||
|
||||
if (country[0]) {
|
||||
out.append("+");
|
||||
len = unpackRegion(buf);
|
||||
out.append(buf, len);
|
||||
}
|
||||
|
||||
if (localeVariant[0]) {
|
||||
out.append("+");
|
||||
out.append(localeVariant, sizeof(localeVariant));
|
||||
}
|
||||
}
|
||||
|
||||
void ResTable_config::getBcp47Locale(char str[RESTABLE_MAX_LOCALE_LEN]) const {
|
||||
memset(str, 0, RESTABLE_MAX_LOCALE_LEN);
|
||||
|
||||
@@ -2650,12 +2702,7 @@ String8 ResTable_config::toString() const {
|
||||
res.appendFormat("mnc%d", dtohs(mnc));
|
||||
}
|
||||
|
||||
char localeStr[RESTABLE_MAX_LOCALE_LEN];
|
||||
getBcp47Locale(localeStr);
|
||||
if (strlen(localeStr) > 0) {
|
||||
if (res.size() > 0) res.append("-");
|
||||
res.append(localeStr);
|
||||
}
|
||||
appendDirLocale(res);
|
||||
|
||||
if ((screenLayout&MASK_LAYOUTDIR) != 0) {
|
||||
if (res.size() > 0) res.append("-");
|
||||
|
||||
4
tests/Split/res/values-b+fr+Latn+CA/strings.xml
Normal file
4
tests/Split/res/values-b+fr+Latn+CA/strings.xml
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="test">Bonsoir!</string>
|
||||
</resources>
|
||||
4
tests/Split/res/values-fr-rCA/strings.xml
Normal file
4
tests/Split/res/values-fr-rCA/strings.xml
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="test">Bonjour</string>
|
||||
</resources>
|
||||
@@ -367,33 +367,6 @@ int AaptLocaleValue::initFromDirName(const Vector<String8>& parts, const int sta
|
||||
return currentIndex;
|
||||
}
|
||||
|
||||
|
||||
String8 AaptLocaleValue::toDirName() const {
|
||||
String8 dirName("");
|
||||
if (language[0]) {
|
||||
dirName += language;
|
||||
} else {
|
||||
return dirName;
|
||||
}
|
||||
|
||||
if (script[0]) {
|
||||
dirName += "-s";
|
||||
dirName += script;
|
||||
}
|
||||
|
||||
if (region[0]) {
|
||||
dirName += "-r";
|
||||
dirName += region;
|
||||
}
|
||||
|
||||
if (variant[0]) {
|
||||
dirName += "-v";
|
||||
dirName += variant;
|
||||
}
|
||||
|
||||
return dirName;
|
||||
}
|
||||
|
||||
void AaptLocaleValue::initFromResTable(const ResTable_config& config) {
|
||||
config.unpackLanguage(language);
|
||||
config.unpackRegion(region);
|
||||
|
||||
@@ -78,8 +78,6 @@ struct AaptLocaleValue {
|
||||
|
||||
void writeTo(ResTable_config* out) const;
|
||||
|
||||
String8 toDirName() const;
|
||||
|
||||
int compare(const AaptLocaleValue& other) const {
|
||||
return memcmp(this, &other, sizeof(AaptLocaleValue));
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ TEST(AaptConfigTest, ParseBasicQualifiers) {
|
||||
TEST(AaptConfigTest, ParseLocales) {
|
||||
ConfigDescription config;
|
||||
EXPECT_TRUE(TestParse("en-rUS", &config));
|
||||
EXPECT_EQ(String8("en-US"), config.toString());
|
||||
EXPECT_EQ(String8("en-rUS"), config.toString());
|
||||
}
|
||||
|
||||
TEST(AaptConfigTest, ParseQualifierAddedInApi13) {
|
||||
|
||||
Reference in New Issue
Block a user