mirror of
https://github.com/coder/code-server.git
synced 2026-05-05 12:05:18 +02:00
Add language customization flag (#7374)
This allows you to customize any string (that has a translation) or add your own translations.
This commit is contained in:
committed by
GitHub
parent
8b3d9b9e0a
commit
92fca0dcc3
154
test/unit/node/i18n.test.ts
Normal file
154
test/unit/node/i18n.test.ts
Normal file
@@ -0,0 +1,154 @@
|
||||
import { promises as fs } from "fs"
|
||||
import * as os from "os"
|
||||
import * as path from "path"
|
||||
import { loadCustomStrings } from "../../../src/node/i18n"
|
||||
|
||||
describe("i18n", () => {
|
||||
let tempDir: string
|
||||
let validJsonFile: string
|
||||
let invalidJsonFile: string
|
||||
let nonExistentFile: string
|
||||
|
||||
beforeEach(async () => {
|
||||
// Create temporary directory for test files
|
||||
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "code-server-i18n-test-"))
|
||||
|
||||
// Create test files
|
||||
validJsonFile = path.join(tempDir, "valid.json")
|
||||
invalidJsonFile = path.join(tempDir, "invalid.json")
|
||||
nonExistentFile = path.join(tempDir, "does-not-exist.json")
|
||||
|
||||
// Write valid JSON file
|
||||
await fs.writeFile(
|
||||
validJsonFile,
|
||||
JSON.stringify({
|
||||
WELCOME: "Custom Welcome",
|
||||
LOGIN_TITLE: "My Custom App",
|
||||
LOGIN_BELOW: "Please log in to continue",
|
||||
}),
|
||||
)
|
||||
|
||||
// Write invalid JSON file
|
||||
await fs.writeFile(invalidJsonFile, '{"WELCOME": "Missing closing quote}')
|
||||
})
|
||||
|
||||
afterEach(async () => {
|
||||
// Clean up temporary directory
|
||||
await fs.rmdir(tempDir, { recursive: true })
|
||||
})
|
||||
|
||||
describe("loadCustomStrings", () => {
|
||||
it("should load valid JSON file successfully", async () => {
|
||||
// Should not throw an error
|
||||
await expect(loadCustomStrings(validJsonFile)).resolves.toBeUndefined()
|
||||
})
|
||||
|
||||
it("should throw clear error for non-existent file", async () => {
|
||||
await expect(loadCustomStrings(nonExistentFile)).rejects.toThrow(
|
||||
`Custom strings file not found: ${nonExistentFile}\nPlease ensure the file exists and is readable.`,
|
||||
)
|
||||
})
|
||||
|
||||
it("should throw clear error for invalid JSON", async () => {
|
||||
await expect(loadCustomStrings(invalidJsonFile)).rejects.toThrow(
|
||||
`Invalid JSON in custom strings file: ${invalidJsonFile}`,
|
||||
)
|
||||
})
|
||||
|
||||
it("should handle empty JSON object", async () => {
|
||||
const emptyJsonFile = path.join(tempDir, "empty.json")
|
||||
await fs.writeFile(emptyJsonFile, "{}")
|
||||
|
||||
await expect(loadCustomStrings(emptyJsonFile)).resolves.toBeUndefined()
|
||||
})
|
||||
|
||||
it("should handle nested JSON objects", async () => {
|
||||
const nestedJsonFile = path.join(tempDir, "nested.json")
|
||||
await fs.writeFile(
|
||||
nestedJsonFile,
|
||||
JSON.stringify({
|
||||
WELCOME: "Hello World",
|
||||
NESTED: {
|
||||
KEY: "Value",
|
||||
},
|
||||
}),
|
||||
)
|
||||
|
||||
await expect(loadCustomStrings(nestedJsonFile)).resolves.toBeUndefined()
|
||||
})
|
||||
|
||||
it("should handle special characters and unicode", async () => {
|
||||
const unicodeJsonFile = path.join(tempDir, "unicode.json")
|
||||
await fs.writeFile(
|
||||
unicodeJsonFile,
|
||||
JSON.stringify({
|
||||
WELCOME: "欢迎来到 code-server",
|
||||
LOGIN_TITLE: "Willkommen bei {{app}}",
|
||||
SPECIAL: "Special chars: àáâãäåæçèéêë 🚀 ♠️ ∆",
|
||||
}),
|
||||
"utf8",
|
||||
)
|
||||
|
||||
await expect(loadCustomStrings(unicodeJsonFile)).resolves.toBeUndefined()
|
||||
})
|
||||
|
||||
it("should handle generic errors that are not ENOENT or SyntaxError", async () => {
|
||||
const testFile = path.join(tempDir, "test.json")
|
||||
await fs.writeFile(testFile, "{}")
|
||||
|
||||
// Mock fs.readFile to throw a generic error
|
||||
const originalReadFile = fs.readFile
|
||||
const mockError = new Error("Permission denied")
|
||||
fs.readFile = jest.fn().mockRejectedValue(mockError)
|
||||
|
||||
await expect(loadCustomStrings(testFile)).rejects.toThrow(
|
||||
`Failed to load custom strings from ${testFile}: Permission denied`,
|
||||
)
|
||||
|
||||
// Restore original function
|
||||
fs.readFile = originalReadFile
|
||||
})
|
||||
|
||||
it("should handle errors that are not Error instances", async () => {
|
||||
const testFile = path.join(tempDir, "test.json")
|
||||
await fs.writeFile(testFile, "{}")
|
||||
|
||||
// Mock fs.readFile to throw a non-Error object
|
||||
const originalReadFile = fs.readFile
|
||||
fs.readFile = jest.fn().mockRejectedValue("String error")
|
||||
|
||||
await expect(loadCustomStrings(testFile)).rejects.toThrow(
|
||||
`Failed to load custom strings from ${testFile}: String error`,
|
||||
)
|
||||
|
||||
// Restore original function
|
||||
fs.readFile = originalReadFile
|
||||
})
|
||||
|
||||
it("should handle null/undefined errors", async () => {
|
||||
const testFile = path.join(tempDir, "test.json")
|
||||
await fs.writeFile(testFile, "{}")
|
||||
|
||||
// Mock fs.readFile to throw null
|
||||
const originalReadFile = fs.readFile
|
||||
fs.readFile = jest.fn().mockRejectedValue(null)
|
||||
|
||||
await expect(loadCustomStrings(testFile)).rejects.toThrow(`Failed to load custom strings from ${testFile}: null`)
|
||||
|
||||
// Restore original function
|
||||
fs.readFile = originalReadFile
|
||||
})
|
||||
|
||||
it("should complete without errors for valid input", async () => {
|
||||
const testFile = path.join(tempDir, "resource-test.json")
|
||||
const customStrings = {
|
||||
WELCOME: "Custom Welcome Message",
|
||||
LOGIN_TITLE: "Custom Login Title",
|
||||
}
|
||||
await fs.writeFile(testFile, JSON.stringify(customStrings))
|
||||
|
||||
// Should not throw any errors
|
||||
await expect(loadCustomStrings(testFile)).resolves.toBeUndefined()
|
||||
})
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user