forked from nutomic/joinpeertube
Prepare i18n
This commit is contained in:
parent
f62b724751
commit
fa4e1c7336
21 changed files with 274 additions and 152 deletions
79
Makefile
79
Makefile
|
@ -1,33 +1,64 @@
|
||||||
backup-locales:
|
# From https://raw.githubusercontent.com/Polyconseil/vue-gettext/master/Makefile
|
||||||
cp app/locales/*.yml zanata/backup/
|
|
||||||
|
|
||||||
restore-locales:
|
# On OSX the PATH variable isn't exported unless "SHELL" is also set, see: http://stackoverflow.com/a/25506676
|
||||||
cp zanata/backup/*.yml app/locales/
|
SHELL = /bin/bash
|
||||||
|
NODE_BINDIR = ./node_modules/.bin
|
||||||
|
export PATH := $(NODE_BINDIR):$(PATH)
|
||||||
|
LOGNAME ?= $(shell logname)
|
||||||
|
|
||||||
prepare-locales:
|
# adding the name of the user's login name to the template file, so that
|
||||||
rm -f zanata/yml/*.yml zanata/po/*.po zanata/po/*.pot zanata/po/*.err
|
# on a multi-user system several users can run this without interference
|
||||||
|
TEMPLATE_POT ?= /tmp/template-$(LOGNAME).pot
|
||||||
|
|
||||||
clean-locales: backup-locales prepare-locales
|
# Where to find input files (it can be multiple paths).
|
||||||
zanata/scripts/yml2po.sh
|
INPUT_FILES = ./src
|
||||||
zanata/scripts/po2yml.sh
|
|
||||||
|
|
||||||
po:
|
# Where to write the files generated by this makefile.
|
||||||
zanata/scripts/yml2po.sh
|
OUTPUT_DIR = ./src
|
||||||
|
|
||||||
yml: backup-locales
|
# Available locales for the app.
|
||||||
zanata/scripts/po2yml.sh
|
LOCALES = en_US fr_FR
|
||||||
|
|
||||||
push-locales: po
|
# Name of the generated .po files for each available locale.
|
||||||
zanata-cli -q -B push --push-type both
|
LOCALE_FILES ?= $(patsubst %,$(OUTPUT_DIR)/locale/%/LC_MESSAGES/app.po,$(LOCALES))
|
||||||
|
|
||||||
pull-locales: prepare-locales
|
GETTEXT_SOURCES ?= $(shell find $(INPUT_FILES) -name '*.jade' -o -name '*.html' -o -name '*.js' -o -name '*.vue' 2> /dev/null)
|
||||||
cp -n zanata/zanata.xml zanata.xml
|
|
||||||
sed -e 's@<project></project>@<project>join-peertube</project>@' -i zanata.xml
|
|
||||||
zanata-cli -q -B pull --pull-type both --min-doc-percent 75
|
|
||||||
make yml
|
|
||||||
|
|
||||||
preview:
|
# Makefile Targets
|
||||||
npm run preview
|
.PHONY: clean makemessages translations all
|
||||||
|
|
||||||
build:
|
all:
|
||||||
npm run prod
|
@echo choose a target from: clean makemessages translations
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(TEMPLATE_POT) $(OUTPUT_DIR)/translations.json
|
||||||
|
|
||||||
|
makemessages: $(TEMPLATE_POT)
|
||||||
|
|
||||||
|
translations: ./$(OUTPUT_DIR)/translations.json
|
||||||
|
|
||||||
|
# Create a main .pot template, then generate .po files for each available language.
|
||||||
|
# Thanx to Systematic: https://github.com/Polyconseil/systematic/blob/866d5a/mk/main.mk#L167-L183
|
||||||
|
$(TEMPLATE_POT): $(GETTEXT_SOURCES)
|
||||||
|
# `dir` is a Makefile built-in expansion function which extracts the directory-part of `$@`.
|
||||||
|
# `$@` is a Makefile automatic variable: the file name of the target of the rule.
|
||||||
|
# => `mkdir -p /tmp/`
|
||||||
|
mkdir -p $(dir $@)
|
||||||
|
# Extract gettext strings from templates files and create a POT dictionary template.
|
||||||
|
gettext-extract --quiet --attribute v-translate --output $@ $(GETTEXT_SOURCES)
|
||||||
|
# Generate .po files for each available language.
|
||||||
|
@for lang in $(LOCALES); do \
|
||||||
|
export PO_FILE=$(OUTPUT_DIR)/locale/$$lang/LC_MESSAGES/app.po; \
|
||||||
|
mkdir -p $$(dirname $$PO_FILE); \
|
||||||
|
if [ -f $$PO_FILE ]; then \
|
||||||
|
echo "msgmerge --update $$PO_FILE $@"; \
|
||||||
|
msgmerge --lang=$$lang --update $$PO_FILE $@ || break ;\
|
||||||
|
else \
|
||||||
|
msginit --no-translator --locale=$$lang --input=$@ --output-file=$$PO_FILE || break ; \
|
||||||
|
msgattrib --no-wrap --no-obsolete -o $$PO_FILE $$PO_FILE || break; \
|
||||||
|
fi; \
|
||||||
|
done;
|
||||||
|
|
||||||
|
$(OUTPUT_DIR)/translations.json: $(LOCALE_FILES)
|
||||||
|
mkdir -p $(OUTPUT_DIR)
|
||||||
|
gettext-compile --output $@ $(LOCALE_FILES)
|
||||||
|
|
|
@ -5,10 +5,12 @@
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title></title>
|
<title></title>
|
||||||
|
|
||||||
<link rel="shortcut icon" href="/icons/favicon.png">
|
<link rel="shortcut icon" href="/img/icons/favicon.png">
|
||||||
<link rel="apple-touch-icon" href="/icons/apple-touch-icon.png" />
|
<link rel="apple-touch-icon" href="/img/icons/apple-touch-icon.png" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div id="app"></div>
|
<div id="app"></div>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 746 B After Width: | Height: | Size: 746 B |
|
@ -1,8 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg width="41px" height="20px" viewBox="0 0 41 20" version="1.1" xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
||||||
<g id="icone/instance" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
|
||||||
<path d="M26.5555556,17.7777778 L26.5555556,9.86666667 L27.6666667,10.9777778 L27.6666667,17.7777778 C27.6666667,18.3914275 27.1692053,18.8888889 26.5555556,18.8888889 L22.6666667,18.8888889 L22.6666667,13.3333333 L19.3333333,13.3333333 L19.3333333,18.8888889 L15.4444444,18.8888889 C14.8307947,18.8888889 14.3333333,18.3914275 14.3333333,17.7777778 L14.3333333,11.1111111 L15.4444444,10 L15.4444444,17.7777778 L18.2222222,17.7777778 L18.2222222,12.2222222 L23.7777778,12.2222222 L23.7777778,17.7777778 L26.5555556,17.7777778 Z M29.7277778,9.60555556 L29.7222222,9.61111111 C29.9109871,9.83153349 29.8982957,10.1601079 29.6930907,10.3653129 C29.4878857,10.5705179 29.1593113,10.5832093 28.9388889,10.3944444 L21,2.45 L13.0611111,10.3888889 C12.8406887,10.5776538 12.5121143,10.5649624 12.3069093,10.3597573 C12.1017043,10.1545523 12.0890129,9.82597793 12.2777778,9.60555556 L20.6111111,1.27222222 C20.8277986,1.05682023 21.177757,1.05682023 21.3944444,1.27222222 L29.7277778,9.60555556 Z"
|
|
||||||
id="Mask" fill="#000000" fill-rule="nonzero"></path>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 1.3 KiB |
BIN
public/img/language.png
Normal file
BIN
public/img/language.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 960 B |
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
<nav class="navbar navbar-expand-lg">
|
<nav class="navbar navbar-expand-lg">
|
||||||
<router-link :to="getPath('/')" class="navbar-brand">
|
<router-link :to="getPath('/')" class="navbar-brand">
|
||||||
<img alt="PeerTube" :src="`${$root['/']}img/brand-small.png`">
|
<img alt="PeerTube" :src="buildImgUrl('brand-small.png')">
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
soutenu par
|
soutenu par
|
||||||
|
@ -93,6 +93,7 @@ export default {
|
||||||
components: {
|
components: {
|
||||||
I18n
|
I18n
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
getPath (path) {
|
getPath (path) {
|
||||||
return path
|
return path
|
||||||
|
|
|
@ -2,28 +2,26 @@
|
||||||
<div class="i18n">
|
<div class="i18n">
|
||||||
<b-dropdown>
|
<b-dropdown>
|
||||||
<template slot="button-content">
|
<template slot="button-content">
|
||||||
<i class="fa fa-lg fa-language" aria-hidden="true"></i>
|
<img :src="buildImgUrl('language.png')" alt="Change languages logo" />
|
||||||
|
|
||||||
<div class="text">
|
<div class="text">
|
||||||
Language
|
<translate>Languages</translate>
|
||||||
<span class="caret"></span>
|
<span class="caret"></span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template slot="dropdown">
|
<b-dropdown-item v-for="(lang, locale) in $language.available" :href="buildLocaleLink(locale)">
|
||||||
<b-dropdown-item v-for="lang in $language.availableLanguages" @click="changeLanguage(lang)">
|
{{ lang }}
|
||||||
<router-link :to="'/' + lang + '/' + ($route.path.split('/')[2] || '')">{{ locales[lang] }}</router-link>
|
|
||||||
</b-dropdown-item>
|
</b-dropdown-item>
|
||||||
|
|
||||||
<b-dropdown-divider></b-dropdown-divider>
|
<b-dropdown-divider></b-dropdown-divider>
|
||||||
|
|
||||||
<b-dropdown-item>
|
<b-dropdown-item>
|
||||||
<a>
|
<a class="translate">
|
||||||
<i class="fa fa-fw fa-plus" aria-hidden="true"></i>
|
<icon-add></icon-add>
|
||||||
<span v-translate>Translate</span>
|
<span v-translate>Translate</span>
|
||||||
</a>
|
</a>
|
||||||
</b-dropdown-item>
|
</b-dropdown-item>
|
||||||
</template>
|
|
||||||
</b-dropdown>
|
</b-dropdown>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -40,6 +38,12 @@
|
||||||
.dropdown-toggle::after {
|
.dropdown-toggle::after {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.translate svg {
|
||||||
|
width: 20px;
|
||||||
|
margin-right: 5px;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
@ -51,22 +55,20 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { BDropdown, BDropdownDivider, BDropdownItem } from 'bootstrap-vue'
|
import { BDropdown, BDropdownDivider, BDropdownItem } from 'bootstrap-vue'
|
||||||
|
import IconAdd from './icons/IconAdd'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
BDropdown, BDropdownDivider, BDropdownItem
|
BDropdown,
|
||||||
},
|
BDropdownDivider,
|
||||||
data () {
|
BDropdownItem,
|
||||||
return {
|
|
||||||
currentComponent: '',
|
IconAdd
|
||||||
switchLanguage: 'en'
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
changeLanguage (lang) {
|
buildLocaleLink (locale) {
|
||||||
this.switchLanguage = lang
|
return window.location.origin + `/${locale}/`
|
||||||
this.$i18n.locale = lang
|
|
||||||
this.currentComponent = this.$route.path.split('/')[2] // eslint-disable-line prefer-destructuring
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
18
src/components/icons/IconAdd.vue
Normal file
18
src/components/icons/IconAdd.vue
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
<template>
|
||||||
|
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<g transform="translate(-92.000000, -115.000000)">
|
||||||
|
<g id="2" transform="translate(92.000000, 115.000000)">
|
||||||
|
<circle id="Oval-1" stroke="#000000" stroke-width="2" cx="12" cy="12" r="10"></circle>
|
||||||
|
<rect id="Rectangle-1" fill="#000000" x="11" y="7" width="2" height="10" rx="1"></rect>
|
||||||
|
<rect id="Rectangle-1" fill="#000000" x="7" y="11" width="10" height="2" rx="1"></rect>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {}
|
||||||
|
</script>
|
23
src/locale/en_US/LC_MESSAGES/app.po
Normal file
23
src/locale/en_US/LC_MESSAGES/app.po
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Generated-By: easygettext\n"
|
||||||
|
"Project-Id-Version: \n"
|
||||||
|
"Last-Translator: Automatically generated\n"
|
||||||
|
"Language-Team: none\n"
|
||||||
|
"Language: en_US\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#: src/views/Home.vue:7
|
||||||
|
msgid "A free software to take back control of your videos"
|
||||||
|
msgstr "A free software to take back control of your videos"
|
||||||
|
|
||||||
|
#: src/components/I18n.vue:7
|
||||||
|
msgid "Languages"
|
||||||
|
msgstr "Languages"
|
||||||
|
|
||||||
|
#: src/components/I18n.vue:21
|
||||||
|
msgid "Translate"
|
||||||
|
msgstr "Translate"
|
24
src/locale/fr_FR/LC_MESSAGES/app.po
Normal file
24
src/locale/fr_FR/LC_MESSAGES/app.po
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: \n"
|
||||||
|
"Last-Translator: Automatically generated\n"
|
||||||
|
"Language-Team: none\n"
|
||||||
|
"Language: fr_FR\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Generated-By: easygettext\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||||
|
|
||||||
|
#: src/views/Home.vue:7
|
||||||
|
msgid "A free software to take back control of your videos"
|
||||||
|
msgstr "Un logiciel libre pour reprendre le contrôle de vos vidéos"
|
||||||
|
|
||||||
|
#: src/components/I18n.vue:7
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Languages"
|
||||||
|
msgstr "Langues"
|
||||||
|
|
||||||
|
#: src/components/I18n.vue:21
|
||||||
|
msgid "Translate"
|
||||||
|
msgstr "Traduire"
|
24
src/locale/fr_FR/LC_MESSAGES/app.po~
Normal file
24
src/locale/fr_FR/LC_MESSAGES/app.po~
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: \n"
|
||||||
|
"Last-Translator: Automatically generated\n"
|
||||||
|
"Language-Team: none\n"
|
||||||
|
"Language: fr_FR\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Generated-By: easygettext\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||||
|
|
||||||
|
#: src/views/Home.vue:7
|
||||||
|
msgid "A free software to take back control of your videos"
|
||||||
|
msgstr "Un logiciel libre pour reprendre le contrôle de vos vidéos"
|
||||||
|
|
||||||
|
#: src/components/I18n.vue:7
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Languages"
|
||||||
|
msgstr "Langues"
|
||||||
|
|
||||||
|
#: src/components/I18n.vue:21
|
||||||
|
msgid "Translate"
|
||||||
|
msgstr "Traduire"
|
59
src/main.js
59
src/main.js
|
@ -9,20 +9,67 @@ import Home from './views/Home.vue'
|
||||||
|
|
||||||
import './scss/bootstrap.scss'
|
import './scss/bootstrap.scss'
|
||||||
import './scss/main.scss'
|
import './scss/main.scss'
|
||||||
|
import CommonMixins from './mixins/Common-Mixins'
|
||||||
|
|
||||||
|
const translations = require('./translations.json')
|
||||||
|
|
||||||
Vue.use(VueRouter)
|
Vue.use(VueRouter)
|
||||||
Vue.use(GetTextPlugin, { translations: {} })
|
|
||||||
|
// ############# I18N ##############
|
||||||
|
|
||||||
|
const availableLanguages = {
|
||||||
|
'en_US': 'English',
|
||||||
|
'fr_FR': 'Français'
|
||||||
|
}
|
||||||
|
const aliasesLanguages = {
|
||||||
|
'en': 'en_US',
|
||||||
|
'fr': 'fr_FR'
|
||||||
|
}
|
||||||
|
const allLocales = Object.keys(availableLanguages).concat(Object.keys(aliasesLanguages))
|
||||||
|
|
||||||
|
Vue.use(GetTextPlugin, {
|
||||||
|
translations,
|
||||||
|
availableLanguages,
|
||||||
|
defaultLanguage: 'en_US',
|
||||||
|
silent: true
|
||||||
|
})
|
||||||
|
|
||||||
|
const localePath = window.location.pathname
|
||||||
|
.replace(/^\//, '')
|
||||||
|
.replace(/\/$/, '')
|
||||||
|
|
||||||
|
if (allLocales.includes(localePath)) {
|
||||||
|
Vue.config.language = aliasesLanguages[localePath] ? aliasesLanguages[localePath] : localePath
|
||||||
|
} else {
|
||||||
|
const navigatorLanguage = window.navigator.userLanguage || window.navigator.language
|
||||||
|
const snakeCaseLanguage = navigatorLanguage.replace('-', '_')
|
||||||
|
Vue.config.language = aliasesLanguages[snakeCaseLanguage] ? aliasesLanguages[snakeCaseLanguage] : snakeCaseLanguage
|
||||||
|
}
|
||||||
|
|
||||||
|
// ###########################
|
||||||
|
|
||||||
Vue.component('vue-headful', vueHeadful)
|
Vue.component('vue-headful', vueHeadful)
|
||||||
|
|
||||||
const router = new VueRouter({
|
Vue.mixin(CommonMixins)
|
||||||
mode: 'history',
|
|
||||||
base: `${__dirname}${process.env.BASE_URL}`,
|
const routes = [
|
||||||
routes: [
|
|
||||||
{
|
{
|
||||||
path: '/',
|
path: '/',
|
||||||
component: Home
|
component: Home
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
for (const locale of allLocales) {
|
||||||
|
routes.push({
|
||||||
|
path: '/' + locale,
|
||||||
|
component: Home
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const router = new VueRouter({
|
||||||
|
mode: 'history',
|
||||||
|
base: `${__dirname}${process.env.BASE_URL}`,
|
||||||
|
routes
|
||||||
})
|
})
|
||||||
|
|
||||||
// Framanav
|
// Framanav
|
||||||
|
|
1
src/translations.json
Normal file
1
src/translations.json
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{"en_US":{"A free software to take back control of your videos":"A free software to take back control of your videos","Languages":"Languages","Translate":"Translate"},"fr_FR":{"A free software to take back control of your videos":"Un logiciel libre pour reprendre le contrôle de vos vidéos","Translate":"Traduire"}}
|
|
@ -8,7 +8,7 @@
|
||||||
<div class="description" v-translate>A free software to take back control of your videos</div>
|
<div class="description" v-translate>A free software to take back control of your videos</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="marketing">
|
<div class="marketing" v-translate>
|
||||||
With more than 100 000 hosted videos, viewed more than 6 millions times and 20 000 users,
|
With more than 100 000 hosted videos, viewed more than 6 millions times and 20 000 users,
|
||||||
PeerTube is the decentralized free software alternative to videos platforms developed by Framasoft
|
PeerTube is the decentralized free software alternative to videos platforms developed by Framasoft
|
||||||
</div>
|
</div>
|
||||||
|
@ -17,20 +17,20 @@
|
||||||
<button class="jpt-button what-is-peertube">
|
<button class="jpt-button what-is-peertube">
|
||||||
<icon-instance></icon-instance>
|
<icon-instance></icon-instance>
|
||||||
|
|
||||||
<span>What is PeerTube?</span>
|
<span v-translate>What is PeerTube?</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<button class="jpt-button instances-list">
|
<button class="jpt-button instances-list">
|
||||||
<icon-instance></icon-instance>
|
<icon-instance></icon-instance>
|
||||||
|
|
||||||
See the instances list
|
<translate>See the instances list</translate>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="content-selections">
|
<section class="content-selections">
|
||||||
<div class="section-title">
|
<div class="section-title">
|
||||||
<div>Discover our content selection</div>
|
<div v-translate>Discover our content selection</div>
|
||||||
<div class="border-title"></div>
|
<div class="border-title"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@
|
||||||
|
|
||||||
<div class="bottom-link-wrapper">
|
<div class="bottom-link-wrapper">
|
||||||
<a href="#" class="bottom-link">
|
<a href="#" class="bottom-link">
|
||||||
<span class="text">Discover PeerTube instances</span>
|
<span class="text" v-translate>Discover PeerTube instances</span>
|
||||||
<icon-right></icon-right>
|
<icon-right></icon-right>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -52,7 +52,7 @@
|
||||||
|
|
||||||
<section class="what-is-peertube">
|
<section class="what-is-peertube">
|
||||||
<div class="section-title">
|
<div class="section-title">
|
||||||
<div>
|
<div v-translate>
|
||||||
What is
|
What is
|
||||||
<img class="brand-title" :src="buildImgUrl('brand.png')" alt="PeerTube" />
|
<img class="brand-title" :src="buildImgUrl('brand.png')" alt="PeerTube" />
|
||||||
?
|
?
|
||||||
|
@ -65,32 +65,32 @@
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div class="citation">
|
<div class="citation">
|
||||||
<div class="text">
|
<div class="text" v-translate>
|
||||||
L’ambition de PeerTube, c'est d’être <strong>une alternative libre et décentralisée</strong> aux services de diffusion de vidéos.
|
L’ambition de PeerTube, c'est d’être <strong>une alternative libre et décentralisée</strong> aux services de diffusion de vidéos.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p>
|
<p v-translate>
|
||||||
Le but n’est pas de remplacer, mais de proposer quelque chose d’autre, avec des valeurs différentes, en parallèle de ce qui existe déjà.
|
Le but n’est pas de remplacer, mais de proposer quelque chose d’autre, avec des valeurs différentes, en parallèle de ce qui existe déjà.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="federation one-column">
|
<div class="federation one-column">
|
||||||
<div class="subtitle">Une fédération d'hébergements interconnectés</div>
|
<div class="subtitle" v-translate>Une fédération d'hébergements interconnectés</div>
|
||||||
|
|
||||||
<img :src="buildImgUrl('peertube-federation-multiplicity.png')" alt="Funny federation schema" />
|
<img :src="buildImgUrl('peertube-federation-multiplicity.png')" alt="Funny federation schema" />
|
||||||
|
|
||||||
<div class="citation">
|
<div class="citation">
|
||||||
<div class="left-bar"></div>
|
<div class="left-bar"></div>
|
||||||
|
|
||||||
<div class="text">
|
<div class="text" v-translate>
|
||||||
PeerTube n’est pas pensé pour créer une énorme plateforme centralisant les vidéos du monde entier. Il s’agit plutôt
|
PeerTube n’est pas pensé pour créer une énorme plateforme centralisant les vidéos du monde entier. Il s’agit plutôt
|
||||||
<strong>d'un réseau de nombreux petits hébergeurs de vidéos, connectés les uns aux autres.</strong>
|
<strong>d'un réseau de nombreux petits hébergeurs de vidéos, connectés les uns aux autres.</strong>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p>
|
<p v-translate>
|
||||||
N’importe qui ayant un minimum de compétences techniques peut héberger un serveur PeerTube qu’on nomme instance.
|
N’importe qui ayant un minimum de compétences techniques peut héberger un serveur PeerTube qu’on nomme instance.
|
||||||
Chaque instance héberge ses propres utilisateur⋅ices et leurs vidéos.
|
Chaque instance héberge ses propres utilisateur⋅ices et leurs vidéos.
|
||||||
Ainsi, <strong>toutes les instances sont créées, animées, modérées et maintenues de façon indépendante par des administrateur⋅ices différent⋅e⋅s.</strong>
|
Ainsi, <strong>toutes les instances sont créées, animées, modérées et maintenues de façon indépendante par des administrateur⋅ices différent⋅e⋅s.</strong>
|
||||||
|
@ -98,14 +98,14 @@
|
||||||
|
|
||||||
<div class="bottom-link-wrapper">
|
<div class="bottom-link-wrapper">
|
||||||
<a href="#" class="bottom-link">
|
<a href="#" class="bottom-link">
|
||||||
<span class="text">Discover PeerTube instances</span>
|
<span class="text" v-translate>Discover PeerTube instances</span>
|
||||||
<icon-right></icon-right>
|
<icon-right></icon-right>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<img :src="buildImgUrl('peertube-federation-2-instances.png')" alt="Funny 2 instances communication schema" />
|
<img :src="buildImgUrl('peertube-federation-2-instances.png')" alt="Funny 2 instances communication schema" />
|
||||||
|
|
||||||
<p>
|
<p v-translate>
|
||||||
Mais vous avez tout de même la possibilité de regarder depuis l'instance sur laquelle vous êtes inscrit·e des vidéos qui se trouvent ailleurs ;
|
Mais vous avez tout de même la possibilité de regarder depuis l'instance sur laquelle vous êtes inscrit·e des vidéos qui se trouvent ailleurs ;
|
||||||
il suffit que l'administrateur·ice l'ai autorisé !
|
il suffit que l'administrateur·ice l'ai autorisé !
|
||||||
</p>
|
</p>
|
||||||
|
@ -113,12 +113,12 @@
|
||||||
<div class="citation">
|
<div class="citation">
|
||||||
<div class="left-bar"></div>
|
<div class="left-bar"></div>
|
||||||
|
|
||||||
<div class="text">C'est le principe de<strong> la fédération !</strong></div>
|
<div class="text v-translate">C'est le principe de<strong> la fédération !</strong></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<img :src="buildImgUrl('peertube-mastodon-federation.png')" alt="Federation with Mastodon funny schema" />
|
<img :src="buildImgUrl('peertube-mastodon-federation.png')" alt="Federation with Mastodon funny schema" />
|
||||||
|
|
||||||
<p>
|
<p v-translate>
|
||||||
Mais ce n’est pas tout ! Le protocole de fédération ActivityPub (qu’utilise PeerTube)
|
Mais ce n’est pas tout ! Le protocole de fédération ActivityPub (qu’utilise PeerTube)
|
||||||
<strong>permet aussi d’interagir avec d’autres logiciels</strong> utilisant ce même protocole. Par exemple, PeerTube et le
|
<strong>permet aussi d’interagir avec d’autres logiciels</strong> utilisant ce même protocole. Par exemple, PeerTube et le
|
||||||
réseau social Mastodon, alternative à Twitter, sont liés : <strong>il est possible de « suivre » un utilisateur PeerTube depuis Mastodon</strong>
|
réseau social Mastodon, alternative à Twitter, sont liés : <strong>il est possible de « suivre » un utilisateur PeerTube depuis Mastodon</strong>
|
||||||
|
@ -128,18 +128,18 @@
|
||||||
|
|
||||||
<div class="bottom-link-wrapper">
|
<div class="bottom-link-wrapper">
|
||||||
<a href="#" class="bottom-link">
|
<a href="#" class="bottom-link">
|
||||||
<span class="text">En savoir plus sur la fédération</span>
|
<span class="text" v-translate>En savoir plus sur la fédération</span>
|
||||||
<icon-right></icon-right>
|
<icon-right></icon-right>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="free-software one-column">
|
<div class="free-software one-column">
|
||||||
<div class="subtitle">Un code ouvert sous licence libre</div>
|
<div class="subtitle" v-translate>Un code ouvert sous licence libre</div>
|
||||||
|
|
||||||
<img :src="buildImgUrl('peertube-free-software.png')" alt="PeerTube is a free software funny schema" />
|
<img :src="buildImgUrl('peertube-free-software.png')" alt="PeerTube is a free software funny schema" />
|
||||||
|
|
||||||
<p>
|
<p v-translate>
|
||||||
Les principaux services de diffusion de vidéo en ligne utilisent vos données pour gagner
|
Les principaux services de diffusion de vidéo en ligne utilisent vos données pour gagner
|
||||||
de l'argent en analysant vos interactions et en utilisant ces informations pour vous matraquer en publicités ciblées.
|
de l'argent en analysant vos interactions et en utilisant ces informations pour vous matraquer en publicités ciblées.
|
||||||
</p>
|
</p>
|
||||||
|
@ -147,19 +147,19 @@
|
||||||
<div class="citation">
|
<div class="citation">
|
||||||
<div class="left-bar"></div>
|
<div class="left-bar"></div>
|
||||||
|
|
||||||
<div class="text">
|
<div class="text" v-translate>
|
||||||
PeerTube n’est soumis au monopole d’aucune entreprise, ne dépend d’aucune publicité
|
PeerTube n’est soumis au monopole d’aucune entreprise, ne dépend d’aucune publicité
|
||||||
<strong>et ne vous piste pas.</strong>
|
<strong>et ne vous piste pas.</strong>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p>
|
<p v-translate>
|
||||||
Mais surtout, PeerTube <strong>vous considère comme une personne, et non pas comme un produit qu’il faut
|
Mais surtout, PeerTube <strong>vous considère comme une personne, et non pas comme un produit qu’il faut
|
||||||
profiler et enfermer dans des boucles vidéos.</strong> PeerTube n’utilise par exemple aucun algorithme de recommandation biaisé
|
profiler et enfermer dans des boucles vidéos.</strong> PeerTube n’utilise par exemple aucun algorithme de recommandation biaisé
|
||||||
pour vous faire rester indéfiniment en ligne.
|
pour vous faire rester indéfiniment en ligne.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p v-translate>
|
||||||
Tout cela est possible car PeerTube est un logiciel libre (licence GNU-AGPL pour les connaisseur⋅euses).
|
Tout cela est possible car PeerTube est un logiciel libre (licence GNU-AGPL pour les connaisseur⋅euses).
|
||||||
Son code est un « commun » numérique, partagé avec tous et toutes, et non une recette secrète appartenant à Google (pour YouTube)
|
Son code est un « commun » numérique, partagé avec tous et toutes, et non une recette secrète appartenant à Google (pour YouTube)
|
||||||
ou à Vivendi/Bolloré (pour Dailymotion). Cette licence libre <strong>garantit nos libertés fondamentales d’utilisateur⋅ices et
|
ou à Vivendi/Bolloré (pour Dailymotion). Cette licence libre <strong>garantit nos libertés fondamentales d’utilisateur⋅ices et
|
||||||
|
@ -168,26 +168,26 @@
|
||||||
|
|
||||||
<div class="bottom-link-wrapper">
|
<div class="bottom-link-wrapper">
|
||||||
<a href="#" class="bottom-link">
|
<a href="#" class="bottom-link">
|
||||||
<span class="text">En savoir plus sur les logiciels libres</span>
|
<span class="text" v-translate>En savoir plus sur les logiciels libres</span>
|
||||||
<icon-right></icon-right>
|
<icon-right></icon-right>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="you-are-a-video-maker one-column">
|
<div class="you-are-a-video-maker one-column">
|
||||||
<div class="subtitle">Vous êtes vidéaste ?</div>
|
<div class="subtitle" v-translate>Vous êtes vidéaste ?</div>
|
||||||
|
|
||||||
<img :src="buildImgUrl('peertube-upload.png')" alt="PeerTube upload illustration" />
|
<img :src="buildImgUrl('peertube-upload.png')" alt="PeerTube upload illustration" />
|
||||||
|
|
||||||
<div class="citation">
|
<div class="citation">
|
||||||
<div class="left-bar"></div>
|
<div class="left-bar"></div>
|
||||||
|
|
||||||
<div class="text">
|
<div class="text" v-translate>
|
||||||
PeerTube vous permet de choisir <strong>un hébergement et des règles qui vous correspondent.</strong>
|
PeerTube vous permet de choisir <strong>un hébergement et des règles qui vous correspondent.</strong>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div v-translate>
|
||||||
On l’a vu avec les dérives de YouTube : son hébergeur, Google-Alphabet, peut imposer son système ContentID
|
On l’a vu avec les dérives de YouTube : son hébergeur, Google-Alphabet, peut imposer son système ContentID
|
||||||
(le fameux « Robocopyright ») ou ses outils de mise en valeur des vidéos, qui semblent aussi obscurs qu’injustes.
|
(le fameux « Robocopyright ») ou ses outils de mise en valeur des vidéos, qui semblent aussi obscurs qu’injustes.
|
||||||
</div>
|
</div>
|
||||||
|
@ -195,13 +195,13 @@
|
||||||
<div class="citation">
|
<div class="citation">
|
||||||
<div class="left-bar"></div>
|
<div class="left-bar"></div>
|
||||||
|
|
||||||
<div class="text">
|
<div class="text" v-translate>
|
||||||
Être en contact direct avec un hébergeur à taille humaine vous permet, non seulement de ne plus être le client d'une grande
|
Être en contact direct avec un hébergeur à taille humaine vous permet, non seulement de ne plus être le client d'une grande
|
||||||
entreprise du numérique, mais surtout <strong>d'avoir des rapports privilégiés avec les personnes qui hébergent et diffusent vos données.</strong>
|
entreprise du numérique, mais surtout <strong>d'avoir des rapports privilégiés avec les personnes qui hébergent et diffusent vos données.</strong>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div v-translate>
|
||||||
Avec PeerTube, vous choisissez l’hébergeur de vos vidéos selon ses conditions d’utilisation, telles que la limite d’espace disque par utilisateur⋅ice,
|
Avec PeerTube, vous choisissez l’hébergeur de vos vidéos selon ses conditions d’utilisation, telles que la limite d’espace disque par utilisateur⋅ice,
|
||||||
la politique de modération, les choix de fédération...
|
la politique de modération, les choix de fédération...
|
||||||
Comme vous n’avez pas un géant du web en face de vous, vous pourrez probablement discuter ensemble si vous avez un souci, un besoin, une envie...
|
Comme vous n’avez pas un géant du web en face de vous, vous pourrez probablement discuter ensemble si vous avez un souci, un besoin, une envie...
|
||||||
|
@ -210,31 +210,31 @@
|
||||||
<button class="jpt-button discover-instances">
|
<button class="jpt-button discover-instances">
|
||||||
<icon-instance></icon-instance>
|
<icon-instance></icon-instance>
|
||||||
|
|
||||||
Découvrir les instances PeerTube
|
<translate>Découvrir les instances PeerTube</translate>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="p2p one-column">
|
<div class="p2p one-column">
|
||||||
<div class="subtitle">De la diffusion – et donc du visionnage – en pair-à-pair</div>
|
<div class="subtitle" v-translate>De la diffusion – et donc du visionnage – en pair-à-pair</div>
|
||||||
|
|
||||||
<img :src="buildImgUrl('peertube-p2p.png')" alt="PeerTube P2P illustration" />
|
<img :src="buildImgUrl('peertube-p2p.png')" alt="PeerTube P2P illustration" />
|
||||||
|
|
||||||
<div class="citation">
|
<div class="citation">
|
||||||
<div class="left-bar"></div>
|
<div class="left-bar"></div>
|
||||||
|
|
||||||
<div class="text">
|
<div class="text" v-translate>
|
||||||
Le logiciel PeerTube peut au besoin utiliser un protocole pair-à-pair (P2P) pour diffuser des vidéos très regardées par
|
Le logiciel PeerTube peut au besoin utiliser un protocole pair-à-pair (P2P) pour diffuser des vidéos très regardées par
|
||||||
les internautes (vidéos virales), ce qui permet d'<strong>alléger la charge des sites web qui les hébergent.</strong>
|
les internautes (vidéos virales), ce qui permet d'<strong>alléger la charge des sites web qui les hébergent.</strong>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p>
|
<p v-translate>
|
||||||
Ainsi, quand vous visionnez une vidéo, votre ordinateur participe à sa diffusion. Si beaucoup de personnes regardent la même vidéo
|
Ainsi, quand vous visionnez une vidéo, votre ordinateur participe à sa diffusion. Si beaucoup de personnes regardent la même vidéo
|
||||||
au même moment, leur navigateur envoie automatiquement des bouts de la vidéo aux autres spectateur⋅ices.
|
au même moment, leur navigateur envoie automatiquement des bouts de la vidéo aux autres spectateur⋅ices.
|
||||||
Cela permet de <strong>ne pas surexploiter les ressources du serveur</strong> : les flux se répartissent, le réseau est optimisé.
|
Cela permet de <strong>ne pas surexploiter les ressources du serveur</strong> : les flux se répartissent, le réseau est optimisé.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p v-translate>
|
||||||
Mine de rien, avant cette diffusion en pair-à-pair, les vidéastes à succès (ou les vidéos qui font le buzz) étaient condamnés
|
Mine de rien, avant cette diffusion en pair-à-pair, les vidéastes à succès (ou les vidéos qui font le buzz) étaient condamnés
|
||||||
à s’héberger chez un géant du web dont l’infrastructure peut encaisser des milliers de vues simultanées… Ou à payer très cher un hébergement de vidéo indépendant afin qu’il tienne la charge.
|
à s’héberger chez un géant du web dont l’infrastructure peut encaisser des milliers de vues simultanées… Ou à payer très cher un hébergement de vidéo indépendant afin qu’il tienne la charge.
|
||||||
</p>
|
</p>
|
||||||
|
@ -242,21 +242,21 @@
|
||||||
|
|
||||||
<div class="you-play">
|
<div class="you-play">
|
||||||
<div class="one-column">
|
<div class="one-column">
|
||||||
<div class="subtitle">À vous de jouer !</div>
|
<div class="subtitle" v-translate>À vous de jouer !</div>
|
||||||
|
|
||||||
<img :src="buildImgUrl('peertube-you-play.png')" alt="PeerTube you play illustration" />
|
<img :src="buildImgUrl('peertube-you-play.png')" alt="PeerTube you play illustration" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="buttons-row">
|
<div class="buttons-row">
|
||||||
<button class="jpt-button">
|
<button class="jpt-button">
|
||||||
<span>Explorer les contenus</span>
|
<span v-translate>Explorer les contenus</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<button class="jpt-button">
|
<button class="jpt-button">
|
||||||
<span>Créer un compte</span>
|
<span v-translate>Créer un compte</span>
|
||||||
</button>
|
</button>
|
||||||
<div class="jpt-button-legend">
|
<div class="jpt-button-legend" v-translate>
|
||||||
Pour profiter de toutes les fonctionnalités : historique, abonnements, listes de lectures, notifications...
|
Pour profiter de toutes les fonctionnalités : historique, abonnements, listes de lectures, notifications...
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -265,22 +265,22 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="behind-peertube one-column">
|
<div class="behind-peertube one-column">
|
||||||
<div class="subtitle">Qui est derrière PeerTube ?</div>
|
<div class="subtitle" v-translate>Qui est derrière PeerTube ?</div>
|
||||||
|
|
||||||
<img class="framasoft-logo" :src="buildImgUrl('framasoft-big-logo.png')" alt="Framasoft logo" />
|
<img class="framasoft-logo" :src="buildImgUrl('framasoft-big-logo.png')" alt="Framasoft logo" />
|
||||||
|
|
||||||
<p>
|
<p v-translate>
|
||||||
PeerTube est <strong>un logiciel libre gratuit financé par une association</strong> française à but non lucratif : Framasoft.
|
PeerTube est <strong>un logiciel libre gratuit financé par une association</strong> française à but non lucratif : Framasoft.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p v-translate>
|
||||||
Créée en 2004, l'association se consacre désormais à <strong>l’éducation populaire aux enjeux du numérique.</strong>
|
Créée en 2004, l'association se consacre désormais à <strong>l’éducation populaire aux enjeux du numérique.</strong>
|
||||||
Notre petite structure (moins de 40 membres, moins de 10 salarié·e·s) est connue pour avoir réalisé le projet Dégooglisons Internet,
|
Notre petite structure (moins de 40 membres, moins de 10 salarié·e·s) est connue pour avoir réalisé le projet Dégooglisons Internet,
|
||||||
proposant 34 outils en ligne éthiques et alternatifs. Reconnue d’intérêt général, notre association est
|
proposant 34 outils en ligne éthiques et alternatifs. Reconnue d’intérêt général, notre association est
|
||||||
<strong>financée à plus de 90% par vos dons</strong>, déductibles des impôts pour les contribuables français·es.
|
<strong>financée à plus de 90% par vos dons</strong>, déductibles des impôts pour les contribuables français·es.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p v-translate>
|
||||||
Suite au financement participatif lancé entre mars et juillet 2018, <strong>Framasoft a pu financer l'emploi du développeur
|
Suite au financement participatif lancé entre mars et juillet 2018, <strong>Framasoft a pu financer l'emploi du développeur
|
||||||
principal de PeerTube.</strong> Ainsi, après une version bêta en mars 2018, la version 1 est sortie en novembre 2018.
|
principal de PeerTube.</strong> Ainsi, après une version bêta en mars 2018, la version 1 est sortie en novembre 2018.
|
||||||
Depuis, plusieurs versions intermédiaires ont apporté de nombreuses fonctionnalités. Plusieurs collectifs ont déjà monté
|
Depuis, plusieurs versions intermédiaires ont apporté de nombreuses fonctionnalités. Plusieurs collectifs ont déjà monté
|
||||||
|
@ -288,14 +288,14 @@
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<strong>
|
<strong v-translate>
|
||||||
Plus ce logiciel sera utilisé et soutenu, plus des personnes l’utiliseront et y contribueront, et plus vite il évoluera
|
Plus ce logiciel sera utilisé et soutenu, plus des personnes l’utiliseront et y contribueront, et plus vite il évoluera
|
||||||
vers une alternative concrète aux plateformes telles que YouTube.
|
vers une alternative concrète aux plateformes telles que YouTube.
|
||||||
</strong>
|
</strong>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<button class="jpt-button">
|
<button class="jpt-button">
|
||||||
<span>Soutenir Framasoft</span>
|
<span v-translate>Soutenir Framasoft</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
@ -400,13 +400,8 @@
|
||||||
import IconInstance from '../components/icons/IconInstance.vue'
|
import IconInstance from '../components/icons/IconInstance.vue'
|
||||||
import ContentSelection from '../components/ContentSelection.vue'
|
import ContentSelection from '../components/ContentSelection.vue'
|
||||||
import IconRight from '../components/icons/IconRight.vue'
|
import IconRight from '../components/icons/IconRight.vue'
|
||||||
import JPTMixins from '../mixins/Common-Mixins.js'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
mixins: [
|
|
||||||
JPTMixins
|
|
||||||
],
|
|
||||||
|
|
||||||
components: {
|
components: {
|
||||||
ContentSelection,
|
ContentSelection,
|
||||||
IconInstance,
|
IconInstance,
|
||||||
|
|
2
zanata/backup/.gitignore
vendored
2
zanata/backup/.gitignore
vendored
|
@ -1,2 +0,0 @@
|
||||||
*
|
|
||||||
!.gitignore
|
|
2
zanata/po/.gitignore
vendored
2
zanata/po/.gitignore
vendored
|
@ -1,2 +0,0 @@
|
||||||
*
|
|
||||||
!.gitignore
|
|
|
@ -1,7 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
for i in zanata/po/*.po
|
|
||||||
do
|
|
||||||
j=$(echo $i | cut -d '.' -f 1 | cut -d '/' -f 3)
|
|
||||||
po2yaml -i $i --progress none -t zanata/backup/en.yml -o zanata/yml/$j.yml
|
|
||||||
done
|
|
||||||
cp zanata/yml/*.yml app/locales/
|
|
|
@ -1,16 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
cp app/locales/*.yml zanata/yml/
|
|
||||||
yaml2po -P --progress=none -i zanata/yml/en.yml -o zanata/po/${PWD##*/}.pot
|
|
||||||
for i in app/locales/*.yml
|
|
||||||
do
|
|
||||||
j=$(echo $i | cut -d '.' -f 1 | cut -d '/' -f 3)
|
|
||||||
yaml2po --progress=none -t zanata/yml/en.yml -i zanata/yml/$j.yml -o zanata/po/$j.po
|
|
||||||
|
|
||||||
# Rename empty (almost) .po
|
|
||||||
tail -n +2 zanata/po/$j.po > zanata/po/tmp.1
|
|
||||||
tail -n +2 zanata/po/${PWD##*/}.pot > zanata/po/tmp.2
|
|
||||||
if((`stat -c%s "zanata/po/tmp.1"` <= `stat -c%s "zanata/po/tmp.2"`));then
|
|
||||||
mv zanata/po/$j.po zanata/po/$j.err
|
|
||||||
fi
|
|
||||||
rm zanata/po/tmp.1 zanata/po/tmp.2
|
|
||||||
done
|
|
2
zanata/yml/.gitignore
vendored
2
zanata/yml/.gitignore
vendored
|
@ -1,2 +0,0 @@
|
||||||
*
|
|
||||||
!.gitignore
|
|
|
@ -1,9 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
||||||
<config xmlns="http://zanata.org/namespace/config/">
|
|
||||||
<url>https://trad.framasoft.org/</url>
|
|
||||||
<project>join-peertube</project>
|
|
||||||
<project-version>master</project-version>
|
|
||||||
<project-type>gettext</project-type>
|
|
||||||
<src-dir>zanata/po</src-dir>
|
|
||||||
<trans-dir>zanata/po</trans-dir>
|
|
||||||
</config>
|
|
Loading…
Reference in a new issue