diff --git a/README.md b/README.md index 2bdcff5c..d2bb2976 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,13 @@ # Framadate - funky version ![landing_page](docs/img/landing_page.png) + +État de la traduction + + + +État de la traduction + + FR: Un logiciel libre de sondage fait par les contributeurs de l'association Framasoft, avec une API backend. EN: A libre polling software made by contributors around the French association Framasoft. @@ -11,12 +19,7 @@ This version uses a brand new backend API. [lire la doc pour débuter votre Funky Framadate](docs/GETTING_STARTED.md) ## Design et maquettes -Maquette naviguable: -https://www.sketch.com/s/5833607c-e93e-4e9b-9c7e-0614238c6d8c/a/rbYngRP/play - -Planche de création de sondage, https://www.sketch.com/s/5833607c-e93e-4e9b-9c7e-0614238c6d8c/p/9F41E940-BAAF-489A-8C90-AC6E5C762211 - -Planche des participations https://www.sketch.com/s/5833607c-e93e-4e9b-9c7e-0614238c6d8c/p/BFC83003-AAF3-4858-9EE1-F28A88D11305 +Maquette naviguable: https://www.figma.com/file/Q3I15MEuOtTwL0WIQ2eSMu/%F0%9F%93%85-Framadate?node-id=0%3A6510 ## Documentation @@ -26,8 +29,8 @@ EN: All documentation is available in the "doc" folder, mainly in French because # Version funky framadate -* maquettes par Thomas Bonamy : - * icones https://feathericons.com/ +* Selon les maquettes par Thomas Bonamy : https://www.figma.com/file/Q3I15MEuOtTwL0WIQ2eSMu +* icones https://feathericons.com/ * [Spécifications](docs/cadrage/specifications-fonctionnelles) * maquettes par @maiwann : https://scene.zeplin.io/project/5d4d83d68866d6522ff2ff10 diff --git a/docs/cadrage/i18n.md b/docs/cadrage/i18n.md index 790cec6e..6e29f19c 100644 --- a/docs/cadrage/i18n.md +++ b/docs/cadrage/i18n.md @@ -1,16 +1,25 @@ # Internationalisation - i18n + +État de la traduction + + +## Dans les templates HTML + Toutes les chaînes de texte doivent être disponible en minimum deux langues: Français et Anglais. +Pour l'ajout de nouvelles traductions voir [la documentations des traductions.md](../traductions.md) La documentation a été pensée pour être compréhensible en premier lieu par des personnes francophones, le projet étant issu de Framasoft et de personnes uniquement Francophones, nous avons jugé que c'était le moyen le plus efficace pour le faire grandir. -Voir les fichiers src/assets/i18n [EN.json](/src/assets/i18n/EN.json) et [FR.json](/src/assets/i18n/FR.json) -La traduction se base sur un système de clés-valeur. +Voir les fichiers dans le dossier **src/assets/i18n** +[EN.json](/src/assets/i18n/EN.json) et [FR.json](/src/assets/i18n/FR.json) + +La traduction se base sur un système de clés-valeur dans des fichiers JSON. Les clés sont entrées dans les templates html, et c'est la config d'Angular qui les traduit selon la langue demandée par le visiteur du site. -Chaque fichier de traduction est déclaré dans le [AppModule](../../src/app/app.module.ts) avec le module @ngx-translate. Examinez l'exemple pour rajouter votre propre traduction. - -Utilisez des sous groupes dans vos traductions afin de mieux segmenter les chaines de caractère par page et selon le sens qu'elles sous tendent. +Utilisez des sous groupes dans vos traductions afin de mieux segmenter les chaines de caractère par page et selon leur sens. +Faites en sorte de réutiliser au maximum les phrases identiques. ## Traduction de la documentation mkdocs -voir ici https://www.mkdocs.org/user-guide/configuration/#lang +Pour traduire cette documentation (les fichiers markdwon dans le dossier /docs/) qui génère un mini site avec mkdocs avec la commande de build, il faut faire des fichiers avec un nom de langue tels que index.fr.md et index.en.md. +Plus d'infos: https://www.mkdocs.org/user-guide/configuration/#lang diff --git a/docs/reunions/2021.md b/docs/reunions/2021.md index cf59a85f..f5d4c323 100644 --- a/docs/reunions/2021.md +++ b/docs/reunions/2021.md @@ -1,5 +1,8 @@ # 2021 ![landing_page](../img/landing_page.png) + +## Septembre +Début des jours ouvrés par Tykayn avec les designs de la DINUM ## Mars la DINUM propose de contribuer à financer le développement de la nouvelle version. diff --git a/docs/reunions/2022.md b/docs/reunions/2022.md new file mode 100644 index 00000000..f28dabb2 --- /dev/null +++ b/docs/reunions/2022.md @@ -0,0 +1,7 @@ + +# Février 2022 +- Présentation du rework design Figma, ajout de la section participation au vote. +Prévision de version 1 pour le Lundi 14 Mars 2022. + +# Janvier 2022 +- Rework design après tests utilisateurs, développement en pause pendant le mois. diff --git a/docs/traductions.md b/docs/traductions.md index e66951d8..6da13a79 100644 --- a/docs/traductions.md +++ b/docs/traductions.md @@ -1,9 +1,34 @@ # Traductions + +État de la traduction + + +État de la traduction + Les chaînes sont traduites via des clés de fichiers JSON exemple: [src/assets/i18n/FR.json]() -La mise en place de weblate pour faire des traductions collaboratives reste à réaliser -https://framagit.org/framasoft/framadate/funky-framadate-front/-/issues/112 +La mise en place de weblate pour faire des traductions collaboratives a été faite. +Vous pouvez contribuer ici https://weblate.framasoft.org/projects/funky-framadate/funky-framadate-front Nous avons récupéré les chaînes de traduction du projet Framadate v1, il faudra faire un nettoyage des clés et valeurs inutilisées dans les fichiers de traduction. +# Ajouter de nouvelles langues + +Le Weblate effectue automatiquement des Merge Request vers Framagit, si une langue est nouvelle elle proposera de créer un fichier **nom_de_la_langue.json** dans le dossier **src/assets/i18n** + +Pour que l'appli reconnaisse ces nouvelles langues il faut les enregistrer dans l'AppModule. +Chaque fichier de traduction est automatiquement chargé dans le [AppModule](../../src/app/app.module.ts) avec le Loader de @ngx-translate. Il faut ensuite ajouter le code de la langue dans l'énumération du fichier **/app/core/enums/language.enum.ts** Examinez l'exemple pour rajouter votre propre traduction. + +``` typescript +export enum Language { + FR = 'fr', + BR = 'br', + EN = 'en', + //... etc + } + +``` + +# prise en charges des traductions manquantes +Les textes manquants seront indiqués avec "MISSING TRANSLATION FOR" et le nom de la clé demandée par le HTML. diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 27923488..10cdab94 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,7 +1,6 @@ -import { CommonModule, registerLocaleData } from '@angular/common'; +import { CommonModule } from '@angular/common'; import { HttpClient, HttpClientModule } from '@angular/common/http'; -import localeEn from '@angular/common/locales/en'; -import localeFr from '@angular/common/locales/fr'; + import { NgModule } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { BrowserModule, Title } from '@angular/platform-browser'; @@ -30,8 +29,15 @@ import { CipheringComponent } from './features/shared/components/ui/static-pages import { ErrorsListComponent } from './features/shared/components/ui/form/errors-list/errors-list.component'; import { KeyboardShortcutsModule } from 'ng-keyboard-shortcuts'; import { AdministrationModule } from './features/administration/administration.module'; -registerLocaleData(localeEn, 'en-EN'); -registerLocaleData(localeFr, 'fr-FR'); + +// register languages files for translation +// import localeEn from '@angular/common/locales/en'; +// import localeFr from '@angular/common/locales/fr'; +// import localeEs from '@angular/common/locales/es'; +// // code for locale are listed by the ISO-639 +// registerLocaleData(localeFr, 'fr-FR'); +// registerLocaleData(localeEn, 'en-EN'); +// registerLocaleData(localeEs, 'ca-ES'); export class MyMissingTranslationHandler implements MissingTranslationHandler { public handle(params: MissingTranslationHandlerParams): string { @@ -40,7 +46,7 @@ export class MyMissingTranslationHandler implements MissingTranslationHandler { } export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader { - return new TranslateHttpLoader(http); + return new TranslateHttpLoader(http, './assets/i18n/', '.json'); } @NgModule({ @@ -60,7 +66,7 @@ export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader { NgxWebstorageModule.forRoot({ prefix: environment.localStorage.key }), SharedModule, TranslateModule.forRoot({ - defaultLanguage: 'FR', + defaultLanguage: environment.defaultLanguage, loader: { provide: TranslateLoader, useFactory: HttpLoaderFactory, diff --git a/src/app/core/enums/language.enum.ts b/src/app/core/enums/language.enum.ts index 4dc6dbfe..b09cf498 100644 --- a/src/app/core/enums/language.enum.ts +++ b/src/app/core/enums/language.enum.ts @@ -1,15 +1,19 @@ +/** + * liste des fichiers JSON de traduction des textes dans l'appli à charger par ngx-translate et prposer aux utilisateurs et utilisatrices de Framdate. + * Cette enum est utilisé dans le composant de sélection de langue. + */ export enum Language { FR = 'fr', - // BR = 'br', - // CA = 'ca', - // DE = 'de', - // EL = 'el', + BR = 'br', + CA = 'ca', + DE = 'de', + EL = 'el', EN = 'en', - // ES = 'es', - // GL = 'gl', - // HU = 'hu', - // IT = 'it', - // NL = 'nl', - // OC = 'oc', - // SV = 'sv', + ES = 'es', + GL = 'gl', + HU = 'hu', + IT = 'it', + NL = 'nl', + OC = 'oc', + SV = 'sv', } diff --git a/src/app/features/administration/form/advanced-config/advanced-config.component.html b/src/app/features/administration/form/advanced-config/advanced-config.component.html index 803f3205..b603f060 100644 --- a/src/app/features/administration/form/advanced-config/advanced-config.component.html +++ b/src/app/features/administration/form/advanced-config/advanced-config.component.html @@ -1,5 +1,5 @@
-
+

Saisissez la date de fin de votre sondage

diff --git a/src/app/features/administration/form/date/list/day/day-list.component.html b/src/app/features/administration/form/date/list/day/day-list.component.html index a12f215e..3d0cf378 100644 --- a/src/app/features/administration/form/date/list/day/day-list.component.html +++ b/src/app/features/administration/form/date/list/day/day-list.component.html @@ -19,10 +19,11 @@
- JJ/MM/AAAA + {{ 'dates.format_helper' | translate }}
- Supprimer la date + {{ 'dates.remove' | translate }}

diff --git a/src/app/features/administration/form/date/list/time/time-list.component.html b/src/app/features/administration/form/date/list/time/time-list.component.html index 903a516e..52d825c8 100644 --- a/src/app/features/administration/form/date/list/time/time-list.component.html +++ b/src/app/features/administration/form/date/list/time/time-list.component.html @@ -1,6 +1,7 @@

- Paramétrez le sondage + {{ 'advanced.title' | translate }}

+

+ {{ 'advanced.description' | translate }} +

diff --git a/src/app/features/administration/form/steps/step-one/step-one.component.html b/src/app/features/administration/form/steps/step-one/step-one.component.html index f7108d25..84940902 100644 --- a/src/app/features/administration/form/steps/step-one/step-one.component.html +++ b/src/app/features/administration/form/steps/step-one/step-one.component.html @@ -26,7 +26,9 @@
- +
richTextMode activé
@@ -38,16 +40,21 @@ class="is-large is-full input" formControlName="description" required - maxlength="300" + [maxlength]="environment.description_max_chars" >

- {{ pollService.form.value.description.length }} / 300 caractères maximum + {{ pollService.form.value.description.length }} / + + {{ environment.description_max_chars }} + {{ 'creation.description_constraint' | translate }}

diff --git a/src/app/features/administration/form/steps/step-one/step-one.component.ts b/src/app/features/administration/form/steps/step-one/step-one.component.ts index 0d47ab62..0158964f 100644 --- a/src/app/features/administration/form/steps/step-one/step-one.component.ts +++ b/src/app/features/administration/form/steps/step-one/step-one.component.ts @@ -17,6 +17,7 @@ export class StepOneComponent implements OnInit { step_max: any; @Input() form: FormGroup; + public environment = environment; constructor( public pollService: PollService, diff --git a/src/app/features/administration/form/steps/step-seven/step-seven.component.html b/src/app/features/administration/form/steps/step-seven/step-seven.component.html index 4fc4e2a9..ed69be9a 100644 --- a/src/app/features/administration/form/steps/step-seven/step-seven.component.html +++ b/src/app/features/administration/form/steps/step-seven/step-seven.component.html @@ -3,16 +3,13 @@

- Voici le résumé de votre sondage + {{ 'resume.title' | translate }}

- En cliquant sur le bouton « Modifier » d’une section vous serez renvoyé à l’étape correspondante de la - création du sondage. Vous devrez repasser par toutes les étapes suivantes. -
- Mais rassurez-vous, vous n’aurez pas à tout remplir à nouveau. + {{ 'resume.description' | translate }}

-

Mes informations générales

+

{{ 'resume.general' | translate }}

{{ pollService.form.value.title }} @@ -22,18 +19,19 @@


- icone crayon Modifier + icone crayon + {{ 'resume.edit' | translate }}

-

Type de sondage

+

{{ 'resume.kind' | translate }}

{{ pollService.form.value.isAboutDate ? 'Date' : 'Propositions' }}
- Modifier + {{ 'resume.edit' | translate }}
-

Mes dates et horaires

+

{{ 'resume.dates_and_hours' | translate }}

    @@ -53,20 +51,20 @@

- Modifier + {{ 'resume.edit' | translate }}
-

Mes paramètres et options de notifications

+

{{ 'resume.params_notifs' | translate }}

Protégé par mot de passe: {{ pollService.form.value.isProtectedByPassword ? 'oui' : 'non' }}

- Modifier + {{ 'resume.edit' | translate }}
-

Mon nom et mon adresse e-mail

+

{{ 'resume.owner' | translate }}

{{ pollService.form.value.creatorPseudo }} @@ -76,7 +74,7 @@

- Modifier + {{ 'resume.edit' | translate }}
diff --git a/src/app/features/administration/form/steps/step-six/step-six.component.html b/src/app/features/administration/form/steps/step-six/step-six.component.html index 454e79c8..93daa2e7 100644 --- a/src/app/features/administration/form/steps/step-six/step-six.component.html +++ b/src/app/features/administration/form/steps/step-six/step-six.component.html @@ -3,21 +3,20 @@

- Dites à vos participants qui vous êtes ! + {{ 'owner.title' | translate }}

- Votre adresse ne sera pas partagée avec les participants du sondage. Elle nous sert uniquement à vous - informer des mises à jour et vous prévenir dès qu'un nouveau vote à eu lieu + {{ 'owner.email_description' | translate }}

diff --git a/src/app/features/administration/form/steps/step-three/step-three.component.html b/src/app/features/administration/form/steps/step-three/step-three.component.html index 33b767d4..dd5900f7 100644 --- a/src/app/features/administration/form/steps/step-three/step-three.component.html +++ b/src/app/features/administration/form/steps/step-three/step-three.component.html @@ -1,14 +1,18 @@
-

Choisissez les dates

- +

+ {{ 'dates.title' | translate }} +

diff --git a/src/app/features/administration/form/steps/step-two/step-two.component.html b/src/app/features/administration/form/steps/step-two/step-two.component.html index 9798052a..91770748 100644 --- a/src/app/features/administration/form/steps/step-two/step-two.component.html +++ b/src/app/features/administration/form/steps/step-two/step-two.component.html @@ -3,40 +3,38 @@
-

+

{{ 'creation.want' | translate }} -

-
-
-
-
- - - -
+ +
+
+
+ icone cal + +
-
-
- - - -
+ +
+ icone chart + + +
diff --git a/src/app/features/administration/form/steps/step-two/step-two.component.scss b/src/app/features/administration/form/steps/step-two/step-two.component.scss index 96441fbb..bdcfddf9 100644 --- a/src/app/features/administration/form/steps/step-two/step-two.component.scss +++ b/src/app/features/administration/form/steps/step-two/step-two.component.scss @@ -1,31 +1,53 @@ @import '../../../../../../styles/variables'; - +.poll-kind { + .title { + margin-bottom: 32px; + font-size: 32px; + line-height: 36.8px; + } +} .kind-of-poll { - margin-top: 5em; min-height: 30vh; + .fa { margin-right: 1em; } + .button { - background: $d-grey; + background: $d-blue30; border: solid white 1px; + border-radius: 8px; transition: background-color ease 1.5s; color: $font-color; - &.is-selected { - background: $secondary_color; - border: solid $primary-color 1px; - color: $white; - label { - color: $white; - } - .fa { - color: $white; - } + margin-bottom: 0.85rem; + padding: 1rem; + + label { + font-weight: 700; + font-size: 14px; + line-height: 16px; } - &:hover { - background: $secondary_color; + + img { + margin-right: 11px; + margin-left: 0; + margin-top: -2px; + height: 18px; + width: 18px; + line-height: 18px; + } + + input[type='radio'] { + width: 24px; + height: 24px; + } + + &.is-selected { + border: solid $primary-color 1px; + } + + &:hover { border: solid $primary-color 1px; - color: $white; transition: background-color ease 0.25s; } } diff --git a/src/app/features/administration/nav-steps/nav-steps.component.html b/src/app/features/administration/nav-steps/nav-steps.component.html index d6b66a5e..9e75bd78 100644 --- a/src/app/features/administration/nav-steps/nav-steps.component.html +++ b/src/app/features/administration/nav-steps/nav-steps.component.html @@ -2,7 +2,7 @@
- - est prêt ! -

- L'événement " {{ pollService.form.value.title }} " est créé. - Vous pouvez inviter vos contacts à y participer en partageant le lien ci-dessous. + + {{ 'success.description' | translate }} + +

-
-
- -
-

Consultez dès maintenant votre sondage

- -
-
-
🎉
-
-
-
-
-
-
-
- Pas de clé d'administration, l'enregistrement du sondage a échoué. vérifiez vos paramètres - réseau. -
-
-

- - {{ 'resume.admins' | translate }} -

- -

- Voici les liens d’accès au sondage, conservez-les soigneusement ! (Si vous les perdez - vous pourrez toujours les recevoir par email) -

-
- Pour accéder au sondage et à tous ses paramètres : -
-
-									{{ pollService.getAdministrationUrlFromForm() }}
-								
- -
-
- - Voir le sondage coté administrateur·ice - - -
-

- Note : Le sondage sera supprimé - {{ pollService.form.value.expiresDaysDelay }} jours après la date de - sa dernière modification. - - Le - {{ - pollService.DateUtilitiesService.addDaysToDate( - pollService.form.value.expiresDaysDelay, - today - ) | date: 'short' - }} - -

-
-
-
-
-
-

- - {{ 'resume.users' | translate }} -

-

- Pour voir le sondage : -
- {{ pollService.getParticipationUrlFromForm() }} - -

-
- -
-
-
-
-
+
+

+ {{ 'success.label' | translate }} +

+
+ +
+ {{ 'success.network_error' | translate }}
diff --git a/src/app/features/administration/success/success.component.ts b/src/app/features/administration/success/success.component.ts index eb1eb58c..11a5adce 100644 --- a/src/app/features/administration/success/success.component.ts +++ b/src/app/features/administration/success/success.component.ts @@ -1,9 +1,12 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input } from '@angular/core'; import { PollService } from '../../../core/services/poll.service'; import { Poll } from '../../../core/models/poll.model'; import { environment } from 'src/environments/environment'; import { Title } from '@angular/platform-browser'; import { DateUtilitiesService } from '../../../core/services/date.utilities.service'; +import { ClipboardService } from 'ngx-clipboard'; +import { ToastService } from '../../../core/services/toast.service'; +import { TranslateService } from '@ngx-translate/core'; @Component({ selector: 'app-success', @@ -16,7 +19,18 @@ export class SuccessComponent { window: any = window; environment = environment; today: Date = new Date(); - constructor(public pollService: PollService, private dateUtils: DateUtilitiesService, private titleService: Title) { + eventTitle: any; + + constructor( + public pollService: PollService, + private dateUtils: DateUtilitiesService, + private _clipboardService: ClipboardService, + private toastService: ToastService, + private translate: TranslateService, + private titleService: Title + ) { + this.eventTitle = pollService.form.value.title; + this.titleService.setTitle( environment.appTitle + ' - 🎉 succès de création de sondage - ' + this.pollService.form.value.title ); @@ -30,7 +44,12 @@ export class SuccessComponent { alert('todo'); } - getExpiracyDateFromPoll(poll: Poll): Date { - return this.dateUtils.addDaysToDate(poll.default_expiracy_days_from_now, new Date()); + /** + * copy public url of new poll + * @param participationUrl + */ + copyText(participationUrl: string) { + this._clipboardService.copyFromContent(participationUrl); + this.toastService.display(this.translate.get('success.copy_message') + ` ${participationUrl}`); } } diff --git a/src/app/features/consultation/consultation.component.html b/src/app/features/consultation/consultation.component.html index 0b229b65..0277c06d 100644 --- a/src/app/features/consultation/consultation.component.html +++ b/src/app/features/consultation/consultation.component.html @@ -3,18 +3,18 @@
- ⚰️ Ce sondage a expiré, il n'est plus possible d'y ajouter de votes ou de commentaires + {{ 'participation.poll_expired' | translate }}
- vous êtes admin de ce sondage et pouvez le modifier + {{ 'participation.you_are_admin' | translate }}
- Vous ne pouvez modifier que votre propre vote à ce sondage + {{ 'participation.edit_only_self' | translate }}
@@ -32,9 +32,12 @@

{{ poll.title }}

{{ poll.description }}

- {{ poll.stacks.length }} votants + {{ poll.stacks.length }} + {{ 'participation.voters' | translate }}
-

author : {{ poll.owner?.pseudo }}

+

+ {{ 'participation.author' | translate }} {{ poll.owner?.pseudo }} +

@@ -55,20 +58,21 @@
+
diff --git a/src/app/shared/components/selectors/language-selector/language-selector.component.html b/src/app/shared/components/selectors/language-selector/language-selector.component.html index ec4f2275..edf389b4 100644 --- a/src/app/shared/components/selectors/language-selector/language-selector.component.html +++ b/src/app/shared/components/selectors/language-selector/language-selector.component.html @@ -17,6 +17,7 @@ + ({{ availableLanguages.length }} availableLanguages)