+++ /dev/null
-import { registerTSPaths } from '../../server/helpers/register-ts-paths'
-registerTSPaths()
-
-import * as xliff12ToJs from 'xliff/xliff12ToJs'
-import { readFileSync, readJSON, unlink, writeFile, writeJSON, existsSync, exists, pathExists } from 'fs-extra'
-import { join } from 'path'
-import { buildFileLocale, I18N_LOCALES, isDefaultLocale } from '../../shared/models/i18n/i18n'
-import { eachSeries } from 'async'
-
-const sources: string[] = []
-const l = [
- 'ar-001',
- 'ca-ES',
- 'cs-CZ',
- 'da-DK',
- 'de-DE',
- 'el-GR',
- 'en-GB',
- 'en-US',
- 'eo',
- 'es-ES',
- 'eu-ES',
- 'fa-IR',
- 'fi-FI',
- 'fr-FR',
- 'gd',
- 'gl-ES',
- 'hu-HU',
- 'it-IT',
- 'ja-JP',
- 'jbo',
- 'ko-KR',
- 'lt-LT',
- 'nb-NO',
- 'nl-NL',
- 'oc',
- 'pl-PL',
- 'pt-BR',
- 'pt-PT',
- 'ru-RU',
- 'sk-SK',
- 'sl-SI',
- 'sv-SE',
- 'ta',
- 'th-TH',
- 'tr-TR',
- 'uk-UA',
- 'vi-VN',
- 'zh-Hans-CN',
- 'zh-Hant-TW'
-]
-
-const availableLocales = l.filter(l => isDefaultLocale(l) === false)
- .map(l => buildFileLocale(l))
-
-for (const file of [ 'player', 'server', 'iso639' ]) {
- for (const locale of availableLocales) {
- sources.push(join(__dirname, '../../../client/src/locale/target/', `${file}_${locale}.xml`))
- }
-}
-
-eachSeries(sources, (source, cb) => {
- xliffFile2JSON(source, cb)
-}, err => {
- if (err) return handleError(err)
-
- mergeISO639InServer(err => {
- if (err) return handleError(err)
-
- injectMissingTranslations().then(() => process.exit(0))
- })
-})
-
-function handleError (err: any) {
- console.error(err)
- process.exit(-1)
-}
-
-function xliffFile2JSON (filePath: string, cb) {
- const fileTarget = filePath.replace('.xml', '.json')
-
- if (!existsSync(filePath)) {
- console.log('No file %s exists.', filePath)
- return cb()
- }
-
- // Remove the two first lines our xliff module does not like
- let fileContent = readFileSync(filePath).toString()
- fileContent = removeFirstLine(fileContent)
- fileContent = removeFirstLine(fileContent)
-
- xliff12ToJs(fileContent, (err, res) => {
- if (err) return cb(err)
-
- const json = createJSONString(res)
- writeFile(fileTarget, json, err => {
- if (err) return cb(err)
-
- return unlink(filePath, cb)
- })
- })
-}
-
-function mergeISO639InServer (cb) {
- eachSeries(availableLocales, (locale, eachCallback) => {
- const serverPath = join(__dirname, '../../../client/src/locale/target/', `server_${locale}.json`)
- const iso639Path = join(__dirname, '../../../client/src/locale/target/', `iso639_${locale}.json`)
-
- if (!existsSync(serverPath)) {
- console.log('No file %s exists.', serverPath)
- return cb()
- }
- if (!existsSync(iso639Path)) {
- console.log('No file %s exists.', iso639Path)
- return cb()
- }
-
- const resServer = readFileSync(serverPath).toString()
- const resISO639 = readFileSync(iso639Path).toString()
-
- const jsonServer = JSON.parse(resServer)
- const jsonISO639 = JSON.parse(resISO639)
-
- Object.assign(jsonServer, jsonISO639)
- const serverString = JSON.stringify(jsonServer)
-
- writeFile(serverPath, serverString, err => {
- if (err) return eachCallback(err)
-
- return unlink(iso639Path, eachCallback)
- })
- }, cb)
-}
-
-function removeFirstLine (str: string) {
- return str.substring(str.indexOf('\n') + 1)
-}
-
-function createJSONString (obj: any) {
- const res: any = {}
- const strings = obj.resources['']
-
- Object.keys(strings).forEach(k => res[k] = strings[k].target)
-
- return JSON.stringify(res)
-}
-
-async function injectMissingTranslations () {
- const baseServer = await readJSON(join(__dirname, '../../../client/src/locale/server.en-US.json'))
- Object.keys(baseServer).forEach(k => baseServer[k] = '')
-
- for (const locale of availableLocales) {
- const serverPath = join(__dirname, '../../../client/src/locale/target/', `server_${locale}.json`)
- if (!await pathExists(serverPath)) {
- console.log('No file exists to inject missing translations: %s.', serverPath)
- continue
- }
-
- let serverJSON = await readJSON(serverPath)
-
- serverJSON = Object.assign({}, baseServer, serverJSON)
- await writeJSON(serverPath, serverJSON)
- }
-
- const basePlayer = await readJSON(join(__dirname, '../../../client/src/locale/player.en-US.json'))
- Object.keys(basePlayer).forEach(k => basePlayer[k] = '')
- for (const locale of availableLocales) {
- const serverPath = join(__dirname, '../../../client/src/locale/target/', `player_${locale}.json`)
- if (!await pathExists(serverPath)) {
- console.log('No file exists to inject missing translations: %s.', serverPath)
- continue
- }
-
- let serverJSON = await readJSON(serverPath)
-
- serverJSON = Object.assign({}, basePlayer, serverJSON)
- await writeJSON(serverPath, serverJSON)
- }
-}
# Translation
-We use [Zanata](http://zanata.org/) as translation platform.
-Please do not edit xml files directly from Git, you have to use Zanata!
+We use [Weblate](https://weblate.org) as translation platform.
+Please do not edit translation files directly from Git, you have to use Weblate!
-If you don't see your locale in the platform, please [create an issue](https://github.com/Chocobozzz/PeerTube/issues) so we add it!
+If you don't see your locale in the platform you can add it directly in the Weblate interface.
+Then, if you think there are enough translated strings, please [create an issue](https://github.com/Chocobozzz/PeerTube/issues) so we add the new locale in PeerTube!
## How to
- * Create an account: https://trad.framasoft.org/account/register
- * Join a language team: https://trad.framasoft.org/languages
- * Go to the PeerTube page https://trad.framasoft.org/iteration/view/peertube/develop
- * Choose the locale and begin to translate PeerTube!
+ * Create an account: https://weblate.framasoft.org/accounts/register/
+ * Validate your email and follow the link sent
+ * Create your password (keep the `Current password` field empty) and setup your account
+ * Go to the PeerTube page https://weblate.framasoft.org/projects/peertube/
+ * Choose the file and the locale you want to translate
## Files
* **angular**: contains client strings
* **player**: contains player strings.
Most of the strings come from VideoJS, so you can help yourself by using [video.js JSON files](https://github.com/videojs/video.js/tree/master/lang)
- * **server**: contains server strings (privacies, licences...)
- * **iso639**: contains iso639 (languages) strings used by PeerTube to describe the audio language of a particular video.
+ * **server**: contains server strings (privacies, licences...) and iso639 (languages) strings used by PeerTube to describe the audio language of a particular video.
It's the reason why these strings should be translated too. There are many strings so do not hesitate to translate only main audio languages.
+
## Tips
### Special tags
### Singular/plural
-For singular/plural translations, you must translate values inside `{` and `}`.
+For singular/plural translations, you must translate values inside `{` and `}`. **Please don't translate the word *other***
For example: