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:
cp app/locales/*.yml zanata/backup/
# From https://raw.githubusercontent.com/Polyconseil/vue-gettext/master/Makefile
restore-locales:
cp zanata/backup/*.yml app/locales/
# On OSX the PATH variable isn't exported unless "SHELL" is also set, see: http://stackoverflow.com/a/25506676
SHELL = /bin/bash
NODE_BINDIR = ./node_modules/.bin
export PATH := $(NODE_BINDIR):$(PATH)
LOGNAME ?= $(shell logname)
prepare-locales:
rm -f zanata/yml/*.yml zanata/po/*.po zanata/po/*.pot zanata/po/*.err
# adding the name of the user's login name to the template file, so that
# on a multi-user system several users can run this without interference
TEMPLATE_POT ?= /tmp/template-$(LOGNAME).pot
clean-locales: backup-locales prepare-locales
zanata/scripts/yml2po.sh
zanata/scripts/po2yml.sh
# Where to find input files (it can be multiple paths).
INPUT_FILES = ./src
po:
zanata/scripts/yml2po.sh
# Where to write the files generated by this makefile.
OUTPUT_DIR = ./src
yml: backup-locales
zanata/scripts/po2yml.sh
# Available locales for the app.
LOCALES = en_US fr_FR
push-locales: po
zanata-cli -q -B push --push-type both
# Name of the generated .po files for each available locale.
LOCALE_FILES ?= $(patsubst %,$(OUTPUT_DIR)/locale/%/LC_MESSAGES/app.po,$(LOCALES))
pull-locales: prepare-locales
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
GETTEXT_SOURCES ?= $(shell find $(INPUT_FILES) -name '*.jade' -o -name '*.html' -o -name '*.js' -o -name '*.vue' 2> /dev/null)
preview:
npm run preview
# Makefile Targets
.PHONY: clean makemessages translations all
build:
npm run prod
all:
@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">
<title></title>
<link rel="shortcut icon" href="/icons/favicon.png">
<link rel="apple-touch-icon" href="/icons/apple-touch-icon.png" />
<link rel="shortcut icon" href="/img/icons/favicon.png">
<link rel="apple-touch-icon" href="/img/icons/apple-touch-icon.png" />
</head>
<body>
<div id="app"></div>
</body>
</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">
<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>
soutenu par
@ -93,6 +93,7 @@ export default {
components: {
I18n
},
methods: {
getPath (path) {
return path

View file

@ -2,28 +2,26 @@
<div class="i18n">
<b-dropdown>
<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">
Language
<translate>Languages</translate>
<span class="caret"></span>
</div>
</template>
<template slot="dropdown">
<b-dropdown-item v-for="lang in $language.availableLanguages" @click="changeLanguage(lang)">
<router-link :to="'/' + lang + '/' + ($route.path.split('/')[2] || '')">{{ locales[lang] }}</router-link>
</b-dropdown-item>
<b-dropdown-item v-for="(lang, locale) in $language.available" :href="buildLocaleLink(locale)">
{{ lang }}
</b-dropdown-item>
<b-dropdown-divider></b-dropdown-divider>
<b-dropdown-divider></b-dropdown-divider>
<b-dropdown-item>
<a>
<i class="fa fa-fw fa-plus" aria-hidden="true"></i>
<span v-translate>Translate</span>
</a>
</b-dropdown-item>
</template>
<b-dropdown-item>
<a class="translate">
<icon-add></icon-add>
<span v-translate>Translate</span>
</a>
</b-dropdown-item>
</b-dropdown>
</div>
</template>
@ -40,6 +38,12 @@
.dropdown-toggle::after {
display: none;
}
.translate svg {
width: 20px;
margin-right: 5px;
vertical-align: top;
}
}
</style>
@ -51,22 +55,20 @@
<script>
import { BDropdown, BDropdownDivider, BDropdownItem } from 'bootstrap-vue'
import IconAdd from './icons/IconAdd'
export default {
components: {
BDropdown, BDropdownDivider, BDropdownItem
},
data () {
return {
currentComponent: '',
switchLanguage: 'en'
}
BDropdown,
BDropdownDivider,
BDropdownItem,
IconAdd
},
methods: {
changeLanguage (lang) {
this.switchLanguage = lang
this.$i18n.locale = lang
this.currentComponent = this.$route.path.split('/')[2] // eslint-disable-line prefer-destructuring
buildLocaleLink (locale) {
return window.location.origin + `/${locale}/`
}
}
}

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/main.scss'
import CommonMixins from './mixins/Common-Mixins'
const translations = require('./translations.json')
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.mixin(CommonMixins)
const routes = [
{
path: '/',
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: [
{
path: '/',
component: Home
}
]
routes
})
// 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>
<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,
PeerTube is the decentralized free software alternative to videos platforms developed by Framasoft
</div>
@ -17,20 +17,20 @@
<button class="jpt-button what-is-peertube">
<icon-instance></icon-instance>
<span>What is PeerTube?</span>
<span v-translate>What is PeerTube?</span>
</button>
<button class="jpt-button instances-list">
<icon-instance></icon-instance>
See the instances list
<translate>See the instances list</translate>
</button>
</div>
</section>
<section class="content-selections">
<div class="section-title">
<div>Discover our content selection</div>
<div v-translate>Discover our content selection</div>
<div class="border-title"></div>
</div>
@ -44,7 +44,7 @@
<div class="bottom-link-wrapper">
<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>
</a>
</div>
@ -52,7 +52,7 @@
<section class="what-is-peertube">
<div class="section-title">
<div>
<div v-translate>
What is
<img class="brand-title" :src="buildImgUrl('brand.png')" alt="PeerTube" />
?
@ -65,32 +65,32 @@
<div>
<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.
</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à.
</p>
</div>
</div>
<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" />
<div class="citation">
<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
<strong>d'un réseau de nombreux petits hébergeurs de vidéos, connectés les uns aux autres.</strong>
</div>
</div>
<p>
<p v-translate>
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.
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">
<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>
</a>
</div>
<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 ;
il suffit que l'administrateur·ice l'ai autorisé !
</p>
@ -113,12 +113,12 @@
<div class="citation">
<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>
<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)
<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>
@ -128,18 +128,18 @@
<div class="bottom-link-wrapper">
<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>
</a>
</div>
</div>
<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" />
<p>
<p v-translate>
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.
</p>
@ -147,19 +147,19 @@
<div class="citation">
<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é
<strong>et ne vous piste pas.</strong>
</div>
</div>
<p>
<p v-translate>
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é
pour vous faire rester indéfiniment en ligne.
</p>
<p>
<p v-translate>
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)
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">
<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>
</a>
</div>
</div>
<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" />
<div class="citation">
<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>
</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
(le fameux «Robocopyright») ou ses outils de mise en valeur des vidéos, qui semblent aussi obscurs quinjustes.
</div>
@ -195,13 +195,13 @@
<div class="citation">
<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
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 v-translate>
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...
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">
<icon-instance></icon-instance>
Découvrir les instances PeerTube
<translate>Découvrir les instances PeerTube</translate>
</button>
</div>
<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" />
<div class="citation">
<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
les internautes (vidéos virales), ce qui permet d'<strong>alléger la charge des sites web qui les hébergent.</strong>
</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
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é.
</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
à 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>
@ -242,21 +242,21 @@
<div class="you-play">
<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" />
</div>
<div class="buttons-row">
<button class="jpt-button">
<span>Explorer les contenus</span>
<span v-translate>Explorer les contenus</span>
</button>
<div>
<button class="jpt-button">
<span>Créer un compte</span>
<span v-translate>Créer un compte</span>
</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...
</div>
</div>
@ -265,22 +265,22 @@
</div>
<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" />
<p>
<p v-translate>
PeerTube est <strong>un logiciel libre gratuit financé par une association</strong> française à but non lucratif: Framasoft.
</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>
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
<strong>financée à plus de 90% par vos dons</strong>, déductibles des impôts pour les contribuables français·es.
</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
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é
@ -288,14 +288,14 @@
</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
vers une alternative concrète aux plateformes telles que YouTube.
</strong>
</p>
<button class="jpt-button">
<span>Soutenir Framasoft</span>
<span v-translate>Soutenir Framasoft</span>
</button>
</div>
</section>
@ -400,13 +400,8 @@
import IconInstance from '../components/icons/IconInstance.vue'
import ContentSelection from '../components/ContentSelection.vue'
import IconRight from '../components/icons/IconRight.vue'
import JPTMixins from '../mixins/Common-Mixins.js'
export default {
mixins: [
JPTMixins
],
components: {
ContentSelection,
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>