aboutsummaryrefslogtreecommitdiffhomepage
path: root/scripts/i18n
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/i18n')
-rwxr-xr-xscripts/i18n/create-custom-files.ts73
-rwxr-xr-xscripts/i18n/generate.sh9
-rwxr-xr-xscripts/i18n/pull-hook.sh15
-rwxr-xr-xscripts/i18n/xliff2json.ts91
4 files changed, 17 insertions, 171 deletions
diff --git a/scripts/i18n/create-custom-files.ts b/scripts/i18n/create-custom-files.ts
index e946b8fd6..47b3e3784 100755
--- a/scripts/i18n/create-custom-files.ts
+++ b/scripts/i18n/create-custom-files.ts
@@ -1,25 +1,21 @@
1import { registerTSPaths } from '../../server/helpers/register-ts-paths' 1import { registerTSPaths } from '../../server/helpers/register-ts-paths'
2registerTSPaths() 2import { writeJSON } from 'fs-extra'
3
4import * as jsToXliff12 from 'xliff/jsToXliff12'
5import { writeFile } from 'fs-extra'
6import { join } from 'path' 3import { join } from 'path'
7import { 4import {
8 buildLanguages, 5 buildLanguages,
9 VIDEO_CATEGORIES, 6 VIDEO_CATEGORIES,
10 VIDEO_IMPORT_STATES, 7 VIDEO_IMPORT_STATES,
11 VIDEO_LICENCES, VIDEO_PLAYLIST_PRIVACIES, VIDEO_PLAYLIST_TYPES, 8 VIDEO_LICENCES,
9 VIDEO_PLAYLIST_PRIVACIES,
10 VIDEO_PLAYLIST_TYPES,
12 VIDEO_PRIVACIES, 11 VIDEO_PRIVACIES,
13 VIDEO_STATES 12 VIDEO_STATES
14} from '../../server/initializers/constants' 13} from '../../server/initializers/constants'
15import { values } from 'lodash' 14import { values } from 'lodash'
16 15
17type TranslationType = { 16registerTSPaths()
18 target: string
19 data: { [id: string]: string }
20}
21 17
22const videojs = require(join(__dirname, '../../../client/src/locale/source/videojs_en_US.json')) 18const videojs = require(join(__dirname, '../../../client/src/locale/videojs.en-US.json'))
23const playerKeys = { 19const playerKeys = {
24 'Quality': 'Quality', 20 'Quality': 'Quality',
25 'Auto': 'Auto', 21 'Auto': 'Auto',
@@ -37,10 +33,7 @@ const playerKeys = {
37 'Total downloaded: ': 'Total downloaded: ', 33 'Total downloaded: ': 'Total downloaded: ',
38 'Total uploaded: ': 'Total uploaded: ' 34 'Total uploaded: ': 'Total uploaded: '
39} 35}
40const playerTranslations = { 36Object.assign(playerKeys, videojs)
41 target: join(__dirname, '../../../client/src/locale/source/player_en_US.xml'),
42 data: Object.assign({}, videojs, playerKeys)
43}
44 37
45// Server keys 38// Server keys
46const serverKeys: any = {} 39const serverKeys: any = {}
@@ -65,57 +58,17 @@ Object.assign(serverKeys, {
65 'Unknown': 'Unknown' 58 'Unknown': 'Unknown'
66}) 59})
67 60
68const serverTranslations = {
69 target: join(__dirname, '../../../client/src/locale/source/server_en_US.xml'),
70 data: serverKeys
71}
72
73// ISO 639 keys 61// ISO 639 keys
74const languageKeys: any = {} 62const languageKeys: any = {}
75const languages = buildLanguages() 63const languages = buildLanguages()
76Object.keys(languages).forEach(k => languageKeys[languages[k]] = languages[k]) 64Object.keys(languages).forEach(k => languageKeys[languages[k]] = languages[k])
77 65
78const iso639Translations = { 66Object.assign(serverKeys, languageKeys)
79 target: join(__dirname, '../../../client/src/locale/source/iso639_en_US.xml'),
80 data: languageKeys
81}
82
83saveToXliffFile(playerTranslations, err => {
84 if (err) return handleError(err)
85
86 saveToXliffFile(serverTranslations, err => {
87 if (err) return handleError(err)
88
89 saveToXliffFile(iso639Translations, err => {
90 if (err) return handleError(err)
91 67
92 process.exit(0) 68Promise.all([
93 }) 69 writeJSON(join(__dirname, '../../../client/src/locale/player.en-US.json'), playerKeys),
94 }) 70 writeJSON(join(__dirname, '../../../client/src/locale/server.en-US.json'), serverKeys)
95}) 71]).catch(err => {
96
97// Then, the server strings
98
99function saveToXliffFile (jsonTranslations: TranslationType, cb: Function) {
100 const obj = {
101 resources: {
102 namespace1: {}
103 }
104 }
105 Object.keys(jsonTranslations.data).forEach(k => obj.resources.namespace1[ k ] = { source: jsonTranslations.data[ k ] })
106
107 jsToXliff12(obj, (err, res) => {
108 if (err) return cb(err)
109
110 writeFile(jsonTranslations.target, res, err => {
111 if (err) return cb(err)
112
113 return cb(null)
114 })
115 })
116}
117
118function handleError (err: any) {
119 console.error(err) 72 console.error(err)
120 process.exit(-1) 73 process.exit(-1)
121} 74})
diff --git a/scripts/i18n/generate.sh b/scripts/i18n/generate.sh
index 3f3e3d8e5..f9c2f0613 100755
--- a/scripts/i18n/generate.sh
+++ b/scripts/i18n/generate.sh
@@ -3,12 +3,11 @@
3set -eu 3set -eu
4 4
5cd client 5cd client
6npm run ng -- xi18n --i18n-locale "en-US" --output-path src/locale/source --out-file angular_en_US.xml 6npm run ng -- xi18n --i18n-locale "en-US" --output-path src/locale --out-file angular.xlf
7npm run ngx-extractor -- --locale "en-US" -i 'src/**/*.ts' -f xlf -o src/locale/source/angular_en_US.xml 7npm run ngx-extractor -- --locale "en-US" -i 'src/**/*.ts' -f xlf -o src/locale/angular.xlf
8 8
9# Zanata does not support inner elements in <source>, so we hack these special elements 9# Merge new translations in other language files
10# This regex translate the Angular elements to special entities (that we will reconvert on pull) 10npm run ng run -- PeerTube:xliffmerge
11perl -pi -e 's|<x id=(.+?)/>|&lt;x id=\1/&gt;|g' src/locale/source/angular_en_US.xml
12 11
13# Add our strings too 12# Add our strings too
14cd ../ 13cd ../
diff --git a/scripts/i18n/pull-hook.sh b/scripts/i18n/pull-hook.sh
deleted file mode 100755
index 8d1f7ee55..000000000
--- a/scripts/i18n/pull-hook.sh
+++ /dev/null
@@ -1,15 +0,0 @@
1#!/bin/sh
2
3set -eu
4
5for i in $(seq 1 10); do
6 # Angular does not like when there is not target element, so we create it with the same content than the source element
7 perl -0pi -e 's#<source>([^<]+)</source>\s*<context-group #<source>\1</source><target>\1</target><context-group #g' client/src/locale/target/angular_*.xml
8
9 # Zanata does not support inner elements in <source>, so we hack these special elements
10 # This regex translate the converted elements to initial Angular elements
11 perl -pi -e 's|&lt;x id=(.+?)/&gt;([^"])|<x id=\1/>\2|g' client/src/locale/target/*.xml
12done
13
14npm run i18n:xliff2json
15
diff --git a/scripts/i18n/xliff2json.ts b/scripts/i18n/xliff2json.ts
deleted file mode 100755
index 68fc95f34..000000000
--- a/scripts/i18n/xliff2json.ts
+++ /dev/null
@@ -1,91 +0,0 @@
1import { registerTSPaths } from '../../server/helpers/register-ts-paths'
2registerTSPaths()
3
4import * as xliff12ToJs from 'xliff/xliff12ToJs'
5import { readFileSync, unlink, writeFile } from 'fs-extra'
6import { join } from 'path'
7import { buildFileLocale, I18N_LOCALES, isDefaultLocale } from '../../shared/models/i18n/i18n'
8import { eachSeries } from 'async'
9
10const sources: string[] = []
11const availableLocales = Object.keys(I18N_LOCALES)
12 .filter(l => isDefaultLocale(l) === false)
13 .map(l => buildFileLocale(l))
14
15for (const file of [ 'player', 'server', 'iso639' ]) {
16 for (const locale of availableLocales) {
17 sources.push(join(__dirname, '../../../client/src/locale/target/', `${file}_${locale}.xml`))
18 }
19}
20
21eachSeries(sources, (source, cb) => {
22 xliffFile2JSON(source, cb)
23}, err => {
24 if (err) return handleError(err)
25
26 mergeISO639InServer(err => {
27 if (err) return handleError(err)
28
29 process.exit(0)
30 })
31})
32
33function handleError (err: any) {
34 console.error(err)
35 process.exit(-1)
36}
37
38function xliffFile2JSON (filePath: string, cb) {
39 const fileTarget = filePath.replace('.xml', '.json')
40
41 // Remove the two first lines our xliff module does not like
42 let fileContent = readFileSync(filePath).toString()
43 fileContent = removeFirstLine(fileContent)
44 fileContent = removeFirstLine(fileContent)
45
46 xliff12ToJs(fileContent, (err, res) => {
47 if (err) return cb(err)
48
49 const json = createJSONString(res)
50 writeFile(fileTarget, json, err => {
51 if (err) return cb(err)
52
53 return unlink(filePath, cb)
54 })
55 })
56}
57
58function mergeISO639InServer (cb) {
59 eachSeries(availableLocales, (locale, eachCallback) => {
60 const serverPath = join(__dirname, '../../../client/src/locale/target/', `server_${locale}.json`)
61 const iso639Path = join(__dirname, '../../../client/src/locale/target/', `iso639_${locale}.json`)
62
63 const resServer = readFileSync(serverPath).toString()
64 const resISO639 = readFileSync(iso639Path).toString()
65
66 const jsonServer = JSON.parse(resServer)
67 const jsonISO639 = JSON.parse(resISO639)
68
69 Object.assign(jsonServer, jsonISO639)
70 const serverString = JSON.stringify(jsonServer)
71
72 writeFile(serverPath, serverString, err => {
73 if (err) return eachCallback(err)
74
75 return unlink(iso639Path, eachCallback)
76 })
77 }, cb)
78}
79
80function removeFirstLine (str: string) {
81 return str.substring(str.indexOf('\n') + 1)
82}
83
84function createJSONString (obj: any) {
85 const res: any = {}
86 const strings = obj.resources['']
87
88 Object.keys(strings).forEach(k => res[k] = strings[k].target)
89
90 return JSON.stringify(res)
91}