Prepare i18n

This commit is contained in:
Chocobozzz 2019-09-11 15:17:18 +02:00
parent f62b724751
commit fa4e1c7336
No known key found for this signature in database
GPG key ID: 583A612D890159BE
21 changed files with 274 additions and 152 deletions

View file

@ -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)

View file

@ -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>

View file

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View file

Before

Width:  |  Height:  |  Size: 746 B

After

Width:  |  Height:  |  Size: 746 B

View file

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 960 B

View file

@ -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

View file

@ -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
} }
} }
} }

View 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>

View 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"

View 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"

View 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"

View file

@ -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)
Vue.mixin(CommonMixins)
const routes = [
{
path: '/',
component: Home
}
]
for (const locale of allLocales) {
routes.push({
path: '/' + locale,
component: Home
})
}
const router = new VueRouter({ const router = new VueRouter({
mode: 'history', mode: 'history',
base: `${__dirname}${process.env.BASE_URL}`, base: `${__dirname}${process.env.BASE_URL}`,
routes: [ routes
{
path: '/',
component: Home
}
]
}) })
// Framanav // Framanav

1
src/translations.json Normal file
View 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"}}

View file

@ -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>
Lambition de PeerTube, c'est dêtre <strong>une alternative libre et décentralisée</strong> aux services de diffusion de vidéos. Lambition 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 nest pas de remplacer, mais de proposer quelque chose dautre, avec des valeurs différentes, en parallèle de ce qui existe déjà. Le but nest pas de remplacer, mais de proposer quelque chose dautre, 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 nest pas pensé pour créer une énorme plateforme centralisant les vidéos du monde entier. Il sagit plutôt PeerTube nest pas pensé pour créer une énorme plateforme centralisant les vidéos du monde entier. Il sagit 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>
Nimporte qui ayant un minimum de compétences techniques peut héberger un serveur PeerTube quon nomme instance. Nimporte qui ayant un minimum de compétences techniques peut héberger un serveur PeerTube quon nomme instance.
Chaque instance héberge ses propres utilisateurices et leurs vidéos. Chaque instance héberge ses propres utilisateurices 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 administrateurices différentes.</strong> Ainsi, <strong>toutes les instances sont créées, animées, modérées et maintenues de façon indépendante par des administrateurices différentes.</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 nest pas tout ! Le protocole de fédération ActivityPub (quutilise PeerTube) Mais ce nest pas tout ! Le protocole de fédération ActivityPub (quutilise PeerTube)
<strong>permet aussi dinteragir avec dautres logiciels</strong> utilisant ce même protocole. Par exemple, PeerTube et le <strong>permet aussi dinteragir avec dautres 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 nest soumis au monopole daucune entreprise, ne dépend daucune publicité PeerTube nest soumis au monopole daucune entreprise, ne dépend daucune 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 quil faut Mais surtout, PeerTube <strong>vous considère comme une personne, et non pas comme un produit quil faut
profiler et enfermer dans des boucles vidéos.</strong> PeerTube nutilise par exemple aucun algorithme de recommandation biaisé profiler et enfermer dans des boucles vidéos.</strong> PeerTube nutilise 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 connaisseureuses). Tout cela est possible car PeerTube est un logiciel libre (licence GNU-AGPL pour les connaisseureuses).
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 dutilisateurices et ou à Vivendi/Bolloré (pour Dailymotion). Cette licence libre <strong>garantit nos libertés fondamentales dutilisateurices 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 la vu avec les dérives de YouTube: son hébergeur, Google-Alphabet, peut imposer son système ContentID On la 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 quinjustes. (le fameux «Robocopyright») ou ses outils de mise en valeur des vidéos, qui semblent aussi obscurs quinjustes.
</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 lhébergeur de vos vidéos selon ses conditions dutilisation, telles que la limite despace disque par utilisateurice, Avec PeerTube, vous choisissez lhébergeur de vos vidéos selon ses conditions dutilisation, telles que la limite despace disque par utilisateurice,
la politique de modération, les choix de fédération... la politique de modération, les choix de fédération...
Comme vous navez 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 navez 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 spectateurices. au même moment, leur navigateur envoie automatiquement des bouts de la vidéo aux autres spectateurices.
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
à shéberger chez un géant du web dont linfrastructure peut encaisser des milliers de vues simultanées Ou à payer très cher un hébergement de vidéo indépendant afin quil tienne la charge. à shéberger chez un géant du web dont linfrastructure peut encaisser des milliers de vues simultanées Ou à payer très cher un hébergement de vidéo indépendant afin quil 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 dintérêt général, notre association est proposant 34 outils en ligne éthiques et alternatifs. Reconnue dinté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 lutiliseront et y contribueront, et plus vite il évoluera Plus ce logiciel sera utilisé et soutenu, plus des personnes lutiliseront 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,

View file

@ -1,2 +0,0 @@
*
!.gitignore

View file

@ -1,2 +0,0 @@
*
!.gitignore

View file

@ -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/

View file

@ -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

View file

@ -1,2 +0,0 @@
*
!.gitignore

View file

@ -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>