Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions src/compiler/utilitiesPublic.ts
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,9 @@ namespace ts {
return getCombinedFlags(node, n => n.flags);
}

/* @internal */
export const supportedLocaleDirectories = ["cs", "de", "es", "fr", "it", "ja", "ko", "pl", "pt-br", "ru", "tr", "zh-cn", "zh-tw"];

/**
* Checks to see if the locale is in the appropriate format,
* and if it is, attempts to set the appropriate language.
Expand All @@ -326,7 +329,8 @@ namespace ts {
locale: string,
sys: { getExecutingFilePath(): string, resolvePath(path: string): string, fileExists(fileName: string): boolean, readFile(fileName: string): string | undefined },
errors?: Push<Diagnostic>) {
const matchResult = /^([a-z]+)([_\-]([a-z]+))?$/.exec(locale.toLowerCase());
const lowerCaseLocale = locale.toLowerCase();
const matchResult = /^([a-z]+)([_\-]([a-z]+))?$/.exec(lowerCaseLocale);

if (!matchResult) {
if (errors) {
Expand All @@ -340,7 +344,7 @@ namespace ts {

// First try the entire locale, then fall back to just language if that's all we have.
// Either ways do not fail, and fallback to the English diagnostic strings.
if (!trySetLanguageAndTerritory(language, territory, errors)) {
if (contains(supportedLocaleDirectories, lowerCaseLocale) && !trySetLanguageAndTerritory(language, territory, errors)) {
trySetLanguageAndTerritory(language, /*territory*/ undefined, errors);
}

Expand Down
27 changes: 27 additions & 0 deletions src/testRunner/unittests/publicApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -124,3 +124,30 @@ describe("unittests:: Public APIs:: getTypeAtLocation", () => {
assert.equal(type.flags, ts.TypeFlags.Any);
});
});

describe("unittests:: Public APIs:: validateLocaleAndSetLanguage", () => {
let savedUILocale: string | undefined;
beforeEach(() => savedUILocale = ts.getUILocale());
afterEach(() => ts.setUILocale(savedUILocale));

function verifyValidateLocale(locale: string, expectedToReadFile: boolean) {
it(`Verifying ${locale} ${expectedToReadFile ? "reads" : "does not read"} file`, () => {
const errors: ts.Diagnostic[] = [];
ts.validateLocaleAndSetLanguage(locale, {
getExecutingFilePath: () => "/tsc.js",
resolvePath: ts.identity,
fileExists: fileName => {
assert.isTrue(expectedToReadFile, `Locale : ${locale} ${expectedToReadFile ? "should" : "should not"} check if ${fileName} exists.`);
return expectedToReadFile;
},
readFile: fileName => {
assert.isTrue(expectedToReadFile, `Locale : ${locale} ${expectedToReadFile ? "should" : "should not"} read ${fileName}.`);
// Throw error here so that actual change to localized diagnostics messages doesnt take place
throw new Error("cannot read file");
}
}, errors);
});
}
ts.supportedLocaleDirectories.forEach(locale => verifyValidateLocale(locale, /*expctedToReadFile*/ true));
["en", "en-us"].forEach(locale => verifyValidateLocale(locale, /*expctedToReadFile*/ false));
});