packages/lib/tools/vite-po-transform-plugin.ts (43 lines of code) (raw):
import fs from 'fs';
import path from 'path';
// Plugin to handle .po files similar to angular-gettext-loader
export const poTransformPlugin = () => {
const extractMsgPair = (line: string, prefix: string): string => {
const match = line.match(new RegExp(`^${prefix}\\s+"(.*)"`))
return match ? match[1] : ''
}
const parsePoFile = (content: string): Record<string, string> => {
const translations: Record<string, string> = {}
const lines = content.split('\n')
let currentMsgid = ''
for (const line of lines) {
const trimmed = line.trim()
if (trimmed.startsWith('msgid "')) {
currentMsgid = extractMsgPair(trimmed, 'msgid')
} else if (trimmed.startsWith('msgstr "') && currentMsgid) {
const msgstr = extractMsgPair(trimmed, 'msgstr')
if (msgstr) {
translations[currentMsgid] = msgstr
}
currentMsgid = ''
}
}
return translations
}
const extractLocaleFromPath = (filePath: string): string | null => {
// Extract locale from filename (e.g., '/path/to/youtrack-issues-list-widget_ru.po' -> 'ru')
const match = path.basename(filePath).match(/^([^_]+)_(\w+)\.po$/)
return match ? match[2] : null
}
return {
name: 'po-transform',
load(id: string): string | null {
if (id.endsWith('.po')) {
const content = fs.readFileSync(id, 'utf-8')
const translations = parsePoFile(content)
const locale = extractLocaleFromPath(id)
// Export both the translations and the extracted locale
return `export default ${JSON.stringify(translations)};
export const locale = ${JSON.stringify(locale)};`
}
return null
}
}
}