scratch-l10n
Version:
Localization for the Scratch 3.0 components
94 lines (84 loc) • 2.96 kB
text/typescript
/**
* @file
* Script to upload a source en.json file to a particular transifex project resource.
* Expects that the project and resource have already been defined in Transifex, and that
* the person running the script has the the TX_TOKEN environment variable set to an api
* token that has developer access.
*/
import fs from 'fs'
import path from 'path'
import { TransifexStrings } from './lib/transifex-formats.mts'
import { txPush, txCreateResource, JsonApiException } from './lib/transifex.mts'
const args = process.argv.slice(2)
const usage = `
Push English source strings to Transifex. Usage:
node tx-push-src.js tx-project tx-resource english-json-file
tx-project: the project slug on transifex
tx-resource: the resource slug on transifex
english-json-file: path to the en.json source
NOTE: TX_TOKEN environment variable needs to be set with a Transifex API token. See
the Localization page on the GUI wiki for information about setting up Transifex.
`
// Exit if missing arguments or TX_TOKEN
if (args.length < 3 || !process.env.TX_TOKEN) {
process.stdout.write(usage)
process.exit(1)
}
// Globals
const PROJECT = args[0]
const RESOURCE = args[1]
const en = JSON.parse(fs.readFileSync(path.resolve(args[2]), 'utf8')) as TransifexStrings<unknown>
// get the correct resource file type based on transifex project/repo and resource
const getResourceType = (project: string, resource: string) => {
if (project === 'scratch-website') {
// all the resources are KEYVALUEJSON
return 'KEYVALUEJSON'
}
if (project === 'scratch-legacy') {
// all the resources are po files
return 'PO'
}
if (project === 'scratch-editor') {
if (resource === 'blocks') {
return 'KEYVALUEJSON'
}
// everything else is CHROME I18N JSON
return 'CHROME'
}
if (project === 'scratch-videos') {
// all the resources are srt files
return 'SRT'
}
if (project === 'scratch-android') {
// all the resources are android xml files
return 'ANDROID'
}
if (project === 'scratch-resources') {
// all the resources are Chrome format json files
return 'CHROME'
}
throw new Error(`Error - Unknown resource type for:\n Project: ${project}, resource: ${resource}\n`)
}
// update Transifex with English source
const pushSource = async function () {
try {
await txPush(PROJECT, RESOURCE, en)
} catch (errUnknown) {
const err = errUnknown as JsonApiException
if (err.statusCode !== 404) {
throw err
}
// file not found - create it, but also give message
process.stdout.write(`Transifex Resource not found, creating: ${RESOURCE}\n`)
const resourceData = {
slug: RESOURCE,
name: RESOURCE,
priority: 0, // default to normal priority
i18nType: getResourceType(PROJECT, RESOURCE),
content: en,
}
await txCreateResource(PROJECT, resourceData)
}
}
await pushSource()