Compare commits

...

97 Commits

Author SHA1 Message Date
Thomas Citharel
19bec88184 Merge branch 'docker' into 'develop'
Introduce Docker Image

See merge request framasoft/framadate!314
2018-07-12 15:57:37 +02:00
Thomas Citharel
8f115461e1 Introduce dev Docker Compose
Signed-off-by: Thomas Citharel <tcit@tcit.fr>

Run migrations on entrypoint

Signed-off-by: Thomas Citharel <tcit@tcit.fr>

Finalize Docker configuration

Signed-off-by: Thomas Citharel <tcit@tcit.fr>

turn on pretty urls

Signed-off-by: Thomas Citharel <tcit@tcit.fr>

Make framadate await database container

Signed-off-by: Thomas Citharel <tcit@tcit.fr>

Add missing rewrite rule to apache config

Signed-off-by: Thomas Citharel <tcit@tcit.fr>

Finalize

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-07-12 15:31:57 +02:00
Thomas Citharel
d8123634fa Disable zanata also on beta
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-07-11 14:07:34 +02:00
Thomas Citharel
8dcfb0d494 Disable everything Zanata related for now
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-07-11 14:05:25 +02:00
Thomas Citharel
e7d5b1762e Merge tag '1.1.7' into develop 2018-07-09 15:53:59 +02:00
Thomas Citharel
f861b77326 Merge tag '1.1.6' into develop 2018-07-09 12:26:38 +02:00
Thomas Citharel
c4b562d016 Merge tag '1.1.5' into develop 2018-07-09 11:25:41 +02:00
Thomas Citharel
a5373818fb Fix Gitlab push-trads
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-06-22 12:08:43 +02:00
Thomas Citharel
f1678c1744 Update locales
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-06-22 11:43:07 +02:00
Thomas Citharel
3438635cda Add contribution guide 2018-06-11 13:17:31 +02:00
Thomas Citharel
f8f4cc6076 Merge branch 'secure-push-trad-to-zanata' into 'develop'
Secure push-trad-to-zanata

Closes #331

See merge request framasoft/framadate!326
2018-05-28 10:04:27 +02:00
Thomas Citharel
4b8fe75f95
Secure push-trad-to-zanata
Test json files with python module to make sure they're valid before converting them to po

Signed-off-by: Thomas Citharel <tcit@tcit.fr>

Remove &&
2018-05-28 10:03:05 +02:00
Thomas Citharel
149b64e3b0 Merge branch 'fix-markdown-in-previews' into 'develop'
Also handle the graph

See merge request framasoft/framadate!324
2018-05-25 19:41:13 +02:00
Thomas Citharel
ce11049630
Also handle the graph
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-05-25 19:40:05 +02:00
Thomas Citharel
f656c790d0 Merge branch 'fix-markdown-in-previews' into 'develop'
Properly handle markdown choices inside titles, if no text as fallback, use the…

Closes #326

See merge request framasoft/framadate!323
2018-05-25 19:35:20 +02:00
Thomas Citharel
14053d20c9
Handle markdown properly in the best choices section
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-05-25 19:34:36 +02:00
Thomas Citharel
92f699337f
Properly handle markdown choices inside titles, if no text as fallback, use the number of the choice column
Also, unrelated, but finally disabled smarty caching on php's build-in server

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-05-25 19:24:54 +02:00
Thomas Citharel
af760cf273
Add checks on session
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-05-25 18:16:22 +02:00
Thomas Citharel
f4c901d6cd
Typo
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-05-25 18:05:19 +02:00
Thomas Citharel
b04f95f0e1 Merge branch 'split-create-poll-form' into 'develop'
Split create poll form

See merge request framasoft/framadate!322
2018-05-25 17:39:26 +02:00
Thomas Citharel
bd748e5da7
Split the create poll (step 1) template into parts
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-05-25 17:37:48 +02:00
Thomas Citharel
e793a77b2a
Update locales
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-05-25 16:25:35 +02:00
Thomas Citharel
e078e2d22b
Update locales
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-05-25 16:18:38 +02:00
Thomas Citharel
52bc066b05
Fix json translation file that deleted the whole zanata document 🙈
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-05-25 16:02:56 +02:00
Thomas Citharel
4b394e9546 Merge branch 'add-sendmail-option' into 'develop'
Introduce an use_sendmail option

See merge request framasoft/framadate!321
2018-05-25 15:51:31 +02:00
Thomas Citharel
d6c2f01457
Introduce an use_sendmail option
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-05-25 15:50:35 +02:00
Thomas Citharel
7305c0f89c Merge branch 'add-missing-migration' into 'develop'
Add a missing migration back

See merge request framasoft/framadate!320
2018-05-25 15:20:42 +02:00
Thomas Citharel
2cd54d9c4d
Add a missing migration back
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-05-25 15:18:56 +02:00
Thomas Citharel
964952433c Merge branch 'JMarlow/framadate-Justine/Issue2' into 'develop'
J marlow/framadate justine/issue2

Closes #324

See merge request framasoft/framadate!319
2018-05-25 12:39:18 +02:00
Thomas Citharel
4c0c2a16f9
Small fixes
Change CollectMail class name, add a title on voters name in admin with email value

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-05-25 12:36:18 +02:00
Meteor-Furet
e6716bc745
MAJ table_vote_classic et table_vote_date + passage option 3 de collect_users_mail en disabled car non implémenté 2018-05-25 11:40:05 +02:00
Meteor-Furet
b5ce4baf60
MAJ poll_info.tpl 2018-05-25 11:39:30 +02:00
Meteor-Furet
feb0c1e6ce
Modification collect_users_mail de bool à int (MAJ de la création d'un sondage) 2018-05-25 11:39:28 +02:00
Thomas Citharel
bcd5acdea5 Merge branch 'chrosey/framadate-develop' into 'develop'
Chrosey/framadate develop

See merge request framasoft/framadate!318
2018-05-25 10:59:18 +02:00
Thomas Citharel
2e3fe1dcd3
Small fixes
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-05-25 10:57:46 +02:00
chrosey
ad450e2798
fixed classic_poll.js to work again
fix typo

Signed-off-by: Thomas Citharel <tcit@tcit.fr>

Fixed typo

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-05-25 10:40:40 +02:00
chrosey
141e9105be
refactored create_classic_poll and put step_2 view into own tpl file 2018-05-25 10:35:46 +02:00
chrosey
fad662e09a
renamed poll_step_3.tpl 2018-05-25 10:29:48 +02:00
Thomas Citharel
586e59e23f Merge branch 'fix-session' into 'develop'
Fix session

Closes #255

See merge request framasoft/framadate!317
2018-05-25 10:28:25 +02:00
Thomas Citharel
d5f0f5a289 Merge branch 'develop' into 'develop'
Fix missing beginTransaction()

See merge request framasoft/framadate!315
2018-05-24 17:57:45 +02:00
Thomas Citharel
442fd174e9
Fix session by serializing the form object
Signed-off-by: Thomas Citharel <tcit@tcit.fr>

Fixup !

Signed-off-by: Thomas Citharel <tcit@tcit.fr>

Fixup

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-05-24 17:55:40 +02:00
Thomas Citharel
081a32b1bb
Merge branch 'mosterdt/framadate-bug/restrict-custom-url' into develop 2018-05-19 08:59:56 +02:00
Thomas De Backer
5951519ad8
restrict custom urls
fixed coding standard issues

added error message to locale

Remove unecessary variable

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-05-19 08:59:30 +02:00
PICHOU Kyâne
a64e182076 Fix missing beginTransaction() 2018-05-16 21:55:54 +02:00
Thomas Citharel
823c41d2e4
Update locales
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-05-15 08:55:34 +02:00
Thomas Citharel
f28198e497 Merge branch 'feature/warn-wrong-customized-url' into 'develop'
Warn when url has a wrong format

See merge request framasoft/framadate!311
2018-05-14 19:02:51 +02:00
Thomas Citharel
fe93733872
fix typo
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-04-23 10:40:18 +02:00
Thomas Citharel
5631167ca7 Merge branch 'dbal-fixes' into 'develop'
Couple of fixes following DBAL migration

See merge request framasoft/framadate!312
2018-04-23 10:30:10 +02:00
Thomas Citharel
87a61ebea3
Couple of fixes following DBAL migration
* Make sure we save timestamp as a string (🙈) inside slot table
* Make sure to set poll format properly at creation
* More Repository methods use DBAL specifics
* Clear legacy check all tables call

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-04-23 10:27:15 +02:00
Thomas Citharel
b008bfea9b
Update locales
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-04-23 09:07:18 +02:00
Thomas Citharel
3ba045791f Merge branch 'dbal' into 'develop'
Make Framadate compatible with PostgreSQL and great again !

Closes #90 et #179

See merge request framasoft/framadate!305
2018-04-22 18:55:55 +02:00
Thomas Citharel
7f41eb831c
Remove class FramaDB and unused call
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-04-22 18:45:30 +02:00
Thomas Citharel
006a191544
Make Framadate compatible with PostgreSQL and great again !
* Move the database handling to Doctrine DBAL
* Move Migrations to Doctrine Migrations
* Rename migrations for Doctrine Migrations Uses
* Fix Migrations
* Change config parameters, introduce db name, host and port parameters and get rid of database url
* Change install form for this
* Add a CLI command to make migrations
* Add config.test.php to be used with APP_ENV=test for testing

Signed-off-by: Thomas Citharel <tcit@tcit.fr>

CS

Signed-off-by: Thomas Citharel <tcit@tcit.fr>

Add sqlite to CI and execute migration in test env

Signed-off-by: Thomas Citharel <tcit@tcit.fr>

Typo

Signed-off-by: Thomas Citharel <tcit@tcit.fr>

SQLite is already inside the image...

Signed-off-by: Thomas Citharel <tcit@tcit.fr>

Rebase two new migrations

Signed-off-by: Thomas Citharel <tcit@tcit.fr>

Move from trait to abstract class and remove legacy migration table after checks

Signed-off-by: Thomas Citharel <tcit@tcit.fr>

CS

Signed-off-by: Thomas Citharel <tcit@tcit.fr>

Move doctrine command path inside CI

Signed-off-by: Thomas Citharel <tcit@tcit.fr>

Move abstract migration class to correct namespace and remove unused command

Signed-off-by: Thomas Citharel <tcit@tcit.fr>

CS

Signed-off-by: Thomas Citharel <tcit@tcit.fr>

Check for legacy migration table existence

Signed-off-by: Thomas Citharel <tcit@tcit.fr>

Check if legacy migration table exists before deleting it

Signed-off-by: Thomas Citharel <tcit@tcit.fr>

Add messages for skipped migrations and fix an issue with MySQL ERR_NO_DATE Migration

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-04-22 18:37:53 +02:00
Quentin Dupont
235002cd24 Warn when url has a wrong format 2018-04-22 12:54:12 +02:00
Thomas Citharel
c4e9cb59d3 Merge branch 'bug/button-create-poll-step-2' into 'develop'
bug/button-create-poll-step-2

See merge request framasoft/framadate!308
2018-04-21 11:56:56 +02:00
m
8e8ffedc4a bug/button-create-poll-step-2 2018-04-20 20:11:10 +02:00
Thomas Citharel
2b351bc3d1
Update locales
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-04-20 14:31:18 +02:00
Thomas Citharel
17c264721e Merge branch 'bug/send-comment-button' into 'develop'
Bug/send comment button

See merge request framasoft/framadate!307
2018-04-20 09:24:37 +02:00
m
e379b58d58 bug/send-comment-button 2018-04-20 09:17:37 +02:00
m
b2a550d09b Merge branch 'develop' of https://framagit.org/framasoft/framadate into develop 2018-04-19 21:53:28 +02:00
Thomas Citharel
0409256588 Merge branch 'Justine/Issue1' into 'develop'
Collecting polled users emails

Closes #38

See merge request framasoft/framadate!266
2018-04-19 16:55:21 +02:00
Thomas Citharel
abec2cb6a3
Refactor and fix indentation a bit, add a <pre> section for email collection and string changes
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-04-19 16:53:54 +02:00
Thomas Citharel
b24cc43c85 Merge branch 'bug/better-handle-undefined-config-values' into 'develop'
Bug/better handle undefined config values

See merge request framasoft/framadate!304
2018-04-19 15:33:56 +02:00
Thomas Citharel
4c4fb1557f Merge branch 'feature/ask-name-and-comment-before-sending' into 'develop'
feature/ask name and comment before sending

See merge request framasoft/framadate!285
2018-04-19 15:21:49 +02:00
m
0841675577
ask name and comment before sending comment
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-04-19 15:12:13 +02:00
Thomas Citharel
aa690bb6d8
Update locales
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-04-19 14:52:41 +02:00
Thomas Citharel
06c3a8a078 Merge branch 'bug/create-date-poll-step-2' into 'develop'
Bug/create date poll step 2

See merge request framasoft/framadate!302
2018-04-19 14:20:54 +02:00
m
41578b19c8
error on date poll creation
https://framagit.org/framasoft/framadate/issues/318

code style

modify error message on session expiration

new local text

remove empty string
2018-04-19 14:19:24 +02:00
m
81092482af Merge branch 'develop' of https://framagit.org/framasoft/framadate into develop 2018-04-19 14:14:42 +02:00
Thomas Citharel
290ec002d5 Merge branch 'feature/files-cleaning' into 'develop'
Feature/files cleaning

See merge request framasoft/framadate!306
2018-04-19 14:06:16 +02:00
m
3330d28f29
nettoyage de printemps
clean type test
2018-04-19 14:05:22 +02:00
m
fb7c5e2f12 fork-awesome enabled by default 2018-04-18 17:05:20 +02:00
m
cc0f572335 Better handle undefined config values
https://framagit.org/framasoft/framadate/issues/322
2018-04-18 16:49:02 +02:00
m
0b598b8e80 Merge branch 'develop' of https://framagit.org/framasoft/framadate into develop 2018-04-18 16:14:33 +02:00
Thomas Citharel
2627dc2ae6
Fixup for find_polls with empty localstorage
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-04-18 13:33:38 +02:00
Thomas Citharel
1a3081b58d Merge branch 'save-poll-localstorage' into 'develop'
Implement saving polls in localstorage and finding them

Closes #235

See merge request framasoft/framadate!283
2018-04-18 13:12:49 +02:00
Thomas Citharel
685d8b5e3d
Move VueJS template to x-template DOM and update strings
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-04-18 13:11:17 +02:00
Thomas Citharel
7a12d98943
Handle localstorage empty or failure properly
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-04-18 12:46:02 +02:00
Thomas Citharel
c1ea6ae2a8
Implement saving polls in localstorage and finding them
Also, this brings VueJS and MomentJS in Framadate, 🍾 🎉

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-04-18 12:46:01 +02:00
JMarlow
68d5b64180
Collecting Polled Users Emails
Modification de la BDD : ajout de la colonne mail dans la table vote

Modification de la BDD : ajout de la colonne mail dans la table vote (bis)

MAJ de VoteRepository : méthode insert et update

MAJ de PollService : méthodes updateVote, addVote et splitVotes

Modification studs.php, adminstuds.php et vote_table_date.tpl : OK pour l'ajout d'un vote avec nom + mail

Modification de vote_table_classic.tpl : OK pour l'ajout d'un vote avec nom + mail

Ajout d'un bouton enveloppe pour chaque colonne avec méthode de traitement pour test

Le numéro de la colonne est enfin récupéré correctement

Implémentation récupération des adresses mails des sondés intéressants dans adminstuds.php et appel d'un fichier display_mails.tpl qui affichent ces adresses mails.

Extension du traitement pour les sondages classic

Ajout récupération des adresses des non aussi, et ajouts de tests pour l'affichage

Changement des input type=text en type=email

Corrections automatiques pour passage pipelines

Corrections suite aux remarques sur la merge request

Corrections 2 suite aux remarques sur la merge request

Corrections 3 suite aux remarques sur la merge request

Modif BDD : ajout colonne collect_mail dans poll

Modif classes Form, PollRepository

Passage de la collecte des mails des sondés en fonctionalité optionnelle

Si la collecte de mail est activée, la saisie du mail est obligatoire

Ajout avertissements collect_mail + editableByAll dans création de sondage et tableaux de vote

Update create poll string and put a danger background on warning

Signed-off-by: Thomas Citharel <tcit@tcit.fr>

Translation strings updated and better position for the email public warning message

Also, a CSS tweak and cleanup

Signed-off-by: Thomas Citharel <tcit@tcit.fr>

CS

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-04-18 12:34:08 +02:00
Thomas Citharel
6dd8fb1723 Merge branch 'feature/clean-demo-poll' into 'develop'
Feature/clean demo poll

See merge request framasoft/framadate!297
2018-04-18 11:13:27 +02:00
Luc Didry
b89622695e [i18n] Update translations 2018-04-17 11:56:52 +02:00
Luc Didry
7d9f5becec Add script to add a key/value in locale/en.json + put all scripts in scripts/ 2018-04-17 11:46:15 +02:00
m
5b2a40ac58 Merge remote-tracking branch 'framadate/develop' into develop 2018-04-16 07:32:46 +02:00
m
0f4587adf8 less often demo cleaning 2018-04-15 23:30:40 +02:00
Thomas Citharel
3878c3ce7c Merge branch 'fork-awesome' into 'develop'
Fork awesome

See merge request framasoft/framadate!300
2018-04-15 12:19:31 +02:00
Thomas Citharel
a004576592
Provide Fork-Awesome and add an option to disable it (should be useful on installations with Framanav)
Signed-off-by: Thomas Citharel <tcit@tcit.fr>

Use fork-awesome minified css

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-04-15 12:17:35 +02:00
m
081fdae5f5 code style 2018-04-15 11:59:40 +02:00
Thomas Citharel
8528a7fe65
Update version to 1.2.0 on develop
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-04-15 11:41:03 +02:00
Thomas Citharel
c723c81697 Merge branch 'bug/error-on-empty-choices' into 'develop'
Bug/error on empty choices - 1.1.0

See merge request framasoft/framadate!298
2018-04-15 11:29:27 +02:00
m
afd83efd79
bug/error-on-empty-choices 2018-04-15 11:28:27 +02:00
m
00b871df5c nettoyage du sondage de démonstration
https://framagit.org/framasoft/framadate/issues/316
2018-04-14 08:48:24 +02:00
m
3b54590bde IC 2018-04-13 21:26:00 +02:00
m
6455f4be87 nettoyage du sondage de démonstration
https://framagit.org/framasoft/framadate/issues/316
2018-04-13 21:24:43 +02:00
Thomas Citharel
83ba53dffa Merge branch 'doc/deprecate-changelog' into 'develop'
Deprecate CHANGELOG.md

See merge request framasoft/framadate!296
2018-04-12 23:53:57 +02:00
framartin
94f7288446 deprecate CHANGELOG.md 2018-04-12 18:37:46 -03:00
m
f9c3cde701 Merge remote-tracking branch 'framadate/develop' into develop 2018-04-09 22:13:15 +02:00
126 changed files with 7083 additions and 3222 deletions

1
.gitignore vendored
View File

@ -24,3 +24,4 @@ Thumbs.db
.project
.idea/
*.iml
test_database.sqlite

View File

@ -12,24 +12,25 @@ test:
- composer install -o --no-interaction --no-progress --prefer-dist
- mkdir tpl_c
- php vendor/bin/php-cs-fixer fix --verbose --dry-run
- APP_ENV=test bin/doctrine migrations:migrate --no-interaction -vvv
- vendor/bin/phpunit --bootstrap app/tests/bootstrap.php --debug app/tests
cache:
paths:
- vendor/
check-trad:
stage: test
allow_failure: true
script:
- if [ -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then echo "*** Unable to check if translations need to be pulled, exiting ***"; exit 1; fi
- export ORIG=$(git diff-files --shortstat)
- if [ ! -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then mkdir -p ${HOME}/.config; echo -e "${ZANATA_CONFIG_FRAMABOT}" > ${HOME}/.config/zanata.ini; fi
- if [ ! -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then make push-locales; fi
- git status > /dev/null 2>&1
- export CHANGES=$(git diff-files --shortstat)
- if [[ $CHANGES != $ORIG ]]; then echo "*** There is changes in locales ***"; echo "*** You need to do `make pull-locales` in your repo ***"; exit 1; fi
only:
- develop
# check-trad:
# stage: test
# allow_failure: true
# script:
# - if [ -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then echo "*** Unable to check if translations need to be pulled, exiting ***"; exit 1; fi
# - export ORIG=$(git diff-files --shortstat)
# - if [ ! -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then mkdir -p ${HOME}/.config; echo -e "${ZANATA_CONFIG_FRAMABOT}" > ${HOME}/.config/zanata.ini; fi
# - if [ ! -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then make push-locales; fi
# - git status > /dev/null 2>&1
# - export CHANGES=$(git diff-files --shortstat)
# - if [[ $CHANGES != $ORIG ]]; then echo "*** There is changes in locales ***"; echo "*** You need to do `make pull-locales` in your repo ***"; exit 1; fi
# only:
# - develop
# Create artifacts on master
pages:
@ -62,8 +63,8 @@ beta:
- git checkout develop
- composer install -o --no-interaction --no-progress --prefer-dist --no-dev
- composer dump-autoload --optimize --no-dev --classmap-authoritative
- if [ ! -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then mkdir -p ${HOME}/.config; echo -e "${ZANATA_CONFIG_FRAMABOT}" > ${HOME}/.config/zanata.ini; fi
- if [ ! -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then make pull-locales; fi
# - if [ ! -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then mkdir -p ${HOME}/.config; echo -e "${ZANATA_CONFIG_FRAMABOT}" > ${HOME}/.config/zanata.ini; fi
# - if [ ! -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then make pull-locales; fi
- mkdir tpl_c
- mkdir .public
- cp -r * .public
@ -98,11 +99,11 @@ funky:
- funky
# Push new translations strings to https://trad.framasoft.org
trads:
stage: deploy
image: framasoft/push-trad:latest
script:
- if [ ! -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then mkdir -p ${HOME}/.config; echo -e "${ZANATA_CONFIG_FRAMABOT}" > ${HOME}/.config/zanata.ini; fi
- if [ ! -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then make push-locales; fi
only:
- develop
# trads:
# stage: deploy
# image: framasoft/push-trad:latest
# script:
# - if [ ! -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then mkdir -p ${HOME}/.config; echo -e "${ZANATA_CONFIG_FRAMABOT}" > ${HOME}/.config/zanata.ini; fi
# - if [ ! -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then make push-locales; fi
# only:
# - develop

View File

@ -38,7 +38,8 @@ return PhpCsFixer\Config::create()
->exclude([
'vendor',
'var',
'web'
'web',
'tpl_c',
])
->in(__DIR__)
)

View File

@ -1,3 +1,7 @@
This changelog file is **deprecated**. For an up-to-date changelog, please check [the tags](https://framagit.org/framasoft/framadate/tags).
---------------------
# Changelog de framadate
## Version 1.0 (Erik - Markus - Ecmu - Julien - Imre - Luc - Pierre - Antonin - Olivier)

7
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,7 @@
# Contributing
Please report issues on <https://framagit.org/framasoft/framadate/issues>
If you made a change and want it to be available in official repository, merge requests are welcome!
Read the [guidelines](https://framagit.org/framasoft/framadate/wikis/coding) to submit your changes.

View File

@ -1,12 +1,22 @@
locales:
json2po -P -i locale/en.json -t locale/en.json -o po/framadate.pot
scripts/locales.sh
push-locales: locales
zanata-cli -q -B push
zanata-cli -q -B push --errors
pull-locales:
zanata-cli -q -B pull --min-doc-percent 50
./.po2json.sh
scripts/po2json.sh
stats-locales:
zanata-cli -q stats
push-trad-to-zanata:
scripts/push-trad-to-zanata.sh $(filter-out $@,$(MAKECMDGOALS))
add-key-locales:
scripts/locale-add-key.pl "$(subst ",\",$(filter-out $@,$(MAKECMDGOALS)))"
# empty targets to be able to use MAKECMDGOALS as arguments to scripts
%:
@:

View File

@ -42,7 +42,7 @@ $is_admin = false;
$logService = new LogService();
$pollService = new PollService($connect, $logService);
$inputService = new InputService();
$mailService = new MailService($config['use_smtp'], $config['smtp_options']);
$mailService = new MailService($config['use_smtp'], $config['smtp_options'], $config['use_sendmail']);
$notificationService = new NotificationService($mailService);
$securityService = new SecurityService();

View File

@ -28,7 +28,7 @@ include_once __DIR__ . '/../app/inc/init.php';
$logService = new LogService();
$sessionService = new SessionService();
$mailService = new MailService($config['use_smtp'], $config['smtp_options']);
$mailService = new MailService($config['use_smtp'], $config['smtp_options'], $config['use_sendmail']);
$pollService = new PollService($connect, $logService);
$result = false;

29
admin/cleanDemo.php Normal file
View File

@ -0,0 +1,29 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
use Framadate\Services\LogService;
use Framadate\Services\PurgeService;
include_once __DIR__ . '/../app/inc/init.php';
$logService = new LogService();
$purgeService = new PurgeService($connect, $logService);
$purgeService->cleanDemoPoll();

View File

@ -17,112 +17,64 @@
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
use Framadate\Migration\AddColumn_hidden_In_poll_For_0_9;
use Framadate\Migration\AddColumn_receiveNewComments_For_0_9;
use Framadate\Migration\AddColumn_uniqId_In_vote_For_0_9;
use Framadate\Migration\AddColumn_ValueMax_In_poll_For_1_1;
use Framadate\Migration\AddColumns_password_hash_And_results_publicly_visible_In_poll_For_0_9;
use Framadate\Migration\Alter_Comment_table_adding_date;
use Framadate\Migration\Alter_Comment_table_for_name_length;
use Framadate\Migration\Fix_MySQL_No_Zero_Date;
use Framadate\Migration\From_0_0_to_0_8_Migration;
use Framadate\Migration\From_0_8_to_0_9_Migration;
use Framadate\Migration\Generate_uniqId_for_old_votes;
use Framadate\Migration\Increase_pollId_size;
use Framadate\Migration\Migration;
use Framadate\Migration\RPadVotes_from_0_8;
use Doctrine\DBAL\Migrations\Configuration\Configuration;
use Doctrine\DBAL\Migrations\Migration;
use Doctrine\DBAL\Migrations\OutputWriter;
use Doctrine\DBAL\Migrations\Tools\Console\Helper\MigrationStatusInfosHelper;
use Framadate\Utils;
include_once __DIR__ . '/../app/inc/init.php';
require_once __DIR__ . '/../app/inc/init.php';
set_time_limit(300);
class MigrationLogger {
private $log;
// List a Migration sub classes to execute
$migrations = [
new From_0_0_to_0_8_Migration(),
new From_0_8_to_0_9_Migration(),
new AddColumn_receiveNewComments_For_0_9(),
new AddColumn_uniqId_In_vote_For_0_9(),
new AddColumn_hidden_In_poll_For_0_9(),
new AddColumn_ValueMax_In_poll_For_1_1(),
new Generate_uniqId_for_old_votes(),
new RPadVotes_from_0_8(),
new Alter_Comment_table_for_name_length(),
new Alter_Comment_table_adding_date(),
new AddColumns_password_hash_And_results_publicly_visible_In_poll_For_0_9(),
new Increase_pollId_size(),
new AddColumn_ValueMax_In_poll_For_1_1(),
new Fix_MySQL_No_Zero_Date(),
];
// ---------------------------------------
// Check if MIGRATION_TABLE already exists
/** @var \Framadate\FramaDB $connect */
$tables = $connect->allTables();
$pdo = $connect->getPDO();
$prefixedMigrationTable = Utils::table(MIGRATION_TABLE);
if (!in_array($prefixedMigrationTable, $tables, true)) {
$pdo->exec('
CREATE TABLE IF NOT EXISTS `' . $prefixedMigrationTable . '` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` TEXT NOT NULL,
`execute_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
)
ENGINE = MyISAM
DEFAULT CHARSET = utf8;');
public function __construct()
{
$this->log = '';
}
$selectStmt = $pdo->prepare('SELECT id FROM `' . $prefixedMigrationTable . '` WHERE name=?');
$insertStmt = $pdo->prepare('INSERT INTO `' . $prefixedMigrationTable . '` (name) VALUES (?)');
$countSucceeded = 0;
$countFailed = 0;
$countSkipped = 0;
// Loop on every Migration sub classes
$success = [];
$fail = [];
foreach ($migrations as $migration) {
$className = get_class($migration);
// Check if $className is a Migration sub class
if (!$migration instanceof Migration) {
$smarty->assign('error', 'The class ' . $className . ' is not a sub class of Framadate\\Migration\\Migration.');
$smarty->display('error.tpl');
exit;
public function addLine($message)
{
$this->log .= $message . "\n";
}
// Check if the Migration is already executed
$selectStmt->execute([$className]);
$executed = $selectStmt->rowCount();
$selectStmt->closeCursor();
if (!$executed && $migration->preCondition($pdo)) {
$migration->execute($pdo);
if ($insertStmt->execute([$className])) {
$countSucceeded++;
$success[] = $migration->description();
} else {
$countFailed++;
$fail[] = $migration->description();
}
} else {
$countSkipped++;
public function getLog()
{
return $this->log;
}
}
$countTotal = $countSucceeded + $countFailed + $countSkipped;
$executing = false;
$migration = null;
$output = '';
$smarty->assign('success', $success);
$smarty->assign('fail', $fail);
if (isset($_POST['execute'])) {
$executing = true;
}
$smarty->assign('countSucceeded', $countSucceeded);
$smarty->assign('countFailed', $countFailed);
$smarty->assign('countSkipped', $countSkipped);
$smarty->assign('countTotal', $countTotal);
$smarty->assign('time', $total_time = round((microtime(true)-$_SERVER['REQUEST_TIME_FLOAT']), 4));
$migrationsDirectory = __DIR__ . '/../app/classes/Framadate/Migrations';
$log = new MigrationLogger();
$configuration = new Configuration($connect, new OutputWriter(function ($message) use ($log) {
$log->addLine($message);
}));
$configuration->setMigrationsTableName(Utils::table(MIGRATION_TABLE) . '_new');
$configuration->setMigrationsDirectory($migrationsDirectory);
$configuration->setMigrationsNamespace('DoctrineMigrations');
$configuration->registerMigrationsFromDirectory($migrationsDirectory);
if ($executing) {
$migration = new Migration($configuration);
$migration->migrate();
$output = trim(strip_tags($log->getLog()));
}
$infos = (new MigrationStatusInfosHelper($configuration))->getMigrationsInfos();
$smarty->assign('countTotal', $infos['Available Migrations']);
$smarty->assign('countExecuted', $infos['Executed Migrations']);
$smarty->assign('countWaiting', $infos['New Migrations']);
$smarty->assign('executing', $executing);
$smarty->assign('title', __('Admin', 'Migration'));
$smarty->assign('output', $output);
$smarty->assign('time', round((microtime(true)-$_SERVER['REQUEST_TIME_FLOAT']), 4));
$smarty->display('admin/migration.tpl');

View File

@ -50,7 +50,7 @@ $logService = new LogService();
$pollService = new PollService($connect, $logService);
$adminPollService = new AdminPollService($connect, $pollService, $logService);
$inputService = new InputService();
$mailService = new MailService($config['use_smtp'], $config['smtp_options']);
$mailService = new MailService($config['use_smtp'], $config['smtp_options'], $config['use_sendmail']);
$notificationService = new NotificationService($mailService);
$sessionService = new SessionService();
@ -219,6 +219,11 @@ $selectedNewVotes = [];
if (!empty($_POST['save'])) { // Save edition of an old vote
$name = $inputService->filterName($_POST['name']);
if(empty($_POST['mail']) || $inputService->filterMail($_POST['mail'])===false) {
$mail = null;
} else {
$mail = $inputService->filterMail($_POST['mail']);
}
$editedVote = filter_input(INPUT_POST, 'save', FILTER_VALIDATE_INT);
$choices = $inputService->filterArray($_POST['choices'], FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => CHOICE_REGEX]]);
$slots_hash = $inputService->filterMD5($_POST['control']);
@ -233,7 +238,7 @@ if (!empty($_POST['save'])) { // Save edition of an old vote
if ($message === null) {
// Update vote
try {
$result = $pollService->updateVote($poll_id, $editedVote, $name, $choices, $slots_hash);
$result = $pollService->updateVote($poll_id, $editedVote, $name, $choices, $slots_hash, $mail);
if ($result) {
$message = new Message('success', __('adminstuds', 'Vote updated'));
} else {
@ -249,6 +254,11 @@ if (!empty($_POST['save'])) { // Save edition of an old vote
}
} elseif (isset($_POST['save'])) { // Add a new vote
$name = $inputService->filterName($_POST['name']);
if(empty($_POST['mail']) || $inputService->filterMail($_POST['mail'])===false) {
$mail = null;
} else {
$mail = $inputService->filterMail($_POST['mail']);
}
$choices = $inputService->filterArray($_POST['choices'], FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => CHOICE_REGEX]]);
$slots_hash = $inputService->filterMD5($_POST['control']);
@ -262,7 +272,7 @@ if (!empty($_POST['save'])) { // Save edition of an old vote
if ($message === null) {
// Add vote
try {
$result = $pollService->addVote($poll_id, $name, $choices, $slots_hash);
$result = $pollService->addVote($poll_id, $name, $choices, $slots_hash, $mail);
if ($result) {
$message = new Message('success', __('adminstuds', 'Vote added'));
} else {
@ -398,6 +408,37 @@ if (isset($_GET['delete_column'])) {
}
}
// -------------------------------
// Collect the mails of a column
// -------------------------------
if (isset($_GET['collect_mail'])) {
$column_str = strval(filter_input(INPUT_GET, 'collect_mail', FILTER_DEFAULT));
$column_str = strval(Utils::base64url_decode($column_str));
$column = intval($column_str);
$votes = $pollService->splitVotes($pollService->allVotesByPollId($poll_id));
$mails_yes = $mails_ifneedbe = $mails_no = [];
foreach ($votes as $vote) {
if (intval($vote->choices[$column]) === 2 && $vote->mail !== NULL) {
$mails_yes[] = $vote->mail;
} elseif (intval($vote->choices[$column]) === 1 && $vote->mail !== NULL) {
$mails_ifneedbe[] = $vote->mail;
} elseif($vote->mail !== NULL) {
$mails_no[] = $vote->mail;
}
}
$smarty->assign('poll_id', $poll_id);
$smarty->assign('admin_poll_id', $admin_poll_id);
$smarty->assign('admin', true);
$smarty->assign('title', __('Generic', 'Poll') . ' - ' . $poll->title . ' - ' . __('adminstuds', 'Collect the emails of the polled users for the choice'));
$smarty->assign('mails_yes', $mails_yes);
$smarty->assign('mails_ifneedbe', $mails_ifneedbe);
$smarty->assign('mails_no', $mails_no);
$smarty->display('display_mails.tpl');
exit;
}
// -------------------------------
// Add a slot
// -------------------------------

View File

@ -0,0 +1,54 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace Framadate;
use Doctrine\DBAL\Migrations\AbstractMigration as DoctrineAbstractMigration;
use Doctrine\DBAL\Schema\Schema;
abstract class AbstractMigration extends DoctrineAbstractMigration
{
/**
* @param Schema $schema
* @param $class
* @throws \Doctrine\DBAL\DBALException
* @throws \Doctrine\DBAL\Schema\SchemaException
* @return bool
*/
public function legacyCheck(Schema $schema, $class)
{
/**
* If there's no legacy table, we can go on
*/
if (!$schema->hasTable(Utils::table(MIGRATION_TABLE))) {
return false;
}
$migration_table = $schema->getTable(Utils::table(MIGRATION_TABLE));
/**
* We check the migration table
*/
if ($migration_table->hasColumn('name')) {
/** @var $stmt \Doctrine\DBAL\Driver\Statement */
$stmt = $this->connection->prepare('SELECT * FROM ' . Utils::table(MIGRATION_TABLE) . ' WHERE name = ?');
$stmt->execute([$class]);
return $stmt->rowCount() > 0;
}
return false;
}
}

View File

@ -0,0 +1,35 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace Framadate;
/**
* Class CollectMail
*
* Is used to specify the poll's edition permissions.
* @TODO : wait to use the SplEnum
*
* @package Framadate
*/
class CollectMail { // extends SplEnum
const NO_COLLECT = 0;
const COLLECT = 1;
const COLLECT_REQUIRED = 2;
const COLLECT_REQUIRED_VERIFIED = 3;
}

View File

@ -82,13 +82,21 @@ class Form
*/
public $results_publicly_visible;
/**
* Tells if voters email addresses are collected or not.
* @var \Framadate\CollectMail
*/
public $collect_users_mail;
/**
* List of available choices
*/
private $choices;
public function __construct(){
public function __construct()
{
$this->editable = Editable::EDITABLE_BY_ALL;
$this->collect_users_mail = CollectMail::NO_COLLECT;
$this->clearChoices();
}

View File

@ -1,85 +0,0 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace Framadate;
use PDO;
class FramaDB {
/**
* PDO Object, connection to database.
*/
private $pdo = null;
function __construct($connection_string, $user, $password) {
$this->pdo = new \PDO($connection_string, $user, $password);
$this->pdo->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_OBJ);
$this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
}
/**
* @return \PDO Connection to database
*/
function getPDO() {
return $this->pdo;
}
/**
* Find all tables in database.
*
* @return array The array of table names
*/
function allTables() {
$result = $this->pdo->query('SHOW TABLES');
$schemas = $result->fetchAll(\PDO::FETCH_COLUMN);
return $schemas;
}
function prepare($sql) {
return $this->pdo->prepare($sql);
}
function beginTransaction() {
$this->pdo->beginTransaction();
}
function commit() {
$this->pdo->commit();
}
function rollback() {
$this->pdo->rollback();
}
function errorCode() {
return $this->pdo->errorCode();
}
function errorInfo() {
return $this->pdo->errorInfo();
}
function query($sql) {
return $this->pdo->query($sql);
}
public function lastInsertId() {
return $this->pdo->lastInsertId();
}
}

View File

@ -1,75 +0,0 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace Framadate\Migration;
use Framadate\Utils;
/**
* This migration adds the field hidden on the poll table.
*
* @package Framadate\Migration
* @version 0.9
*/
class AddColumn_hidden_In_poll_For_0_9 implements Migration {
function __construct() {
}
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
function description() {
return 'Add column "hidden" in table "vote" for version 0.9';
}
/**
* This method could check if the execute method should be called.
* It is called before the execute method.
*
* @param \PDO $pdo The connection to database
* @return bool true is the Migration should be executed.
*/
function preCondition(\PDO $pdo) {
$stmt = $pdo->query('SHOW TABLES');
$tables = $stmt->fetchAll(\PDO::FETCH_COLUMN);
// Check if tables of v0.9 are presents
$diff = array_diff([Utils::table('poll'), Utils::table('slot'), Utils::table('vote'), Utils::table('comment')], $tables);
return count($diff) === 0;
}
/**
* This method is called only one time in the migration page.
*
* @param \PDO $pdo The connection to database
* @return bool true is the execution succeeded
*/
function execute(\PDO $pdo) {
$this->alterPollTable($pdo);
return true;
}
private function alterPollTable(\PDO $pdo) {
$pdo->exec('
ALTER TABLE `' . Utils::table('poll') . '`
ADD `hidden` TINYINT( 1 ) NOT NULL DEFAULT "0"');
}
}

View File

@ -1,76 +0,0 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace Framadate\Migration;
use Framadate\Utils;
/**
* This migration adds the field receiveNewComments on the poll table.
*
* @package Framadate\Migration
* @version 0.9
*/
class AddColumn_receiveNewComments_For_0_9 implements Migration {
function __construct() {
}
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
function description() {
return 'Add column "receiveNewComments" for version 0.9';
}
/**
* This method could check if the execute method should be called.
* It is called before the execute method.
*
* @param \PDO $pdo The connection to database
* @return bool true is the Migration should be executed.
*/
function preCondition(\PDO $pdo) {
$stmt = $pdo->query('SHOW TABLES');
$tables = $stmt->fetchAll(\PDO::FETCH_COLUMN);
// Check if tables of v0.9 are presents
$diff = array_diff([Utils::table('poll'), Utils::table('slot'), Utils::table('vote'), Utils::table('comment')], $tables);
return count($diff) === 0;
}
/**
* This method is called only one time in the migration page.
*
* @param \PDO $pdo The connection to database
* @return bool true is the execution succeeded
*/
function execute(\PDO $pdo) {
$this->alterPollTable($pdo);
return true;
}
private function alterPollTable(\PDO $pdo) {
$pdo->exec('
ALTER TABLE `' . Utils::table('poll') . '`
ADD `receiveNewComments` TINYINT(1) DEFAULT \'0\'
AFTER `receiveNewVotes`');
}
}

View File

@ -1,77 +0,0 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace Framadate\Migration;
use Framadate\Utils;
/**
* This migration adds the field uniqId on the vote table.
*
* @package Framadate\Migration
* @version 0.9
*/
class AddColumn_uniqId_In_vote_For_0_9 implements Migration {
function __construct() {
}
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
function description() {
return 'Add column "uniqId" in table "vote" for version 0.9';
}
/**
* This method could check if the execute method should be called.
* It is called before the execute method.
*
* @param \PDO $pdo The connection to database
* @return bool true is the Migration should be executed.
*/
function preCondition(\PDO $pdo) {
$stmt = $pdo->query('SHOW TABLES');
$tables = $stmt->fetchAll(\PDO::FETCH_COLUMN);
// Check if tables of v0.9 are presents
$diff = array_diff([Utils::table('poll'), Utils::table('slot'), Utils::table('vote'), Utils::table('comment')], $tables);
return count($diff) === 0;
}
/**
* This method is called only one time in the migration page.
*
* @param \PDO $pdo The connection to database
* @return bool true is the execution succeeded
*/
function execute(\PDO $pdo) {
$this->alterPollTable($pdo);
return true;
}
private function alterPollTable(\PDO $pdo) {
$pdo->exec('
ALTER TABLE `' . Utils::table('vote') . '`
ADD `uniqId` CHAR(16) NOT NULL
AFTER `id`,
ADD INDEX (`uniqId`) ;');
}
}

View File

@ -1,76 +0,0 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace Framadate\Migration;
use Framadate\Utils;
/**
* This migration adds the fields password_hash and results_publicly_visible on the poll table.
*
* @package Framadate\Migration
* @version 0.9
*/
class AddColumns_password_hash_And_results_publicly_visible_In_poll_For_0_9 implements Migration {
function __construct() {
}
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
function description() {
return 'Add columns "password_hash" and "results_publicly_visible" in table "vote" for version 0.9';
}
/**
* This method could check if the execute method should be called.
* It is called before the execute method.
*
* @param \PDO $pdo The connection to database
* @return bool true is the Migration should be executed.
*/
function preCondition(\PDO $pdo) {
$stmt = $pdo->query('SHOW TABLES');
$tables = $stmt->fetchAll(\PDO::FETCH_COLUMN);
// Check if tables of v0.9 are presents
$diff = array_diff([Utils::table('poll'), Utils::table('slot'), Utils::table('vote'), Utils::table('comment')], $tables);
return count($diff) === 0;
}
/**
* This method is called only one time in the migration page.
*
* @param \PDO $pdo The connection to database
* @return bool true is the execution succeeded
*/
function execute(\PDO $pdo) {
$this->alterPollTable($pdo);
return true;
}
private function alterPollTable(\PDO $pdo) {
$pdo->exec('
ALTER TABLE `' . Utils::table('poll') . '`
ADD `password_hash` VARCHAR(255) NULL DEFAULT NULL ,
ADD `results_publicly_visible` TINYINT(1) NULL DEFAULT NULL');
}
}

View File

@ -1,70 +0,0 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace Framadate\Migration;
use Framadate\Utils;
/**
* This migration sets Poll.end_date to NULL by default
*
* @package Framadate\Migration
* @version 1.1
*/
class Fix_MySQL_No_Zero_Date implements Migration {
function __construct() {
}
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
function description() {
return 'Sets Poll end_date to NULL by default (work around MySQL NO_ZERO_DATE)';
}
/**
* This method could check if the execute method should be called.
* It is called before the execute method.
*
* @param \PDO $pdo The connection to database
* @return bool true if the Migration should be executed.
*/
function preCondition(\PDO $pdo) {
$stmt = $pdo->prepare("SELECT Column_Default from Information_Schema.Columns where Table_Name = ? AND Column_Name = ?;");
$stmt->bindValue(1, Utils::table('poll'));
$stmt->bindValue(2, 'end_date');
$stmt->execute();
$default = $stmt->fetch(\PDO::FETCH_COLUMN);
$driver_name = $pdo->getAttribute(\PDO::ATTR_DRIVER_NAME);
return $default !== null && $driver_name === 'mysql';
}
/**
* This method is called only one time in the migration page.
*
* @param \PDO $pdo The connection to database
* @return bool|void if the execution succeeded
*/
function execute(\PDO $pdo) {
$pdo->exec('ALTER TABLE ' . Utils::table('poll') . ' MODIFY end_date TIMESTAMP NULL DEFAULT NULL;');
}
}

View File

@ -1,108 +0,0 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace Framadate\Migration;
use Framadate\Utils;
/**
* Class From_0_0_to_0_8_Migration
*
* @package Framadate\Migration
* @version 0.8
*/
class From_0_0_to_0_8_Migration implements Migration {
function __construct() {
}
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
function description() {
return 'First installation of the Framadate application (v0.8)';
}
/**
* This method could check if the execute method should be called.
* It is called before the execute method.
*
* @param \PDO $pdo The connection to database
* @return bool true is the Migration should be executed.
*/
function preCondition(\PDO $pdo) {
$stmt = $pdo->query('SHOW TABLES like \'' . TABLENAME_PREFIX . '%\''); //issue187 : pouvoir installer framadate dans une base contenant d'autres tables.
$tables = $stmt->fetchAll(\PDO::FETCH_COLUMN);
// Check if there is no tables but the MIGRATION_TABLE one
$diff = array_diff($tables, [Utils::table(MIGRATION_TABLE)]);
return count($diff) === 0;
}
/**
* This method is called only one time in the migration page.
*
* @param \PDO $pdo The connection to database
* @return bool true is the execution succeeded
*/
function execute(\PDO $pdo) {
$pdo->exec('
CREATE TABLE IF NOT EXISTS `sondage` (
`id_sondage` char(16) NOT NULL,
`commentaires` text,
`mail_admin` varchar(128) DEFAULT NULL,
`nom_admin` varchar(64) DEFAULT NULL,
`titre` text,
`id_sondage_admin` char(24) DEFAULT NULL,
`date_creation` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`date_fin` timestamp NULL DEFAULT NULL,
`format` varchar(2) DEFAULT NULL,
`mailsonde` tinyint(1) DEFAULT \'0\',
`statut` int(11) NOT NULL DEFAULT \'1\' COMMENT \'1 = actif ; 0 = inactif ; \',
UNIQUE KEY `id_sondage` (`id_sondage`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;');
$pdo->exec('
CREATE TABLE IF NOT EXISTS `sujet_studs` (
`id_sondage` char(16) NOT NULL,
`sujet` text,
KEY `id_sondage` (`id_sondage`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;');
$pdo->exec('
CREATE TABLE IF NOT EXISTS `comments` (
`id_comment` int(11) unsigned NOT NULL AUTO_INCREMENT,
`id_sondage` char(16) NOT NULL,
`comment` text NOT NULL,
`usercomment` text,
PRIMARY KEY (`id_comment`),
KEY `id_sondage` (`id_sondage`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;');
$pdo->exec('
CREATE TABLE IF NOT EXISTS `user_studs` (
`id_users` int(11) unsigned NOT NULL AUTO_INCREMENT,
`nom` varchar(64) NOT NULL,
`id_sondage` char(16) NOT NULL,
`reponses` text NOT NULL,
PRIMARY KEY (`id_users`),
KEY `id_sondage` (`id_sondage`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;');
}
}

View File

@ -1,292 +0,0 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace Framadate\Migration;
use Framadate\Utils;
/**
* This class executes the aciton in database to migrate data from version 0.8 to 0.9.
*
* @package Framadate\Migration
* @version 0.9
*/
class From_0_8_to_0_9_Migration implements Migration {
function __construct() {
}
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
function description() {
return 'From 0.8 to 0.9';
}
/**
* This method could check if the execute method should be called.
* It is called before the execute method.
*
* @param \PDO $pdo The connection to database
* @return bool true is the Migration should be executed.
*/
function preCondition(\PDO $pdo) {
$stmt = $pdo->query('SHOW TABLES');
$tables = $stmt->fetchAll(\PDO::FETCH_COLUMN);
// Check if tables of v0.8 are presents
$diff = array_diff(['sondage', 'sujet_studs', 'comments', 'user_studs'], $tables);
return count($diff) === 0;
}
/**
* This method is called only one time in the migration page.
*
* @param \PDO $pdo The connection to database
* @return bool true is the execution succeeded
*/
function execute(\PDO $pdo) {
$this->createPollTable($pdo);
$this->createCommentTable($pdo);
$this->createSlotTable($pdo);
$this->createVoteTable($pdo);
$pdo->beginTransaction();
$this->migrateFromSondageToPoll($pdo);
$this->migrateFromCommentsToComment($pdo);
$this->migrateFromSujetStudsToSlot($pdo);
$this->migrateFromUserStudsToVote($pdo);
$pdo->commit();
$this->dropOldTables($pdo);
return true;
}
private function createPollTable(\PDO $pdo) {
$pdo->exec('
CREATE TABLE IF NOT EXISTS `' . Utils::table('poll') . '` (
`id` CHAR(16) NOT NULL,
`admin_id` CHAR(24) NOT NULL,
`title` TEXT NOT NULL,
`description` TEXT,
`admin_name` VARCHAR(64) DEFAULT NULL,
`admin_mail` VARCHAR(128) DEFAULT NULL,
`creation_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`end_date` TIMESTAMP NULL DEFAULT NULL,
`format` VARCHAR(1) DEFAULT NULL,
`editable` TINYINT(1) DEFAULT \'0\',
`receiveNewVotes` TINYINT(1) DEFAULT \'0\',
`active` TINYINT(1) DEFAULT \'1\',
PRIMARY KEY (`id`)
)
ENGINE = InnoDB
DEFAULT CHARSET = utf8');
}
private function migrateFromSondageToPoll(\PDO $pdo) {
$select = $pdo->query('
SELECT
`id_sondage`,
`id_sondage_admin`,
`titre`,
`commentaires`,
`nom_admin`,
`mail_admin`,
`date_creation`,
`date_fin`,
SUBSTR(`format`, 1, 1) AS `format`,
CASE SUBSTR(`format`, 2, 1)
WHEN \'+\' THEN 1
ELSE 0 END AS `editable`,
`mailsonde`,
CASE SUBSTR(`format`, 2, 1)
WHEN \'-\' THEN 0
ELSE 1 END AS `active`
FROM sondage');
$insert = $pdo->prepare('
INSERT INTO `' . Utils::table('poll') . '`
(`id`, `admin_id`, `title`, `description`, `admin_name`, `admin_mail`, `creation_date`, `end_date`, `format`, `editable`, `receiveNewVotes`, `active`)
VALUE (?,?,?,?,?,?,?,?,?,?,?,?)');
while ($row = $select->fetch(\PDO::FETCH_OBJ)) {
$insert->execute([
$row->id_sondage,
$row->id_sondage_admin,
$this->unescape($row->titre),
$this->unescape($row->commentaires),
$this->unescape($row->nom_admin),
$this->unescape($row->mail_admin),
$row->date_creation,
$row->date_fin,
$row->format,
$row->editable,
$row->mailsonde,
$row->active
]);
}
}
private function createSlotTable(\PDO $pdo) {
$pdo->exec('
CREATE TABLE IF NOT EXISTS `' . Utils::table('slot') . '` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`poll_id` CHAR(16) NOT NULL,
`title` TEXT,
`moments` TEXT,
PRIMARY KEY (`id`),
KEY `poll_id` (`poll_id`)
)
ENGINE = InnoDB
DEFAULT CHARSET = utf8');
}
private function migrateFromSujetStudsToSlot(\PDO $pdo) {
$stmt = $pdo->query('SELECT * FROM sujet_studs');
$sujets = $stmt->fetchAll();
$slots = [];
foreach ($sujets as $sujet) {
$newSlots = $this->transformSujetToSlot($sujet);
foreach ($newSlots as $newSlot) {
$slots[] = $newSlot;
}
}
$prepared = $pdo->prepare('INSERT INTO ' . Utils::table('slot') . ' (`poll_id`, `title`, `moments`) VALUE (?,?,?)');
foreach ($slots as $slot) {
$prepared->execute([
$slot->poll_id,
$this->unescape($slot->title),
!empty($slot->moments) ? $this->unescape($slot->moments) : null
]);
}
}
private function createCommentTable(\PDO $pdo) {
$pdo->exec('
CREATE TABLE IF NOT EXISTS `' . Utils::table('comment') . '` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`poll_id` CHAR(16) NOT NULL,
`name` TEXT,
`comment` TEXT NOT NULL,
PRIMARY KEY (`id`),
KEY `poll_id` (`poll_id`)
)
ENGINE = InnoDB
DEFAULT CHARSET = utf8');
}
private function migrateFromCommentsToComment(\PDO $pdo) {
$select = $pdo->query('
SELECT
`id_sondage`,
`usercomment`,
`comment`
FROM `comments`');
$insert = $pdo->prepare('
INSERT INTO `' . Utils::table('comment') . '` (`poll_id`, `name`, `comment`)
VALUE (?,?,?)');
while ($row = $select->fetch(\PDO::FETCH_OBJ)) {
$insert->execute([
$row->id_sondage,
$this->unescape($row->usercomment),
$this->unescape($row->comment)
]);
}
}
private function createVoteTable(\PDO $pdo) {
$pdo->exec('
CREATE TABLE IF NOT EXISTS `' . Utils::table('vote') . '` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`poll_id` CHAR(16) NOT NULL,
`name` VARCHAR(64) NOT NULL,
`choices` TEXT NOT NULL,
PRIMARY KEY (`id`),
KEY `poll_id` (`poll_id`)
)
ENGINE = InnoDB
DEFAULT CHARSET = utf8');
}
private function migrateFromUserStudsToVote(\PDO $pdo) {
$select = $pdo->query('
SELECT
`id_sondage`,
`nom`,
REPLACE(REPLACE(REPLACE(`reponses`, 1, \'X\'), 2, 1), \'X\', 2) reponses
FROM `user_studs`');
$insert = $pdo->prepare('
INSERT INTO `' . Utils::table('vote') . '` (`poll_id`, `name`, `choices`)
VALUE (?,?,?)');
while ($row = $select->fetch(\PDO::FETCH_OBJ)) {
$insert->execute([
$row->id_sondage,
$this->unescape($row->nom),
$row->reponses
]);
}
}
private function transformSujetToSlot($sujet) {
$slots = [];
$ex = explode(',', $sujet->sujet);
$isDatePoll = strpos($sujet->sujet, '@');
$lastSlot = null;
foreach ($ex as $atomicSlot) {
if ($isDatePoll === false) { // Classic poll
$slot = new \stdClass();
$slot->poll_id = $sujet->id_sondage;
$slot->title = $atomicSlot;
$slots[] = $slot;
} else { // Date poll
$values = explode('@', $atomicSlot);
if ($lastSlot === null || $lastSlot->title !== $values[0]) {
$lastSlot = new \stdClass();
$lastSlot->poll_id = $sujet->id_sondage;
$lastSlot->title = $values[0];
$lastSlot->moments = count($values) === 2 ? $values[1] : '-';
$slots[] = $lastSlot;
} else {
$lastSlot->moments .= ',' . (count($values) === 2 ? $values[1] : '-');
}
}
}
return $slots;
}
private function dropOldTables(\PDO $pdo) {
$pdo->exec('DROP TABLE `comments`');
$pdo->exec('DROP TABLE `sujet_studs`');
$pdo->exec('DROP TABLE `user_studs`');
$pdo->exec('DROP TABLE `sondage`');
}
private function unescape($value) {
return stripslashes(html_entity_decode($value, ENT_QUOTES));
}
}

View File

@ -1,80 +0,0 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace Framadate\Migration;
use Framadate\Security\Token;
use Framadate\Utils;
/**
* This migration generate uniqId for all legacy votes.
*
* @package Framadate\Migration
* @version 0.9
*/
class Generate_uniqId_for_old_votes implements Migration {
function __construct() {
}
function description() {
return 'Generate "uniqId" in "vote" table for all legacy votes';
}
function preCondition(\PDO $pdo) {
$stmt = $pdo->query('SHOW TABLES');
$tables = $stmt->fetchAll(\PDO::FETCH_COLUMN);
// Check if tables of v0.9 are presents
$diff = array_diff([Utils::table('poll'), Utils::table('slot'), Utils::table('vote'), Utils::table('comment')], $tables);
return count($diff) === 0;
}
/**
* This methode is called only one time in the migration page.
*
* @param \PDO $pdo The connection to database
* @return bool true is the execution succeeded
*/
function execute(\PDO $pdo) {
$pdo->beginTransaction();
$this->generateUniqIdsForEmptyOnes($pdo);
$pdo->commit();
return true;
}
private function generateUniqIdsForEmptyOnes($pdo) {
$select = $pdo->query('
SELECT `id`
FROM `' . Utils::table('vote') . '`
WHERE `uniqid` = \'\'');
$update = $pdo->prepare('
UPDATE `' . Utils::table('vote') . '`
SET `uniqid` = :uniqid
WHERE `id` = :id');
while ($row = $select->fetch(\PDO::FETCH_OBJ)) {
$token = Token::getToken(16);
$update->execute([
'uniqid' => $token,
'id' => $row->id
]);
}
}
}

View File

@ -1,66 +0,0 @@
<?php
namespace Framadate\Migration;
use Framadate\Utils;
class Increase_pollId_size implements Migration {
function __construct() {
}
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
function description() {
return 'Increase the size of id column in poll table';
}
/**
* This method could check if the execute method should be called.
* It is called before the execute method.
*
* @param \PDO $pdo The connection to database
* @return bool true if the Migration should be executed
*/
function preCondition(\PDO $pdo) {
return true;
}
/**
* This methode is called only one time in the migration page.
*
* @param \PDO $pdo The connection to database
* @return bool true if the execution succeeded
*/
function execute(\PDO $pdo) {
$this->alterCommentTable($pdo);
$this->alterPollTable($pdo);
$this->alterSlotTable($pdo);
$this->alterVoteTable($pdo);
}
private function alterCommentTable(\PDO $pdo) {
$pdo->exec('
ALTER TABLE `' . Utils::table('comment') . '`
CHANGE `poll_id` `poll_id` VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;');
}
private function alterPollTable(\PDO $pdo) {
$pdo->exec('
ALTER TABLE `' . Utils::table('poll') . '`
CHANGE `id` `id` VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;');
}
private function alterSlotTable(\PDO $pdo) {
$pdo->exec('
ALTER TABLE `' . Utils::table('slot') . '`
CHANGE `poll_id` `poll_id` VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;');
}
private function alterVoteTable(\PDO $pdo) {
$pdo->exec('
ALTER TABLE `' . Utils::table('vote') . '`
CHANGE `poll_id` `poll_id` VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;');
}
}

View File

@ -1,66 +0,0 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace Framadate\Migration;
use Framadate\Utils;
/**
* This migration RPad votes from version 0.8.
* Because some votes does not have enough values for their poll.
*
* @package Framadate\Migration
* @version 0.9
*/
class RPadVotes_from_0_8 implements Migration {
function description() {
return 'RPad votes from version 0.8.';
}
function preCondition(\PDO $pdo) {
$stmt = $pdo->query('SHOW TABLES');
$tables = $stmt->fetchAll(\PDO::FETCH_COLUMN);
// Check if tables of v0.9 are presents
$diff = array_diff([Utils::table('poll'), Utils::table('slot'), Utils::table('vote'), Utils::table('comment')], $tables);
return count($diff) === 0;
}
function execute(\PDO $pdo) {
$pdo->beginTransaction();
$this->rpadVotes($pdo);
$pdo->commit();
return true;
}
private function rpadVotes($pdo) {
$pdo->exec('UPDATE ' . Utils::table('vote') . ' fv
INNER JOIN (
SELECT v.id, RPAD(v.choices, inn.slots_count, \'0\') new_choices
FROM ' . Utils::table('vote') . ' v
INNER JOIN
(SELECT s.poll_id, SUM(IFNULL(LENGTH(s.moments) - LENGTH(REPLACE(s.moments, \',\', \'\')) + 1, 1)) slots_count
FROM ' . Utils::table('slot') . ' s
GROUP BY s.poll_id
ORDER BY s.poll_id) inn ON inn.poll_id = v.poll_id
WHERE LENGTH(v.choices) != inn.slots_count
) computed ON fv.id = computed.id
SET fv.choices = computed.new_choices');
}
}

View File

@ -0,0 +1,99 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Framadate\AbstractMigration;
/**
* Class From_0_0_to_0_8_Migration
*
* @package Framadate\Migration
* @version 0.8
*/
class Version20150101000000 extends AbstractMigration
{
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
public function description()
{
return 'First installation of the Framadate application (v0.8)';
}
/**
* This method is called only one time in the migration page.
*
* @param Schema $schema
* @throws \Doctrine\DBAL\DBALException
* @throws \Doctrine\DBAL\Migrations\SkipMigrationException
* @throws \Doctrine\DBAL\Schema\SchemaException
* @return void true is the execution succeeded
*/
public function up(Schema $schema)
{
$this->skipIf($this->legacyCheck($schema,'Framadate\Migration\From_0_0_to_0_8_Migration'), 'Migration has been executed in an earlier database migration system');
$sondage = $schema->createTable('sondage');
$sondage->addColumn('id_sondage', 'string');
$sondage->addColumn('commentaires', 'text');
$sondage->addColumn('mail_admin', 'string', ['notnull' => false]);
$sondage->addColumn('nom_admin', 'string', ['notnull' => false]);
$sondage->addColumn('titre', 'text');
$sondage->addColumn('id_sondage_admin', 'string', ['notnull' => false]);
$sondage->addColumn('date_creation', 'datetime', ['default' => (new \DateTime())->format('Y-m-d H:i:s')]);
$sondage->addColumn('date_fin', 'datetime', ['notnull' => false]);
$sondage->addColumn('format', 'string', ['notnull' => false]);
$sondage->addColumn('mailsonde', 'boolean', ['default' => false]);
$sondage->addColumn('statut', 'integer', ['default' => '1']);
$sondage->addUniqueIndex(['id_sondage'], 'sondage_index_id_sondage');
$sujetStuds = $schema->createTable('sujet_studs');
$sujetStuds->addColumn('id_sondage', 'string');
$sujetStuds->addColumn('sujet', 'text');
$sujetStuds->addIndex(['id_sondage'], 'sujet_studs_index_id_sondage');
$comments = $schema->createTable('comments');
$schema->createSequence('comments_seq');
$comments->addColumn('id_comment', 'integer', ['autoincrement' => true]);
$comments->addColumn('id_sondage', 'string');
$comments->addColumn('comment', 'text');
$comments->addColumn('usercomment', 'text', ['notnull' => false]);
$comments->addUniqueIndex(['id_comment'], 'comments_index_id_comment');
$comments->addIndex(['id_sondage'], 'comments_index_id_sondage');
$userStuds = $schema->createTable('user_studs');
$schema->createSequence('user_studs_seq');
$userStuds->addColumn('id_users', 'integer', ['autoincrement' => true]);
$userStuds->addColumn('nom', 'string');
$userStuds->addColumn('id_sondage', 'string');
$userStuds->addColumn('reponses', 'text');
$userStuds->addUniqueIndex(['id_users'], 'user_studs_index_id_users');
$userStuds->addIndex(['id_sondage'], 'user_studs_index_id_sondage');
}
public function down(Schema $schema)
{
$this->addSql('DROP TABLE sondage');
$this->addSql('DROP TABLE sujet_studs');
$this->addSql('DROP TABLE comments');
$this->addSql('DROP TABLE user_studs');
}
}

View File

@ -0,0 +1,160 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Framadate\AbstractMigration;
use Framadate\Utils;
/**
* This class executes the aciton in database to migrate data from version 0.8 to 0.9.
*
* @package Framadate\Migration
* @version 0.9
*/
class Version20150102000000 extends AbstractMigration
{
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
public function description()
{
return 'From 0.8 to 0.9 first part';
}
/**
* @param Schema $schema
* @throws \Doctrine\DBAL\DBALException
* @throws \Doctrine\DBAL\Migrations\SkipMigrationException
* @throws \Doctrine\DBAL\Schema\SchemaException
*/
public function up(Schema $schema)
{
$this->skipIf($this->legacyCheck($schema,'Framadate\Migration\From_0_8_to_0_9_Migration'), 'Migration has been executed in an earlier database migration system');
foreach (['sondage', 'sujet_studs', 'comments', 'user_studs'] as $table) {
$this->skipIf(!$schema->hasTable($table), 'Missing table ' . $table);
}
$this->createPollTable($schema);
$this->createCommentTable($schema);
$this->createSlotTable($schema);
$this->createVoteTable($schema);
}
public function down(Schema $schema)
{
$sondage = $schema->createTable('sondage');
$sondage->addColumn('id_sondage', 'string');
$sondage->addColumn('commentaires', 'text');
$sondage->addColumn('mail_admin', 'string', ['notnull' => false]);
$sondage->addColumn('nom_admin', 'string', ['notnull' => false]);
$sondage->addColumn('titre', 'text');
$sondage->addColumn('id_sondage_admin', 'string', ['notnull' => false]);
$sondage->addColumn('date_creation', 'datetime', ['default' => (new \DateTime())->format('Y-m-d H:i:s')]);
$sondage->addColumn('date_fin', 'datetime', ['notnull' => false]);
$sondage->addColumn('format', 'string', ['notnull' => false]);
$sondage->addColumn('mailsonde', 'boolean', ['default' => false]);
$sondage->addColumn('statut', 'integer', ['default' => '1']);
$sondage->addUniqueIndex(['id_sondage'], 'sondage_index_id_sondage');
$sujetStuds = $schema->createTable('sujet_studs');
$sujetStuds->addColumn('id_sondage', 'string');
$sujetStuds->addColumn('sujet', 'text');
$sujetStuds->addIndex(['id_sondage'], 'sujet_studs_index_id_sondage');
$comments = $schema->createTable('comments');
$schema->createSequence('comments_seq');
$comments->addColumn('id_comment', 'integer', ['autoincrement' => true]);
$comments->addColumn('id_sondage', 'string');
$comments->addColumn('comment', 'text');
$comments->addColumn('usercomment', 'text', ['notnull' => false]);
$comments->addUniqueIndex(['id_comment'], 'comments_index_id_comment');
$comments->addIndex(['id_sondage'], 'comments_index_id_sondage');
$userStuds = $schema->createTable('user_studs');
$schema->createSequence('user_studs_seq');
$userStuds->addColumn('id_users', 'integer', ['autoincrement' => true]);
$userStuds->addColumn('nom', 'string');
$userStuds->addColumn('id_sondage', 'string');
$userStuds->addColumn('reponses', 'text');
$userStuds->addUniqueIndex(['id_users'], 'user_studs_index_id_users');
$userStuds->addIndex(['id_sondage'], 'user_studs_index_id_sondage');
$schema->dropTable(Utils::table('poll'));
$schema->dropTable(Utils::table('comment'));
$schema->dropTable(Utils::table('vote'));
$schema->dropTable(Utils::table('slot'));
}
private function createPollTable(Schema $schema)
{
$poll = $schema->createTable(Utils::table('poll'));
$poll->addColumn('id', 'string');
$poll->addColumn('admin_id', 'string');
$poll->addColumn('title', 'text');
$poll->addColumn('description', 'text', ['notnull' => false]);
$poll->addColumn('admin_name', 'string');
$poll->addColumn('admin_mail', 'string', ['notnull' => false]);
$poll->addColumn('creation_date', 'datetime', ['default' => (new \DateTime())->format('Y-m-d H:i:s')]);
$poll->addColumn('end_date', 'datetime', ['notnull' => false]);
$poll->addColumn('format', 'string', ['default' => null, 'notnull' => false]);
$poll->addColumn('editable', 'integer', ['default' => 0]);
$poll->addColumn('receiveNewVotes', 'boolean', ['default' => false]);
$poll->addColumn('active', 'boolean', ['default' => true]);
$poll->addUniqueIndex(['id'], 'poll_index_id');
}
private function createSlotTable(Schema $schema)
{
$slot = $schema->createTable(Utils::table('slot'));
$schema->createSequence('slot_seq');
$slot->addColumn('id', 'integer', ['autoincrement' => true]);
$slot->addColumn('poll_id', 'string');
$slot->addColumn('title', 'text');
$slot->addColumn('moments', 'text', ['notnull' => false]);
$slot->addUniqueIndex(['id'], 'slot_index_id');
$slot->addIndex(['poll_id'], 'slot_index_poll_id');
}
private function createCommentTable(Schema $schema)
{
$comment = $schema->createTable(Utils::table('comment'));
$schema->createSequence('comment_seq');
$comment->addColumn('id', 'integer', ['autoincrement' => true]);
$comment->addColumn('poll_id', 'string');
$comment->addColumn('name', 'text', ['notnull' => false]);
$comment->addColumn('comment', 'text');
$comment->addUniqueIndex(['id'], 'comment_index_id');
$comment->addIndex(['poll_id'], 'comment_index_poll_id');
}
private function createVoteTable(Schema $schema)
{
$vote = $schema->createTable(Utils::table('vote'));
$schema->createSequence('vote_seq');
$vote->addColumn('id', 'integer', ['autoincrement' => true]);
$vote->addColumn('poll_id', 'string');
$vote->addColumn('name', 'string');
$vote->addColumn('choices', 'string');
$vote->addUniqueIndex(['id'], 'vote_index_id');
$vote->addIndex(['poll_id'], 'vote_index_poll_id');
}
}

View File

@ -0,0 +1,263 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Framadate\AbstractMigration;
use Framadate\Utils;
/**
* This class executes the aciton in database to migrate data from version 0.8 to 0.9.
*
* @package Framadate\Migration
* @version 0.9
*/
class Version20150102100000 extends AbstractMigration
{
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
public function description()
{
return 'From 0.8 to 0.9 second part';
}
/**
* @param Schema $schema
* @throws \Doctrine\DBAL\DBALException
* @throws \Doctrine\DBAL\Migrations\SkipMigrationException
* @throws \Doctrine\DBAL\Schema\SchemaException
*/
public function up(Schema $schema)
{
$this->skipIf($this->legacyCheck($schema,'Framadate\Migration\From_0_8_to_0_9_Migration'), 'Migration has been executed in an earlier database migration system');
foreach ([Utils::table('poll'), Utils::table('comment'), Utils::table('slot'), Utils::table('vote')] as $table) {
$this->skipIf(!$schema->hasTable($table), 'Missing table ' . $table);
}
$this->migrateFromSondageToPoll();
$this->migrateFromCommentsToComment();
$this->migrateFromSujetStudsToSlot();
//$this->migrateFromUserStudsToVote();
$this->dropOldTables($schema);
}
public function down(Schema $schema)
{
$sondage = $schema->createTable('sondage');
$sondage->addColumn('id_sondage', 'string');
$sondage->addColumn('commentaires', 'text');
$sondage->addColumn('mail_admin', 'string', ['notnull' => false]);
$sondage->addColumn('nom_admin', 'string', ['notnull' => false]);
$sondage->addColumn('titre', 'text');
$sondage->addColumn('id_sondage_admin', 'string', ['notnull' => false]);
$sondage->addColumn('date_creation', 'datetime', ['default' => (new \DateTime())->format('Y-m-d H:i:s')]);
$sondage->addColumn('date_fin', 'datetime', ['notnull' => false]);
$sondage->addColumn('format', 'string', ['notnull' => false]);
$sondage->addColumn('mailsonde', 'boolean', ['default' => false]);
$sondage->addColumn('statut', 'integer', ['default' => '1']);
$sondage->addUniqueIndex(['id_sondage'], 'sondage_index_id_sondage');
$sujetStuds = $schema->createTable('sujet_studs');
$sujetStuds->addColumn('id_sondage', 'string');
$sujetStuds->addColumn('sujet', 'text');
$sujetStuds->addIndex(['id_sondage'], 'sujet_studs_index_id_sondage');
$comments = $schema->createTable('comments');
$schema->createSequence('comments_seq');
$comments->addColumn('id_comment', 'integer', ['autoincrement' => true]);
$comments->addColumn('id_sondage', 'string');
$comments->addColumn('comment', 'text');
$comments->addColumn('usercomment', 'text', ['notnull' => false]);
$comments->addUniqueIndex(['id_comment'], 'comments_index_id_comment');
$comments->addIndex(['id_sondage'], 'comments_index_id_sondage');
$userStuds = $schema->createTable('user_studs');
$schema->createSequence('user_studs_seq');
$userStuds->addColumn('id_users', 'integer', ['autoincrement' => true]);
$userStuds->addColumn('nom', 'string');
$userStuds->addColumn('id_sondage', 'string');
$userStuds->addColumn('reponses', 'text');
$userStuds->addUniqueIndex(['id_users'], 'user_studs_index_id_users');
$userStuds->addIndex(['id_sondage'], 'user_studs_index_id_sondage');
$schema->dropTable(Utils::table('poll'));
$schema->dropTable(Utils::table('comment'));
$schema->dropTable(Utils::table('vote'));
$schema->dropTable(Utils::table('slot'));
}
private function migrateFromSondageToPoll()
{
$select = $this->connection->query('
SELECT
id_sondage,
id_sondage_admin,
titre,
commentaires,
nom_admin,
mail_admin,
date_creation,
date_fin,
SUBSTR(format, 1, 1) AS format,
CASE SUBSTR(format, 2, 1)
WHEN \'+\' THEN 1
ELSE 0 END AS editable,
mailsonde,
CASE SUBSTR(format, 2, 1)
WHEN \'-\' THEN 0
ELSE 1 END AS active
FROM sondage');
$insert = $this->connection->prepare('
INSERT INTO ' . Utils::table('poll') . '
(id, admin_id, title, description, admin_name, admin_mail, creation_date, end_date, format, editable, receiveNewVotes, active)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?)');
while ($row = $select->fetch(\PDO::FETCH_OBJ)) {
$insert->execute([
$row->id_sondage,
$row->id_sondage_admin,
$this->unescape($row->titre),
$this->unescape($row->commentaires),
$this->unescape($row->nom_admin),
$this->unescape($row->mail_admin),
$row->date_creation,
$row->date_fin,
$row->format,
$row->editable,
$row->mailsonde,
$row->active
]);
}
}
private function migrateFromSujetStudsToSlot()
{
$stmt = $this->connection->query('SELECT * FROM sujet_studs');
$sujets = $stmt->fetchAll();
$slots = [];
foreach ($sujets as $sujet) {
$newSlots = $this->transformSujetToSlot($sujet);
foreach ($newSlots as $newSlot) {
$slots[] = $newSlot;
}
}
$prepared = $this->connection->prepare('INSERT INTO ' . Utils::table('slot') . ' (poll_id, title, moments) VALUES (?,?,?)');
foreach ($slots as $slot) {
$prepared->execute([
$slot->poll_id,
$this->unescape($slot->title),
!empty($slot->moments) ? $this->unescape($slot->moments) : null
]);
}
}
private function migrateFromCommentsToComment()
{
$select = $this->connection->query('
SELECT
id_sondage,
usercomment,
comment
FROM comments');
$insert = $this->connection->prepare('
INSERT INTO ' . Utils::table('comment') . ' (poll_id, name, comment)
VALUES (?,?,?)');
while ($row = $select->fetch(\PDO::FETCH_OBJ)) {
$insert->execute([
$row->id_sondage,
$this->unescape($row->usercomment),
$this->unescape($row->comment)
]);
}
}
private function migrateFromUserStudsToVote()
{
$select = $this->connection->query('
SELECT
id_sondage,
nom,
REPLACE(REPLACE(REPLACE(reponses, 1, \'X\'), 2, 1), \'X\', 2) reponses
FROM user_studs');
$insert = $this->connection->prepare('
INSERT INTO ' . Utils::table('vote') . ' (poll_id, name, choices)
VALUES (?,?,?)');
while ($row = $select->fetch(\PDO::FETCH_OBJ)) {
$insert->execute([
$row->id_sondage,
$this->unescape($row->nom),
$row->reponses
]);
}
}
private function transformSujetToSlot($sujet)
{
$slots = [];
$ex = explode(',', $sujet->sujet);
$isDatePoll = strpos($sujet->sujet, '@');
$lastSlot = null;
foreach ($ex as $atomicSlot) {
if ($isDatePoll === false) { // Classic poll
$slot = new \stdClass();
$slot->poll_id = $sujet->id_sondage;
$slot->title = $atomicSlot;
$slots[] = $slot;
} else { // Date poll
$values = explode('@', $atomicSlot);
if ($lastSlot === null || $lastSlot->title !== $values[0]) {
$lastSlot = new \stdClass();
$lastSlot->poll_id = $sujet->id_sondage;
$lastSlot->title = $values[0];
$lastSlot->moments = count($values) === 2 ? $values[1] : '-';
$slots[] = $lastSlot;
} else {
$lastSlot->moments .= ',' . (count($values) === 2 ? $values[1] : '-');
}
}
}
return $slots;
}
private function dropOldTables(Schema $schema)
{
$schema->dropTable('comments');
$schema->dropTable('sujet_studs');
$schema->dropTable('user_studs');
$schema->dropTable('sondage');
}
private function unescape($value)
{
return stripslashes(html_entity_decode($value, ENT_QUOTES));
}
}

View File

@ -0,0 +1,70 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Framadate\AbstractMigration;
use Framadate\Utils;
/**
* This migration adds the field receiveNewComments on the poll table.
*
* @package Framadate\Migration
* @version 0.9
*/
class Version20150117000000 extends AbstractMigration
{
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
public function description()
{
return 'Add column "receiveNewComments" for version 0.9';
}
/**
* @param Schema $schema
* @throws \Doctrine\DBAL\Migrations\SkipMigrationException
* @throws \Doctrine\DBAL\Schema\SchemaException
* @throws \Doctrine\DBAL\DBALException
*/
public function up(Schema $schema)
{
$this->skipIf($this->legacyCheck($schema,'Framadate\Migration\AddColumn_receiveNewComments_For_0_9'), 'Migration has been executed in an earlier database migration system');
foreach ([Utils::table('poll'), Utils::table('slot'), Utils::table('vote'), Utils::table('comment')] as $table) {
$this->skipIf(!$schema->hasTable($table), 'Missing table ' . $table);
}
$pollTable = $schema->getTable(Utils::table('poll'));
$this->skipIf($pollTable->hasColumn('receiveNewComments'), 'Column receiveNewComments already exists');
$pollTable->addColumn('receiveNewComments', 'boolean', ['default' => false]);
}
/**
* @param Schema $schema
* @throws \Doctrine\DBAL\Schema\SchemaException
*/
public function down(Schema $schema)
{
$pollTable = $schema->getTable(Utils::table('poll'));
$pollTable->dropColumn('receiveNewComments');
}
}

View File

@ -0,0 +1,76 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Framadate\AbstractMigration;
use Framadate\Utils;
/**
* This migration adds the field uniqId on the vote table.
*
* @package Framadate\Migration
* @version 0.9
*/
class Version20150402000000 extends AbstractMigration
{
private $indexUniqIdName = 'IDX_vote_uniqId';
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
public function description()
{
return 'Add column "uniqId" in table "vote" for version 0.9';
}
/**
* @param Schema $schema
* @throws \Doctrine\DBAL\Migrations\SkipMigrationException
* @throws \Doctrine\DBAL\Schema\SchemaException
* @throws \Doctrine\DBAL\DBALException
*/
public function up(Schema $schema)
{
$this->skipIf($this->legacyCheck($schema, 'Framadate\Migration\AddColumn_uniqId_In_vote_For_0_9'), 'Migration has been executed in an earlier database migration system');
foreach ([Utils::table('poll'), Utils::table('slot'), Utils::table('vote'), Utils::table('comment')] as $table) {
$this->skipIf(!$schema->hasTable($table), 'Missing table ' . $table);
}
$voteTable = $schema->getTable(Utils::table('vote'));
$this->skipIf($voteTable->hasColumn('uniqId'), 'Column uniqId already existing');
$voteTable->addColumn('uniqId', 'string', ['length' => 16]);
$voteTable->addIndex(['uniqId'], $this->indexUniqIdName);
}
/**
* @param Schema $schema
* @throws \Doctrine\DBAL\Schema\SchemaException
*/
public function down(Schema $schema)
{
$voteTable = $schema->getTable(Utils::table('vote'));
$voteTable->dropIndex($this->indexUniqIdName);
$voteTable->dropColumn('uniqId');
}
}

View File

@ -0,0 +1,72 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Framadate\AbstractMigration;
use Framadate\Utils;
/**
* This migration adds the field hidden on the poll table.
*
* @package Framadate\Migration
* @version 0.9
*/
class Version20150405000000 extends AbstractMigration
{
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
public function description()
{
return 'Add column "hidden" in table "vote" for version 0.9';
}
/**
* @param Schema $schema
* @throws \Doctrine\DBAL\Migrations\SkipMigrationException
* @throws \Doctrine\DBAL\Schema\SchemaException
* @throws \Doctrine\DBAL\DBALException
*/
public function up(Schema $schema)
{
$this->skipIf($this->legacyCheck($schema, 'Framadate\Migration\AddColumn_hidden_In_poll_For_0_9'), 'Migration has been executed in an earlier database migration system');
foreach ([Utils::table('poll'), Utils::table('slot'), Utils::table('vote'), Utils::table('comment')] as $table) {
$this->skipIf(!$schema->hasTable($table), 'Missing table ' . $table);
}
$pollTable = $schema->getTable(Utils::table('poll'));
$this->skipIf($pollTable->hasColumn('hidden'), 'Column hidden already existing in table poll');
$pollTable->addColumn('hidden', 'boolean', ['default' => false, 'notnull' => true]);
}
/**
* @param Schema $schema
* @throws \Doctrine\DBAL\Schema\SchemaException
*/
public function down(Schema $schema)
{
$pollTable = $schema->getTable(Utils::table('poll'));
$pollTable->dropColumn('hidden');
}
}

View File

@ -0,0 +1,78 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Framadate\AbstractMigration;
use Framadate\Security\Token;
use Framadate\Utils;
/**
* This migration generate uniqId for all legacy votes.
*
* @package Framadate\Migration
* @version 0.9
*/
class Version20150624000000 extends AbstractMigration
{
public function description()
{
return 'Generate "uniqId" in "vote" table for all legacy votes';
}
/**
* @param Schema $schema
* @throws \Doctrine\DBAL\DBALException
* @throws \Doctrine\DBAL\Migrations\SkipMigrationException
*/
public function up(Schema $schema)
{
$this->skipIf($this->legacyCheck($schema, 'Framadate\Migration\Generate_uniqId_for_old_votes'), 'Migration has been executed in an earlier database migration system');
foreach ([Utils::table('poll'), Utils::table('slot'), Utils::table('vote'), Utils::table('comment')] as $table) {
$this->skipIf(!$schema->hasTable($table), 'Missing table ' . $table);
}
$this->connection->beginTransaction();
$select = $this->connection->query('
SELECT id
FROM ' . Utils::table('vote') . '
WHERE uniqid = \'\'');
$update = $this->connection->prepare('
UPDATE ' . Utils::table('vote') . '
SET uniqid = :uniqid
WHERE id = :id');
while ($row = $select->fetch(\PDO::FETCH_OBJ)) {
$token = Token::getToken(16);
$update->execute([
'uniqid' => $token,
'id' => $row->id
]);
}
$this->connection->commit();
}
public function down(Schema $schema)
{
// TODO: Implement down() method.
}
}

View File

@ -0,0 +1,102 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Rapha<EFBFBD>l DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est r<EFBFBD>gi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Rapha<EFBFBD>l DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Framadate\AbstractMigration;
use Framadate\Utils;
/**
* This migration RPad votes from version 0.8.
* Because some votes does not have enough values for their poll.
*
* @package Framadate\Migration
* @version 0.9
*/
class Version20150918000000 extends AbstractMigration
{
public function description()
{
return 'RPad votes from version 0.8.';
}
/**
* @param Schema $schema
* @throws \Doctrine\DBAL\DBALException
* @throws \Doctrine\DBAL\Migrations\SkipMigrationException
* @throws \Doctrine\DBAL\Schema\SchemaException
*/
public function up(Schema $schema)
{
$this->skipIf(
$this->legacyCheck($schema, 'Framadate\Migration\RPadVotes_from_0_8'),
'Migration has been executed in an earlier database migration system'
);
foreach ([Utils::table('poll'), Utils::table('slot'), Utils::table('vote'), Utils::table(
'comment'
)] as $table) {
$this->skipIf(!$schema->hasTable($table), 'Missing table ' . $table);
}
$driver_name = $this->connection->getDatabasePlatform()->getName();
switch ($driver_name) {
case 'mysql':
$this->addSql(
'UPDATE ' . Utils::table('vote') . ' fv
INNER JOIN (
SELECT v.id, RPAD(v.choices, inn.slots_count, \'0\') new_choices
FROM ' . Utils::table('vote') . ' v
INNER JOIN
(SELECT s.poll_id, SUM(IFNULL(LENGTH(s.moments) - LENGTH(REPLACE(s.moments, \',\', \'\')) + 1, 1)) slots_count
FROM ' . Utils::table('slot') . ' s
GROUP BY s.poll_id
ORDER BY s.poll_id) inn ON inn.poll_id = v.poll_id
WHERE LENGTH(v.choices) != inn.slots_count
) computed ON fv.id = computed.id
SET fv.choices = computed.new_choices'
);
break;
case 'postgresql':
$this->addSql(
"UPDATE " . Utils::table('vote') . " fv
SET choices = computed.new_choices
FROM (
SELECT v.id, RPAD(v.choices::text, inn.slots_count::int, '0') new_choices
FROM " . Utils::table('vote') . " v
INNER JOIN
(SELECT s.poll_id, SUM(coalesce(LENGTH(s.moments) - LENGTH(REPLACE(s.moments, ',', '')) + 1, 1)) slots_count
FROM " . Utils::table('slot') . " s
GROUP BY s.poll_id
ORDER BY s.poll_id) inn ON inn.poll_id = v.poll_id
WHERE LENGTH(v.choices) != inn.slots_count
) computed WHERE fv.id = computed.id"
);
break;
default:
$this->skipIf(true, "Not on MySQL or PostgreSQL");
break;
}
}
public function down(Schema $schema)
{
// TODO: Implement down() method.
}
}

View File

@ -16,8 +16,11 @@
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace Framadate\Migration;
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\DBAL\Types\Type;
use Framadate\AbstractMigration;
use Framadate\Utils;
/**
@ -26,45 +29,43 @@ use Framadate\Utils;
* @package Framadate\Migration
* @version 1.0
*/
class Alter_Comment_table_for_name_length implements Migration {
function __construct() {
}
class Version20151012075900 extends AbstractMigration
{
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
function description() {
public function description()
{
return 'Alter the comment table to set a length to the name column.';
}
/**
* This method could check if the execute method should be called.
* It is called before the execute method.
*
* @param \PDO $pdo The connection to database
* @return bool true is the Migration should be executed.
* @param Schema $schema
* @throws \Doctrine\DBAL\Schema\SchemaException
* @throws \Doctrine\DBAL\DBALException
* @throws \Doctrine\DBAL\Migrations\SkipMigrationException
*/
function preCondition(\PDO $pdo) {
return true;
public function up(Schema $schema)
{
$this->skipIf($this->legacyCheck($schema, 'Framadate\Migration\Alter_Comment_table_for_name_length'), 'Migration has been executed in an earlier database migration system');
$commentTable = $schema->getTable(Utils::table('comment'));
$commentTable->changeColumn('name', ['default' => null, 'notnull' => false]);
$commentTable->changeColumn('name', ['type' => Type::getType('string'), 'length' => 64, 'notnull' => true]);
}
/**
* This methode is called only one time in the migration page.
*
* @param \PDO $pdo The connection to database
* @return bool true is the execution succeeded
* @param Schema $schema
* @throws \Doctrine\DBAL\Schema\SchemaException
* @throws \Doctrine\DBAL\DBALException
*/
function execute(\PDO $pdo) {
$this->alterCommentTable($pdo);
public function down(Schema $schema)
{
$commentTable = $schema->getTable(Utils::table('comment'));
return true;
}
private function alterCommentTable(\PDO $pdo) {
$pdo->exec('
ALTER TABLE `' . Utils::table('comment') . '`
CHANGE `name` `name` VARCHAR( 64 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ;');
$commentTable->changeColumn('name', ['type' => Type::getType('string')]);
}
}

View File

@ -16,8 +16,10 @@
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace Framadate\Migration;
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Framadate\AbstractMigration;
use Framadate\Utils;
/**
@ -26,45 +28,42 @@ use Framadate\Utils;
* @package Framadate\Migration
* @version 1.0
*/
class Alter_Comment_table_adding_date implements Migration {
function __construct() {
}
class Version20151012082600 extends AbstractMigration
{
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
function description() {
public function description()
{
return 'Alter the comment table to add a date column.';
}
/**
* This method could check if the execute method should be called.
* It is called before the execute method.
*
* @param \PDO $pdo The connection to database
* @return bool true is the Migration should be executed.
* @param Schema $schema
* @throws \Doctrine\DBAL\Migrations\SkipMigrationException
* @throws \Doctrine\DBAL\Schema\SchemaException
* @throws \Doctrine\DBAL\DBALException
*/
function preCondition(\PDO $pdo) {
return true;
public function up(Schema $schema)
{
$this->skipIf($this->legacyCheck($schema, 'Framadate\Migration\Alter_Comment_table_adding_date'), 'Migration has been executed in an earlier database migration system');
$commentTable = $schema->getTable(Utils::table('comment'));
$this->skipIf($commentTable->hasColumn('date'), 'Column date in comment table already exists');
$commentTable->addColumn('date', 'datetime', ['default' => 0]);
}
/**
* This methode is called only one time in the migration page.
*
* @param \PDO $pdo The connection to database
* @return bool true is the execution succeeded
* @param Schema $schema
* @throws \Doctrine\DBAL\Schema\SchemaException
*/
function execute(\PDO $pdo) {
$this->alterCommentTable($pdo);
public function down(Schema $schema)
{
$commentTable = $schema->getTable(Utils::table('comment'));
return true;
}
private function alterCommentTable(\PDO $pdo) {
$pdo->exec('
ALTER TABLE `' . Utils::table('comment') . '`
ADD `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ;');
$commentTable->dropColumn('comment');
}
}

View File

@ -0,0 +1,72 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Framadate\AbstractMigration;
use Framadate\Utils;
/**
* This migration adds the fields password_hash and results_publicly_visible on the poll table.
*
* @package Framadate\Migration
* @version 0.9
*/
class Version20151028000000 extends AbstractMigration
{
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
public function description()
{
return 'Add columns "password_hash" and "results_publicly_visible" in table "vote" for version 0.9';
}
/**
* @param Schema $schema
* @throws \Doctrine\DBAL\Migrations\SkipMigrationException
* @throws \Doctrine\DBAL\Schema\SchemaException
* @throws \Doctrine\DBAL\DBALException
*/
public function up(Schema $schema)
{
$this->skipIf($this->legacyCheck($schema, 'Framadate\Migration\AddColumns_password_hash_And_results_publicly_visible_In_poll_For_0_9'), 'Migration has been executed in an earlier database migration system');
$pollTable = $schema->getTable(Utils::table('poll'));
$this->skipIf($pollTable->hasColumn('password_hash'), 'Column password_hash in table poll already exists');
$this->skipIf($pollTable->hasColumn('results_publicly_visible'), 'Column results_publicly_visible in table poll already exists');
$pollTable->addColumn('password_hash', 'string', ['notnull' => false]);
$pollTable->addColumn('results_publicly_visible', 'boolean', ['notnull' => false]);
}
/**
* @param Schema $schema
* @throws \Doctrine\DBAL\Schema\SchemaException
*/
public function down(Schema $schema)
{
$pollTable = $schema->getTable(Utils::table('poll'));
$pollTable->dropColumn('password_hash');
$pollTable->dropColumn('results_publicly_visible');
}
}

View File

@ -0,0 +1,51 @@
<?php
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\DBAL\Types\Type;
use Framadate\AbstractMigration;
use Framadate\Utils;
class Version20151205000000 extends AbstractMigration
{
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
public function description()
{
return 'Increase the size of id column in poll table';
}
/**
* @param Schema $schema
* @throws \Doctrine\DBAL\Schema\SchemaException
* @throws \Doctrine\DBAL\DBALException
* @throws \Doctrine\DBAL\Migrations\SkipMigrationException
*/
public function up(Schema $schema)
{
$this->skipIf($this->legacyCheck($schema, 'Framadate\Migration\Increase_pollId_size'), 'Migration has been executed in an earlier database migration system');
$commentTable = $schema->getTable(Utils::table('comment'));
$commentTable->changeColumn('poll_id', ['type' => Type::getType('string'), 'length' => 64, 'notnull' => true]);
$pollTable = $schema->getTable(Utils::table('poll'));
$pollTable->changeColumn('id', ['type' => Type::getType('string'), 'length' => 64, 'notnull' => true]);
$slotTable = $schema->getTable(Utils::table('slot'));
$slotTable->changeColumn('poll_id', ['type' => Type::getType('string'), 'length' => 64, 'notnull' => true]);
$voteTable = $schema->getTable(Utils::table('vote'));
$voteTable->changeColumn('poll_id', ['type' => Type::getType('string'), 'length' => 64, 'notnull' => true]);
}
public function down(Schema $schema)
{
// TODO: Implement down() method.
}
}

View File

@ -16,8 +16,10 @@
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace Framadate\Migration;
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Framadate\AbstractMigration;
use Framadate\Utils;
/**
@ -26,45 +28,38 @@ use Framadate\Utils;
* @package Framadate\Migration
* @version 0.9
*/
class AddColumn_ValueMax_In_poll_For_1_1 implements Migration {
function __construct() {
}
class Version20180220000000 extends AbstractMigration
{
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
function description() {
public function description()
{
return 'Add column "ValueMax" in table "vote" for version 0.9';
}
/**
* This method could check if the execute method should be called.
* It is called before the execute method.
*
* @param \PDO $pdo The connection to database
* @return bool true is the Migration should be executed.
* @param Schema $schema
* @throws \Doctrine\DBAL\Schema\SchemaException
* @throws \Doctrine\DBAL\Migrations\SkipMigrationException
* @throws \Doctrine\DBAL\DBALException
*/
function preCondition(\PDO $pdo) {
return true;
public function up(Schema $schema)
{
$this->skipIf($this->legacyCheck($schema, 'Framadate\Migration\AddColumn_ValueMax_In_poll_For_1_1'), 'Migration has been executed in an earlier database migration system');
$pollTable = $schema->getTable(Utils::table('poll'));
$pollTable->addColumn('ValueMax', 'smallint', ['default' => null, 'notnull' => false]);
}
/**
* This method is called only one time in the migration page.
*
* @param \PDO $pdo The connection to database
* @return bool true is the execution succeeded
* @param Schema $schema
* @throws \Doctrine\DBAL\Schema\SchemaException
*/
function execute(\PDO $pdo) {
$this->alterPollTable($pdo);
return true;
}
private function alterPollTable(\PDO $pdo) {
$pdo->exec('
ALTER TABLE `' . Utils::table('poll') . '`
ADD `ValueMax` TINYINT NULL;');
public function down(Schema $schema)
{
$pollTable = $schema->getTable(Utils::table('poll'));
$pollTable->dropColumn('ValueMax');
}
}

View File

@ -0,0 +1,88 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace DoctrineMigrations;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Schema\Schema;
use Framadate\AbstractMigration;
use Framadate\Utils;
/**
* This migration sets Poll.end_date to NULL by default
*
* @package Framadate\Migration
* @version 1.1
*/
class Version20180411000000 extends AbstractMigration
{
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
public function description()
{
return 'Sets Poll end_date to NULL by default (work around MySQL NO_ZERO_DATE)';
}
/**
* This method could check if the execute method should be called.
* It is called before the execute method.
*
* @param Connection|\PDO $connection The connection to database
* @return bool true if the Migration should be executed.
*/
public function preCondition(Connection $connection)
{
$driver_name = $connection->getWrappedConnection()->getAttribute(\PDO::ATTR_DRIVER_NAME);
if ($driver_name === 'mysql') {
$stmt = $connection->prepare(
"SELECT Column_Default from Information_Schema.Columns where Table_Name = ? AND Column_Name = ?;"
);
$stmt->bindValue(1, Utils::table('poll'));
$stmt->bindValue(2, 'end_date');
$stmt->execute();
$default = $stmt->fetch(\PDO::FETCH_COLUMN);
return $default === null;
}
return true;
}
/**
* @param Schema $schema
* @throws \Doctrine\DBAL\Schema\SchemaException
* @throws \Doctrine\DBAL\Migrations\SkipMigrationException
* @throws \Doctrine\DBAL\DBALException
*/
public function up(Schema $schema)
{
// We don't disable this migration even if legacy because it wasn't working correctly before
// $this->skipIf($this->legacyCheck($schema, 'Framadate\Migration\Fix_MySQL_No_Zero_Date'), 'Migration has been executed in an earlier database migration system');
$this->skipIf($this->preCondition($this->connection), "Database server isn't MySQL or poll end_date default value was already NULL");
$poll = $schema->getTable(Utils::table('poll'));
$poll->changeColumn('end_date', ['default' => null, 'notnull' => false]);
}
public function down(Schema $schema)
{
// nothing
}
}

View File

@ -0,0 +1,65 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Framadate\AbstractMigration;
use Framadate\Utils;
/**
* This migration adds the column collect_users_mail in the poll table
*
* @package Framadate\Migration
* @version 1.2
*/
class Version20180419170000 extends AbstractMigration
{
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
public function description()
{
return 'Add column collect_users_mail in table poll';
}
/**
* @param Schema $schema
* @throws \Doctrine\DBAL\Schema\SchemaException
* @throws \Doctrine\DBAL\Migrations\SkipMigrationException
* @throws \Doctrine\DBAL\DBALException
*/
public function up(Schema $schema)
{
$this->skipIf($this->legacyCheck($schema, 'Framadate\Migration\AddColumn_collect_mail_In_poll'), 'Migration has been executed in an earlier database migration system');
$poll = $schema->getTable(Utils::table('poll'));
$poll->addColumn('collect_users_mail', 'boolean', ['default' => false]);
}
/**
* @param Schema $schema
* @throws \Doctrine\DBAL\Schema\SchemaException
*/
public function down(Schema $schema)
{
$poll = $schema->getTable(Utils::table('poll'));
$poll->dropColumn('collect_users_mail');
}
}

View File

@ -0,0 +1,65 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Framadate\AbstractMigration;
use Framadate\Utils;
/**
* This migration adds the column mail in the vote table
*
* @package Framadate\Migration
* @version 1.2
*/
class Version20180419180000 extends AbstractMigration
{
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
public function description()
{
return 'Add column mail in table vote';
}
/**
* @param Schema $schema
* @throws \Doctrine\DBAL\Schema\SchemaException
* @throws \Doctrine\DBAL\Migrations\SkipMigrationException
* @throws \Doctrine\DBAL\DBALException
*/
public function up(Schema $schema)
{
$this->skipIf($this->legacyCheck($schema, 'Framadate\Migration\AddColumn_collect_mail_In_poll'), 'Migration has been executed in an earlier database migration system');
$vote = $schema->getTable(Utils::table('vote'));
$vote->addColumn('mail', 'string', ['default' => null, 'notnull' => false]);
}
/**
* @param Schema $schema
* @throws \Doctrine\DBAL\Schema\SchemaException
*/
public function down(Schema $schema)
{
$vote = $schema->getTable(Utils::table('vote'));
$vote->dropColumn('mail');
}
}

View File

@ -16,31 +16,45 @@
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace Framadate\Migration;
namespace DoctrineMigrations;
interface Migration {
use Doctrine\DBAL\Schema\Schema;
use Framadate\AbstractMigration;
use Framadate\Utils;
/**
* This migration adds the column mail in the vote table
*
* @package Framadate\Migration
* @version 1.2
*/
class Version20180419190000 extends AbstractMigration
{
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
function description();
/**
* This method could check if the execute method should be called.
* It is called before the execute method.
*
* @param \PDO $pdo The connection to database
* @return bool true if the Migration should be executed
*/
function preCondition(\PDO $pdo);
/**
* This methode is called only one time in the migration page.
*
* @param \PDO $pdo The connection to database
* @return bool true if the execution succeeded
*/
function execute(\PDO $pdo);
public function description()
{
return 'Remove the old migration table';
}
/**
* @param Schema $schema
* @throws \Doctrine\DBAL\Migrations\SkipMigrationException
*/
public function up(Schema $schema)
{
$this->skipIf(!$schema->hasTable(Utils::table(MIGRATION_TABLE)), "The old migration table wasn't created, no need to delete it.");
$schema->dropTable(Utils::table(MIGRATION_TABLE));
}
/**
* @param Schema $schema
*/
public function down(Schema $schema)
{
// No need to recreate legacy migration table
}
}

View File

@ -0,0 +1,100 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Framadate\AbstractMigration;
use Framadate\Utils;
/**
* This migration adds the column collect_users_mail in the poll table
*
* @package Framadate\Migration
* @version 1.2
*/
class Version20180525110000 extends AbstractMigration
{
/**
* This method should describe in english what is the purpose of the migration class.
*
* @return string The description of the migration class
*/
public function description()
{
return 'Change column collect_users_mail in table poll from boolean to smallint';
}
/**
* @param Schema $schema
* @throws \Doctrine\DBAL\Schema\SchemaException
* @throws \Doctrine\DBAL\DBALException
*/
public function up(Schema $schema)
{
$poll = $schema->getTable(Utils::table('poll'));
$poll->addColumn('collect_users_mail_integer', 'smallint', ['default' => 0]);
}
/**
* @param Schema $schema
*/
public function postUp(Schema $schema)
{
$this->addSql('UPDATE ' . Utils::table('poll') . ' SET collect_users_mail_integer = collect_users_mail');
$this->addSql('ALTER TABLE ' . Utils::table('poll') . ' DROP COLUMN collect_users_mail');
if ($this->connection->getDatabasePlatform()->getName() === 'mysql') {
$this->addSql(
'ALTER TABLE ' . Utils::table('poll') . ' CHANGE collect_users_mail_integer collect_users_mail SMALLINT'
);
} else {
$this->addSql(
'ALTER TABLE ' . Utils::table('poll') . ' RENAME COLUMN collect_users_mail_integer to collect_users_mail'
);
}
}
/**
* @param Schema $schema
* @throws \Doctrine\DBAL\Schema\SchemaException
*/
public function down(Schema $schema)
{
$poll = $schema->getTable(Utils::table('poll'));
$poll->addColumn('collect_users_mail_boolean', 'boolean', ['default' => false]);
}
/**
* @param Schema $schema
*/
public function postDown(Schema $schema)
{
$this->addSql('UPDATE ' . Utils::table('poll') . ' SET collect_users_mail_boolean = collect_users_mail > 0');
$this->addSql('ALTER TABLE ' . Utils::table('poll') . ' DROP COLUMN collect_users_mail');
if ($this->connection->getDatabasePlatform()->getName() === 'mysql') {
$this->addSql(
'ALTER TABLE ' . Utils::table('poll') . ' CHANGE collect_users_mail_boolean collect_users_mail SMALLINT'
);
} else {
$this->addSql(
'ALTER TABLE ' . Utils::table('poll') . ' RENAME COLUMN collect_users_mail_boolean to collect_users_mail'
);
}
}
}

View File

@ -1,43 +1,69 @@
<?php
namespace Framadate\Repositories;
use Framadate\FramaDB;
use Doctrine\DBAL\Connection;
abstract class AbstractRepository {
/**
* @var FramaDB
* @var Connection
*/
private $connect;
protected $connect;
/**
* PollRepository constructor.
* @param FramaDB $connect
* @param Connection $connect
*/
function __construct(FramaDB $connect) {
public function __construct(Connection $connect) {
$this->connect = $connect;
$this->connect->setFetchMode(\PDO::FETCH_OBJ);
}
public function beginTransaction() {
public function beginTransaction()
{
$this->connect->beginTransaction();
}
public function commit() {
/**
* @throws \Doctrine\DBAL\ConnectionException
*/
public function commit()
{
$this->connect->commit();
}
function rollback() {
/**
* @throws \Doctrine\DBAL\ConnectionException
*/
public function rollback()
{
$this->connect->rollback();
}
public function prepare($sql) {
/**
* @param string $sql
* @throws \Doctrine\DBAL\DBALException
* @return bool|\Doctrine\DBAL\Driver\Statement|\PDOStatement
*/
public function prepare($sql)
{
return $this->connect->prepare($sql);
}
function query($sql) {
/**
* @param string $sql
* @throws \Doctrine\DBAL\DBALException
* @return bool|\Doctrine\DBAL\Driver\Statement|\PDOStatement
*/
public function query($sql)
{
return $this->connect->query($sql);
}
function lastInsertId() {
/**
* @return string
*/
public function lastInsertId()
{
return $this->connect->lastInsertId();
}
}

View File

@ -1,16 +1,16 @@
<?php
namespace Framadate\Repositories;
use Framadate\FramaDB;
use Framadate\Utils;
class CommentRepository extends AbstractRepository {
function __construct(FramaDB $connect) {
parent::__construct($connect);
}
function findAllByPollId($poll_id) {
$prepared = $this->prepare('SELECT * FROM `' . Utils::table('comment') . '` WHERE poll_id = ? ORDER BY id');
/**
* @param $poll_id
* @throws \Doctrine\DBAL\DBALException
* @return array
*/
public function findAllByPollId($poll_id) {
$prepared = $this->prepare('SELECT * FROM ' . Utils::table('comment') . ' WHERE poll_id = ? ORDER BY id');
$prepared->execute([$poll_id]);
return $prepared->fetchAll();
@ -24,32 +24,44 @@ class CommentRepository extends AbstractRepository {
* @param $comment
* @return bool
*/
function insert($poll_id, $name, $comment) {
$prepared = $this->prepare('INSERT INTO `' . Utils::table('comment') . '` (poll_id, name, comment) VALUES (?,?,?)');
return $prepared->execute([$poll_id, $name, $comment]);
function insert($poll_id, $name, $comment)
{
return $this->connect->insert(Utils::table('comment'), ['poll_id' => $poll_id, 'name' => $name, 'comment' => $comment]) > 0;
}
function deleteById($poll_id, $comment_id) {
$prepared = $this->prepare('DELETE FROM `' . Utils::table('comment') . '` WHERE poll_id = ? AND id = ?');
return $prepared->execute([$poll_id, $comment_id]);
/**
* @param $poll_id
* @param $comment_id
* @throws \Doctrine\DBAL\Exception\InvalidArgumentException
* @return bool
*/
function deleteById($poll_id, $comment_id)
{
return $this->connect->delete(Utils::table('comment'), ['poll_id' => $poll_id, 'id' => $comment_id]) > 0;
}
/**
* Delete all comments of a given poll.
*
* @param $poll_id int The ID of the given poll.
* @return bool|null true if action succeeded.
* @throws \Doctrine\DBAL\Exception\InvalidArgumentException
* @return bool true if action succeeded.
*/
function deleteByPollId($poll_id) {
$prepared = $this->prepare('DELETE FROM `' . Utils::table('comment') . '` WHERE poll_id = ?');
return $prepared->execute([$poll_id]);
function deleteByPollId($poll_id)
{
return $this->connect->delete(Utils::table('comment'), ['poll_id' => $poll_id]) > 0;
}
public function exists($poll_id, $name, $comment) {
$prepared = $this->prepare('SELECT 1 FROM `' . Utils::table('comment') . '` WHERE poll_id = ? AND name = ? AND comment = ?');
/**
* @param $poll_id
* @param $name
* @param $comment
* @throws \Doctrine\DBAL\DBALException
* @return bool
*/
public function exists($poll_id, $name, $comment)
{
$prepared = $this->prepare('SELECT 1 FROM ' . Utils::table('comment') . ' WHERE poll_id = ? AND name = ? AND comment = ?');
$prepared->execute([$poll_id, $name, $comment]);
return $prepared->rowCount() > 0;

View File

@ -1,79 +1,133 @@
<?php
namespace Framadate\Repositories;
use Framadate\FramaDB;
use Framadate\Utils;
use PDO;
class PollRepository extends AbstractRepository {
function __construct(FramaDB $connect) {
parent::__construct($connect);
/**
* @param $poll_id
* @param $admin_poll_id
* @param $form
*/
public function insertPoll($poll_id, $admin_poll_id, $form)
{
$this->connect->insert(Utils::table('poll'), [
'id' => $poll_id,
'admin_id' => $admin_poll_id,
'title' => $form->title,
'description' => $form->description,
'admin_name' => $form->admin_name,
'admin_mail' => $form->admin_mail,
'end_date' => (new \DateTime)->setTimestamp($form->end_date)->format('Y-m-d H:i:s'),
'format' => $form->format,
'editable' => ($form->editable>=0 && $form->editable<=2) ? $form->editable : 0,
'receiveNewVotes' => $form->receiveNewVotes ? 1 : 0,
'receiveNewComments' => $form->receiveNewComments ? 1 : 0,
'hidden' => $form->hidden ? 1 : 0,
'password_hash' => $form->password_hash,
'results_publicly_visible' => $form->results_publicly_visible ? 1 : 0,
'ValueMax' => $form->ValueMax,
'collect_users_mail' => ($form->collect_users_mail >= 0 && $form->collect_users_mail <= 3) ? $form->collect_users_mail : 0,
]);
}
public function insertPoll($poll_id, $admin_poll_id, $form) {
$sql = 'INSERT INTO `' . Utils::table('poll') . '`
(id, admin_id, title, description, admin_name, admin_mail, end_date, format, editable, receiveNewVotes, receiveNewComments, hidden, password_hash, results_publicly_visible,ValueMax)
VALUES (?,?,?,?,?,?,FROM_UNIXTIME(?),?,?,?,?,?,?,?,?)';
$prepared = $this->prepare($sql);
$prepared->execute([$poll_id, $admin_poll_id, $form->title, $form->description, $form->admin_name, $form->admin_mail, $form->end_date, $form->format, ($form->editable>=0 && $form->editable<=2) ? $form->editable : 0, $form->receiveNewVotes ? 1 : 0, $form->receiveNewComments ? 1 : 0, $form->hidden ? 1 : 0, $form->password_hash, $form->results_publicly_visible ? 1 : 0,$form->ValueMax]);
}
/**
* @param $poll_id
* @throws \Doctrine\DBAL\DBALException
* @return mixed
*/
public function findById($poll_id)
{
$prepared = $this->connect->executeQuery('SELECT * FROM ' . Utils::table('poll') . ' WHERE id = ?', [$poll_id]);
function findById($poll_id) {
$prepared = $this->prepare('SELECT * FROM `' . Utils::table('poll') . '` WHERE id = ?');
$prepared->execute([$poll_id]);
$poll = $prepared->fetch();
$prepared->closeCursor();
return $poll;
}
/**
* @param $admin_poll_id
* @throws \Doctrine\DBAL\DBALException
* @return mixed
*/
public function findByAdminId($admin_poll_id) {
$prepared = $this->prepare('SELECT * FROM `' . Utils::table('poll') . '` WHERE admin_id = ?');
$prepared = $this->connect->executeQuery('SELECT * FROM ' . Utils::table('poll') . ' WHERE admin_id = ?', [$admin_poll_id]);
$prepared->execute([$admin_poll_id]);
$poll = $prepared->fetch();
$prepared->closeCursor();
return $poll;
}
/**
* @param $poll_id
* @throws \Doctrine\DBAL\DBALException
* @return bool
*/
public function existsById($poll_id) {
$prepared = $this->prepare('SELECT 1 FROM `' . Utils::table('poll') . '` WHERE id = ?');
$prepared = $this->prepare('SELECT 1 FROM ' . Utils::table('poll') . ' WHERE id = ?');
$prepared->execute([$poll_id]);
return $prepared->rowCount() > 0;
}
/**
* @param $admin_poll_id
* @throws \Doctrine\DBAL\DBALException
* @return bool
*/
public function existsByAdminId($admin_poll_id) {
$prepared = $this->prepare('SELECT 1 FROM `' . Utils::table('poll') . '` WHERE admin_id = ?');
$prepared = $this->prepare('SELECT 1 FROM ' . Utils::table('poll') . ' WHERE admin_id = ?');
$prepared->execute([$admin_poll_id]);
return $prepared->rowCount() > 0;
}
function update($poll) {
$prepared = $this->prepare('UPDATE `' . Utils::table('poll') . '` SET title=?, admin_name=?, admin_mail=?, description=?, end_date=?, active=?, editable=?, hidden=?, password_hash=?, results_publicly_visible=? WHERE id = ?');
return $prepared->execute([$poll->title, $poll->admin_name, $poll->admin_mail, $poll->description, $poll->end_date, $poll->active, ($poll->editable>=0 && $poll->editable<=2) ? $poll->editable : 0, $poll->hidden ? 1 : 0, $poll->password_hash, $poll->results_publicly_visible ? 1 : 0, $poll->id]);
/**
* @param $poll
* @return bool
*/
public function update($poll)
{
return $this->connect->update(Utils::table('poll'), [
'title' => $poll->title,
'admin_name' => $poll->admin_name,
'admin_mail' => $poll->admin_mail,
'description' => $poll->description,
'end_date' => $poll->end_date, # TODO : Harmonize dates between here and insert
'active' => $poll->active,
'editable' => $poll->editable >= 0 && $poll->editable <= 2 ? $poll->editable : 0,
'hidden' => $poll->hidden ? 1 : 0,
'password_hash' => $poll->password_hash,
'results_publicly_visible' => $poll->results_publicly_visible ? 1 : 0
], [
'id' => $poll->id
]) > 0;
}
function deleteById($poll_id) {
$prepared = $this->prepare('DELETE FROM `' . Utils::table('poll') . '` WHERE id = ?');
return $prepared->execute([$poll_id]);
/**
* @param $poll_id
* @throws \Doctrine\DBAL\Exception\InvalidArgumentException
* @return bool
*/
public function deleteById($poll_id)
{
return $this->connect->delete(Utils::table('poll'), ['id' => $poll_id]) > 0;
}
/**
* Find old polls. Limit: 20.
*
* @throws \Doctrine\DBAL\DBALException
* @return array Array of old polls
*/
public function findOldPolls() {
$prepared = $this->prepare('SELECT * FROM `' . Utils::table('poll') . '` WHERE DATE_ADD(`end_date`, INTERVAL ' . PURGE_DELAY . ' DAY) < NOW() AND `end_date` != 0 LIMIT 20');
$prepared->execute([]);
public function findOldPolls()
{
$prepared = $this->connect->executeQuery('SELECT * FROM ' . Utils::table('poll') . ' WHERE DATE_ADD(end_date, INTERVAL ? DAY) < NOW() AND end_date != 0 LIMIT 20', [PURGE_DELAY]);
return $prepared->fetchAll();
}
@ -84,6 +138,7 @@ class PollRepository extends AbstractRepository {
* @param array $search Array of search : ['id'=>..., 'title'=>..., 'name'=>..., 'mail'=>...]
* @param int $start The number of first entry to select
* @param int $limit The number of entries to find
* @throws \Doctrine\DBAL\DBALException
* @return array The found polls
*/
public function findAll($search, $start, $limit) {
@ -91,8 +146,8 @@ class PollRepository extends AbstractRepository {
$request = "";
$request .= "SELECT p.*,";
$request .= " (SELECT count(1) FROM `" . Utils::table('vote') . "` v WHERE p.id=v.poll_id) votes";
$request .= " FROM `" . Utils::table('poll') . "` p";
$request .= " (SELECT count(1) FROM " . Utils::table('vote') . " v WHERE p.id=v.poll_id) votes";
$request .= " FROM " . Utils::table('poll') . " p";
$request .= " WHERE 1";
$values = [];
@ -139,26 +194,28 @@ class PollRepository extends AbstractRepository {
* Find all polls that are created with the given admin mail.
*
* @param string $mail Email address of the poll admin
* @throws \Doctrine\DBAL\DBALException
* @return array The list of matching polls
*/
public function findAllByAdminMail($mail) {
$prepared = $this->prepare('SELECT * FROM `' . Utils::table('poll') . '` WHERE admin_mail = :admin_mail');
$prepared = $this->prepare('SELECT * FROM ' . Utils::table('poll') . ' WHERE admin_mail = :admin_mail');
$prepared->execute(['admin_mail' => $mail]);
return $prepared->fetchAll();
}
/**
* Get the total number of polls in databse.
* Get the total number of polls in database.
*
* @param array $search Array of search : ['id'=>..., 'title'=>..., 'name'=>...]
* @throws \Doctrine\DBAL\DBALException
* @return int The number of polls
*/
public function count($search = null) {
// Total count
$prepared = $this->prepare('
SELECT count(1) nb
FROM `' . Utils::table('poll') . '` p
FROM ' . Utils::table('poll') . ' p
WHERE (:id = "" OR p.id LIKE :id)
AND (:title = "" OR p.title LIKE :title)
AND (:name = "" OR p.admin_name LIKE :name)

View File

@ -18,7 +18,7 @@
*/
namespace Framadate\Repositories;
use Framadate\FramaDB;
use Doctrine\DBAL\Connection;
class RepositoryFactory {
private static $connect;
@ -29,9 +29,9 @@ class RepositoryFactory {
private static $commentRepository;
/**
* @param FramaDB $connect
* @param Connection $connect
*/
static function init(FramaDB $connect) {
static function init(Connection $connect) {
self::$connect = $connect;
}

View File

@ -4,28 +4,24 @@
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Rapha<EFBFBD>l DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* Ce logiciel est r<EFBFBD>gi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Rapha<EFBFBD>l DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace Framadate\Repositories;
use Framadate\FramaDB;
use Framadate\Choice;
use Framadate\Utils;
class SlotRepository extends AbstractRepository {
function __construct(FramaDB $connect) {
parent::__construct($connect);
}
/**
* Insert a bulk of slots.
*
@ -33,11 +29,10 @@ class SlotRepository extends AbstractRepository {
* @param array $choices
*/
public function insertSlots($poll_id, $choices) {
$prepared = $this->prepare('INSERT INTO `' . Utils::table('slot') . '` (poll_id, title, moments) VALUES (?, ?, ?)');
foreach ($choices as $choice) {
/** @var Choice $choice */
// We prepared the slots (joined by comas)
$joinedSlots = '';
$joinedSlots = null;
$first = true;
foreach ($choice->getSlots() as $slot) {
if ($first) {
@ -49,16 +44,22 @@ class SlotRepository extends AbstractRepository {
}
// We execute the insertion
if (empty($joinedSlots)) {
$prepared->execute([$poll_id, $choice->getName(), null]);
} else {
$prepared->execute([$poll_id, $choice->getName(), $joinedSlots]);
}
$this->connect->insert(Utils::table('slot'), [
'poll_id' => $poll_id,
'title' => $choice->getName(),
'moments' => $joinedSlots
]);
}
}
function listByPollId($poll_id) {
$prepared = $this->prepare('SELECT * FROM `' . Utils::table('slot') . '` WHERE poll_id = ? ORDER BY id');
/**
* @param $poll_id
* @throws \Doctrine\DBAL\DBALException
* @return array
*/
public function listByPollId($poll_id)
{
$prepared = $this->prepare('SELECT * FROM ' . Utils::table('slot') . ' WHERE poll_id = ? ORDER BY id');
$prepared->execute([$poll_id]);
return $prepared->fetchAll();
@ -69,10 +70,11 @@ class SlotRepository extends AbstractRepository {
*
* @param $poll_id int The ID of the poll
* @param $datetime int The datetime of the slot
* @throws \Doctrine\DBAL\DBALException
* @return mixed Object The slot found, or null
*/
function findByPollIdAndDatetime($poll_id, $datetime) {
$prepared = $this->prepare('SELECT * FROM `' . Utils::table('slot') . '` WHERE poll_id = ? AND SUBSTRING_INDEX(title, \'@\', 1) = ?');
$prepared = $this->prepare('SELECT * FROM ' . Utils::table('slot') . ' WHERE poll_id = ? AND SUBSTRING_INDEX(title, \'@\', 1) = ?');
$prepared->execute([$poll_id, $datetime]);
$slot = $prepared->fetch();
@ -89,10 +91,9 @@ class SlotRepository extends AbstractRepository {
* @param $moments mixed|null The moments joined with ","
* @return bool true if action succeeded
*/
function insert($poll_id, $title, $moments) {
$prepared = $this->prepare('INSERT INTO `' . Utils::table('slot') . '` (poll_id, title, moments) VALUES (?,?,?)');
return $prepared->execute([$poll_id, $title, $moments]);
function insert($poll_id, $title, $moments)
{
return $this->connect->insert(Utils::table('slot'), ['poll_id' => $poll_id, 'title' => $title, 'moments' => $moments]) > 0;
}
/**
@ -103,10 +104,9 @@ class SlotRepository extends AbstractRepository {
* @param $newMoments mixed The new moments
* @return bool|null true if action succeeded.
*/
function update($poll_id, $datetime, $newMoments) {
$prepared = $this->prepare('UPDATE `' . Utils::table('slot') . '` SET moments = ? WHERE poll_id = ? AND title = ?');
return $prepared->execute([$newMoments, $poll_id, $datetime]);
function update($poll_id, $datetime, $newMoments)
{
return $this->connect->update(Utils::table('slot'), ['moments' => $newMoments], ['poll_id' => $poll_id, 'title' => $datetime]) > 0;
}
/**
@ -114,15 +114,21 @@ class SlotRepository extends AbstractRepository {
*
* @param $poll_id int The ID of the poll
* @param $datetime mixed The datetime of the slot
* @throws \Doctrine\DBAL\DBALException
* @return bool
*/
function deleteByDateTime($poll_id, $datetime) {
$prepared = $this->prepare('DELETE FROM `' . Utils::table('slot') . '` WHERE poll_id = ? AND title = ?');
$prepared->execute([$poll_id, $datetime]);
public function deleteByDateTime($poll_id, $datetime)
{
return $this->connect->delete(Utils::table('slot'), ['poll_id' => $poll_id, 'title' => $datetime]) > 0;
}
function deleteByPollId($poll_id) {
$prepared = $this->prepare('DELETE FROM `' . Utils::table('slot') . '` WHERE poll_id = ?');
return $prepared->execute([$poll_id]);
/**
* @param $poll_id
* @throws \Doctrine\DBAL\DBALException
* @return bool
*/
public function deleteByPollId($poll_id)
{
return $this->connect->delete(Utils::table('slot'), ['poll_id' => $poll_id]) > 0;
}
}

View File

@ -1,30 +1,38 @@
<?php
namespace Framadate\Repositories;
use Framadate\FramaDB;
use Framadate\Utils;
class VoteRepository extends AbstractRepository {
function __construct(FramaDB $connect) {
parent::__construct($connect);
}
function allUserVotesByPollId($poll_id) {
$prepared = $this->prepare('SELECT * FROM `' . Utils::table('vote') . '` WHERE poll_id = ? ORDER BY id');
/**
* @param $poll_id
* @throws \Doctrine\DBAL\DBALException
* @return array
*/
public function allUserVotesByPollId($poll_id)
{
$prepared = $this->prepare('SELECT * FROM ' . Utils::table('vote') . ' WHERE poll_id = ? ORDER BY id');
$prepared->execute([$poll_id]);
return $prepared->fetchAll();
}
function insertDefault($poll_id, $insert_position) {
$prepared = $this->prepare('UPDATE `' . Utils::table('vote') . '` SET choices = CONCAT(SUBSTRING(choices, 1, ?), " ", SUBSTRING(choices, ?)) WHERE poll_id = ?'); //#51 : default value for unselected vote
/**
* @param $poll_id
* @param $insert_position
* @throws \Doctrine\DBAL\DBALException
* @return bool
*/
public function insertDefault($poll_id, $insert_position)
{
# TODO : Handle this on PHP's side
$prepared = $this->prepare('UPDATE ' . Utils::table('vote') . ' SET choices = CONCAT(SUBSTRING(choices, 1, ?), " ", SUBSTRING(choices, ?)) WHERE poll_id = ?'); //#51 : default value for unselected vote
return $prepared->execute([$insert_position, $insert_position + 1, $poll_id]);
}
function insert($poll_id, $name, $choices, $token) {
$prepared = $this->prepare('INSERT INTO `' . Utils::table('vote') . '` (poll_id, name, choices, uniqId) VALUES (?,?,?,?)');
$prepared->execute([$poll_id, $name, $choices, $token]);
function insert($poll_id, $name, $choices, $token, $mail) {
$this->connect->insert(Utils::table('vote'), ['poll_id' => $poll_id, 'name' => $name, 'choices' => $choices, 'uniqId' => $token, 'mail' => $mail]);
$newVote = new \stdClass();
$newVote->poll_id = $poll_id;
@ -32,26 +40,38 @@ class VoteRepository extends AbstractRepository {
$newVote->name = $name;
$newVote->choices = $choices;
$newVote->uniqId = $token;
$newVote->mail=$mail;
return $newVote;
}
function deleteById($poll_id, $vote_id) {
$prepared = $this->prepare('DELETE FROM `' . Utils::table('vote') . '` WHERE poll_id = ? AND id = ?');
/**
* @param $poll_id
* @param $vote_id
* @throws \Doctrine\DBAL\DBALException
* @return bool
*/
public function deleteById($poll_id, $vote_id)
{
return $this->connect->delete(Utils::table('vote'), ['poll_id' => $poll_id, 'id' => $vote_id]) > 0;
}
return $prepared->execute([$poll_id, $vote_id]);
public function deleteOldVotesByPollId($poll_id, $votesToDelete) {
$prepared = $this->prepare('DELETE FROM `' . Utils::table('vote') . '` WHERE poll_id = ? ORDER BY `poll_id` ASC LIMIT ' . $votesToDelete);
return $prepared->execute([$poll_id]);
}
/**
* Delete all votes of a given poll.
*
* @param $poll_id int The ID of the given poll.
* @throws \Doctrine\DBAL\DBALException
* @return bool|null true if action succeeded.
*/
function deleteByPollId($poll_id) {
$prepared = $this->prepare('DELETE FROM `' . Utils::table('vote') . '` WHERE poll_id = ?');
return $prepared->execute([$poll_id]);
public function deleteByPollId($poll_id)
{
return $this->connect->delete(Utils::table('vote'), ['poll_id' => $poll_id]) > 0;
}
/**
@ -59,18 +79,33 @@ class VoteRepository extends AbstractRepository {
*
* @param $poll_id int The ID of the poll
* @param $index int The index of the vote into the poll
* @throws \Doctrine\DBAL\DBALException
* @return bool|null true if action succeeded.
*/
function deleteByIndex($poll_id, $index) {
$prepared = $this->prepare('UPDATE `' . Utils::table('vote') . '` SET choices = CONCAT(SUBSTR(choices, 1, ?), SUBSTR(choices, ?)) WHERE poll_id = ?');
public function deleteByIndex($poll_id, $index)
{
$prepared = $this->prepare('UPDATE ' . Utils::table('vote') . ' SET choices = CONCAT(SUBSTR(choices, 1, ?), SUBSTR(choices, ?)) WHERE poll_id = ?');
return $prepared->execute([$index, $index + 2, $poll_id]);
}
function update($poll_id, $vote_id, $name, $choices) {
$prepared = $this->prepare('UPDATE `' . Utils::table('vote') . '` SET choices = ?, name = ? WHERE poll_id = ? AND id = ?');
return $prepared->execute([$choices, $name, $poll_id, $vote_id]);
/**
* @param $poll_id
* @param $vote_id
* @param $name
* @param $choices
* @return bool
*/
public function update($poll_id, $vote_id, $name, $choices, $mail)
{
return $this->connect->update(Utils::table('vote'), [
'choices' => $choices,
'name' => $name,
'mail' => $mail,
], [
'poll_id' => $poll_id,
'id' => $vote_id,
]) > 0;
}
/**
@ -78,10 +113,11 @@ class VoteRepository extends AbstractRepository {
*
* @param int $poll_id ID of the poll
* @param string $name Name of the vote
* @throws \Doctrine\DBAL\DBALException
* @return bool true if vote already exists
*/
public function existsByPollIdAndName($poll_id, $name) {
$prepared = $this->prepare('SELECT 1 FROM `' . Utils::table('vote') . '` WHERE poll_id = ? AND name = ?');
$prepared = $this->prepare('SELECT 1 FROM ' . Utils::table('vote') . ' WHERE poll_id = ? AND name = ?');
$prepared->execute([$poll_id, $name]);
return $prepared->rowCount() > 0;
}
@ -92,10 +128,11 @@ class VoteRepository extends AbstractRepository {
* @param int $poll_id ID of the poll
* @param string $name Name of the vote
* @param int $vote_id ID of the current vote
* @throws \Doctrine\DBAL\DBALException
* @return bool true if vote already exists
*/
public function existsByPollIdAndNameAndVoteId($poll_id, $name, $vote_id) {
$prepared = $this->prepare('SELECT 1 FROM `' . Utils::table('vote') . '` WHERE poll_id = ? AND name = ? AND id != ?');
$prepared = $this->prepare('SELECT 1 FROM ' . Utils::table('vote') . ' WHERE poll_id = ? AND name = ? AND id != ?');
$prepared->execute([$poll_id, $name, $vote_id]);
return $prepared->rowCount() > 0;
}

View File

@ -1,10 +1,10 @@
<?php
namespace Framadate\Services;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\DBALException;
use Framadate\Exception\MomentAlreadyExistsException;
use Framadate\FramaDB;
use Framadate\Repositories\RepositoryFactory;
use Framadate\Utils;
/**
* Class AdminPollService
@ -21,7 +21,7 @@ class AdminPollService {
private $voteRepository;
private $commentRepository;
function __construct(FramaDB $connect, PollService $pollService, LogService $logService) {
function __construct(Connection $connect, PollService $pollService, LogService $logService) {
$this->connect = $connect;
$this->pollService = $pollService;
$this->logService = $logService;
@ -197,13 +197,20 @@ class AdminPollService {
* @param $datetime int The datetime
* @param $new_moment string The moment's name
* @throws MomentAlreadyExistsException When the moment to add already exists in database
* @throws \Doctrine\DBAL\ConnectionException
*/
public function addDateSlot($poll_id, $datetime, $new_moment) {
$this->logService->log('ADD_COLUMN', 'id:' . $poll_id . ', datetime:' . $datetime . ', moment:' . $new_moment);
try {
$slots = $this->slotRepository->listByPollId($poll_id);
$result = $this->findInsertPosition($slots, $datetime);
} catch (DBALException $e) {
$this->logService->log('ERROR', "Database error, couldn't find slot insert position" . $e->getMessage());
return;
}
try {
// Begin transaction
$this->connect->beginTransaction();
@ -227,6 +234,9 @@ class AdminPollService {
// Commit transaction
$this->connect->commit();
} catch (DBALException $e) {
$this->connect->rollBack();
}
}
/**
@ -238,6 +248,8 @@ class AdminPollService {
* @param $poll_id int The ID of the poll
* @param $title int The title
* @throws MomentAlreadyExistsException When the moment to add already exists in database
* @throws \Doctrine\DBAL\ConnectionException
* @throws \Doctrine\DBAL\DBALException
*/
public function addClassicSlot($poll_id, $title) {
$this->logService->log('ADD_COLUMN', 'id:' . $poll_id . ', title:' . $title);
@ -302,4 +314,3 @@ class AdminPollService {
return $result;
}
}

View File

@ -115,6 +115,10 @@ class InputService {
return filter_var($editable, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => EDITABLE_CHOICE_REGEX]]);
}
public function filterCollectMail($collectMail) {
return filter_var($collectMail, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => COLLECT_MAIL_CHOICE_REGEX]]);
}
public function filterComment($comment) {
$comment = str_replace("\r\n", "\n", $comment);
return $this->returnIfNotBlank($comment);

View File

@ -17,6 +17,9 @@
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
namespace Framadate\Services;
use Doctrine\DBAL\Configuration;
use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\DriverManager;
use Framadate\Utils;
use Smarty;
@ -33,7 +36,9 @@ class InstallService {
'cleanUrl' => true,
// Database configuration
'dbConnectionString' => 'mysql:host=<HOST>;dbname=<SCHEMA>;port=3306',
'dbName' => 'framadate',
'dbPort' => 3306,
'dbHost' => 'localhost',
'dbUser' => 'root',
'dbPassword' => '',
'dbPrefix' => 'fd_',
@ -50,12 +55,12 @@ class InstallService {
public function install(Smarty &$smarty) {
// Check values are present
if (empty($this->fields['appName']) || empty($this->fields['appMail']) || empty($this->fields['defaultLanguage']) || empty($this->fields['dbConnectionString']) || empty($this->fields['dbUser'])) {
if (empty($this->fields['appName']) || empty($this->fields['appMail']) || empty($this->fields['defaultLanguage']) || empty($this->fields['dbName']) || empty($this->fields['dbHost']) || empty($this->fields['dbPort']) || empty($this->fields['dbUser'])) {
return $this->error('MISSING_VALUES');
}
// Connect to database
$connect = $this->connectTo($this->fields['dbConnectionString'], $this->fields['dbUser'], $this->fields['dbPassword']);
$connect = $this->connectTo($this->fields);
if (!$connect) {
return $this->error('CANT_CONNECT_TO_DATABASE');
}
@ -68,13 +73,25 @@ class InstallService {
return $this->ok();
}
function connectTo($connectionString, $user, $password) {
/**
* @param $fields
* @return \Doctrine\DBAL\Connection|null
*/
function connectTo($fields) {
$doctrineConfig = new Configuration();
$connectionParams = [
'dbname' => $fields['dbName'],
'user' => $fields['dbUser'],
'password' => $fields['dbPassword'],
'host' => $fields['dbHost'],
'driver' => $fields['dbDriver'],
'charset' => $fields['dbDriver'] === 'pdo_mysql' ? 'utf8mb4' : 'utf8',
];
try {
$pdo = @new \PDO($connectionString, $user, $password);
$pdo->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_OBJ);
$pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
return $pdo;
} catch(\Exception $e) {
return DriverManager::getConnection($connectionParams, $doctrineConfig);
} catch (DBALException $e) {
$logger = new LogService();
$logger->log('ERROR', $e->getMessage());
return null;
}
}
@ -91,6 +108,7 @@ class InstallService {
/**
* @param $content
* @return bool|int
*/
function writeToFile($content) {
return @file_put_contents(CONF_FILENAME, $content);

View File

@ -8,18 +8,39 @@ class MailService {
const MAILSERVICE_KEY = 'mailservice';
/**
* @var bool
*/
private $smtp_allowed;
/**
* @var array
*/
private $smtp_options = [];
/**
* @var bool
*/
private $use_sendmail;
/**
* @var LogService
*/
private $logService;
function __construct($smtp_allowed, $smtp_options = []) {
/**
* MailService constructor.
* @param $smtp_allowed
* @param array $smtp_options
* @param bool $use_sendmail
*/
public function __construct($smtp_allowed, $smtp_options = [], $use_sendmail = false) {
$this->logService = new LogService();
$this->smtp_allowed = $smtp_allowed;
if (true === is_array($smtp_options)) {
$this->smtp_options = $smtp_options;
}
$this->use_sendmail = $use_sendmail;
}
public function isValidEmail($email) {
@ -82,7 +103,11 @@ class MailService {
* @param PHPMailer $mailer
*/
private function configureMailer(PHPMailer $mailer) {
if ($this->use_sendmail) {
$mailer->isSendmail();
} else {
$mailer->isSMTP();
}
$available_options = [
'host' => 'Host',

View File

@ -18,11 +18,13 @@
*/
namespace Framadate\Services;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\ConnectionException;
use Doctrine\DBAL\DBALException;
use Framadate\Exception\AlreadyExistsException;
use Framadate\Exception\ConcurrentEditionException;
use Framadate\Exception\ConcurrentVoteException;
use Framadate\Form;
use Framadate\FramaDB;
use Framadate\Repositories\RepositoryFactory;
use Framadate\Security\Token;
@ -35,7 +37,7 @@ class PollService {
private $voteRepository;
private $commentRepository;
function __construct(FramaDB $connect, LogService $logService) {
function __construct(Connection $connect, LogService $logService) {
$this->connect = $connect;
$this->logService = $logService;
$this->pollRepository = RepositoryFactory::pollRepository();
@ -51,23 +53,45 @@ class PollService {
* @return \stdClass|null The found poll, or null
*/
function findById($poll_id) {
try {
if (preg_match(POLL_REGEX, $poll_id)) {
return $this->pollRepository->findById($poll_id);
}
} catch (DBALException $e) {
$this->logService->log('ERROR', 'Database error : ' . $e->getMessage());
}
return null;
}
/**
* @param $admin_poll_id
* @return mixed|null
*/
public function findByAdminId($admin_poll_id) {
try {
if (preg_match(ADMIN_POLL_REGEX, $admin_poll_id)) {
return $this->pollRepository->findByAdminId($admin_poll_id);
}
} catch (DBALException $e) {
$this->logService->log('ERROR', 'Database error : ' . $e->getMessage());
}
return null;
}
function allCommentsByPollId($poll_id) {
/**
* @param $poll_id
* @return array
*/
public function allCommentsByPollId($poll_id)
{
try {
return $this->commentRepository->findAllByPollId($poll_id);
} catch (DBALException $e) {
$this->logService->log('error', $e->getMessage());
return null;
}
}
function allVotesByPollId($poll_id) {
@ -88,17 +112,18 @@ class PollService {
* @param $name
* @param $choices
* @param $slots_hash
* @param string $mail
* @throws AlreadyExistsException
* @throws ConcurrentEditionException
* @throws ConcurrentVoteException
* @return bool
*/
public function updateVote($poll_id, $vote_id, $name, $choices, $slots_hash) {
public function updateVote($poll_id, $vote_id, $name, $choices, $slots_hash, $mail) {
$this->checkVoteConstraints($choices, $poll_id, $slots_hash, $name, $vote_id);
// Update vote
$choices = implode($choices);
return $this->voteRepository->update($poll_id, $vote_id, $name, $choices);
return $this->voteRepository->update($poll_id, $vote_id, $name, $choices, $mail);
}
/**
@ -106,18 +131,19 @@ class PollService {
* @param $name
* @param $choices
* @param $slots_hash
* @param string $mail
* @throws AlreadyExistsException
* @throws ConcurrentEditionException
* @throws ConcurrentVoteException
* @return \stdClass
*/
function addVote($poll_id, $name, $choices, $slots_hash) {
function addVote($poll_id, $name, $choices, $slots_hash, $mail) {
$this->checkVoteConstraints($choices, $poll_id, $slots_hash, $name);
// Insert new vote
$choices = implode($choices);
$token = $this->random(16);
return $this->voteRepository->insert($poll_id, $name, $choices, $token);
return $this->voteRepository->insert($poll_id, $name, $choices, $token, $mail);
}
function addComment($poll_id, $name, $comment) {
@ -135,6 +161,8 @@ class PollService {
function createPoll(Form $form) {
// Generate poll IDs, loop while poll ID already exists
$this->pollRepository->beginTransaction();
try {
if (empty($form->id)) { // User want us to generate an id for him
do {
$poll_id = $this->random(16);
@ -148,14 +176,21 @@ class PollService {
}
// Insert poll + slots
$this->pollRepository->beginTransaction();
$this->pollRepository->insertPoll($poll_id, $admin_poll_id, $form);
$this->slotRepository->insertSlots($poll_id, $form->getChoices());
$this->pollRepository->commit();
$this->logService->log('CREATE_POLL', 'id:' . $poll_id . ', title: ' . $form->title . ', format:' . $form->format . ', admin:' . $form->admin_name . ', mail:' . $form->admin_mail);
$this->logService->log(
'CREATE_POLL',
'id:' . $poll_id . ', title: ' . $form->title . ', format:' . $form->format . ', admin:' . $form->admin_name . ', mail:' . $form->admin_mail
);
return [$poll_id, $admin_poll_id];
} catch (DBALException $e) {
$this->pollRepository->rollback();
$this->logService->log('ERROR', "Poll couldn't be saved : " . $e->getMessage());
return null;
}
}
public function findAllByAdminMail($mail) {
@ -224,6 +259,7 @@ class PollService {
$obj->name = $vote->name;
$obj->uniqId = $vote->uniqId;
$obj->choices = str_split($vote->choices);
$obj->mail = $vote->mail;
$splitted[] = $obj;
}

View File

@ -1,6 +1,7 @@
<?php
namespace Framadate\Services;
use Framadate\FramaDB;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\DBALException;
use Framadate\Repositories\RepositoryFactory;
/**
@ -15,7 +16,7 @@ class PurgeService {
private $voteRepository;
private $commentRepository;
function __construct(FramaDB $connect, LogService $logService) {
function __construct(Connection $connect, LogService $logService) {
$this->logService = $logService;
$this->pollRepository = RepositoryFactory::pollRepository();
$this->slotRepository = RepositoryFactory::slotRepository();
@ -23,12 +24,21 @@ class PurgeService {
$this->commentRepository = RepositoryFactory::commentRepository();
}
public function repeatedCleanings() {
$this->purgeOldPolls();
if (0 === time() % 10) {
$this->cleanDemoPoll();
}
}
/**
* This methode purges all old polls (the ones with end_date in past).
*
* @return bool true is action succeeded
*/
function purgeOldPolls() {
public function purgeOldPolls() {
try {
$oldPolls = $this->pollRepository->findOldPolls();
$count = count($oldPolls);
@ -37,14 +47,41 @@ class PurgeService {
foreach ($oldPolls as $poll) {
if ($this->purgePollById($poll->id)) {
$this->logService->log('EXPIRATION_SUCCESS', 'id: ' . $poll->id . ', title:' . $poll->title . ', format: ' . $poll->format . ', admin: ' . $poll->admin_name);
$this->logService->log(
'EXPIRATION_SUCCESS',
'id: ' . $poll->id . ', title:' . $poll->title . ', format: ' . $poll->format . ', admin: ' . $poll->admin_name
);
} else {
$this->logService->log('EXPIRATION_FAILED', 'id: ' . $poll->id . ', title:' . $poll->title . ', format: ' . $poll->format . ', admin: ' . $poll->admin_name);
$this->logService->log(
'EXPIRATION_FAILED',
'id: ' . $poll->id . ', title:' . $poll->title . ', format: ' . $poll->format . ', admin: ' . $poll->admin_name
);
}
}
}
return $count;
} catch (DBALException $e) {
$this->logService->log('ERROR', $e->getMessage());
return false;
}
}
public function cleanDemoPoll() {
if (!defined("DEMO_POLL_ID") || !defined("DEMO_POLL_NUMBER_VOTES")) {
return;
}
$this->voteRepository->beginTransaction();
$demoVotes = $this->voteRepository->allUserVotesByPollId(DEMO_POLL_ID);
$votesToDelete = count($demoVotes) - DEMO_POLL_NUMBER_VOTES;
if ($votesToDelete > 0) {
$this->voteRepository->deleteOldVotesByPollId(DEMO_POLL_ID, $votesToDelete);
}
$this->voteRepository->commit();
}
/**
@ -53,9 +90,10 @@ class PurgeService {
* @param $poll_id int The ID of the poll
* @return bool true is action succeeded
*/
function purgePollById($poll_id) {
private function purgePollById($poll_id) {
$done = true;
try {
$this->pollRepository->beginTransaction();
$done &= $this->commentRepository->deleteByPollId($poll_id);
$done &= $this->voteRepository->deleteByPollId($poll_id);
@ -67,8 +105,10 @@ class PurgeService {
} else {
$this->pollRepository->rollback();
}
} catch (DBALException $e) {
$this->logService->log('ERROR', $e->getMessage());
}
return $done;
}
}

View File

@ -25,13 +25,16 @@ class Utils {
* @return string Server name
*/
public static function get_server_name() {
$serverName = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : '';
$serverPort = isset($_SERVER['SERVER_PORT']) ? $_SERVER['SERVER_PORT'] : '';
$scheme = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https')) ? 'https' : 'http';
$port = in_array($_SERVER['SERVER_PORT'], ['80', '443'], true) ? '' : ':' . $_SERVER['SERVER_PORT'];
$port = in_array($serverPort, ['80', '443'], true) ? '' : ':' . $serverPort;
$dirname = dirname($_SERVER['SCRIPT_NAME']);
$dirname = $dirname === '\\' ? '/' : $dirname . '/';
$dirname = str_replace('/admin', '', $dirname);
$dirname = str_replace('/action', '', $dirname);
$server_name = (defined('APP_URL') ? APP_URL : $_SERVER['SERVER_NAME']) . $port . $dirname;
$server_name = (defined('APP_URL') ? APP_URL : $serverName) . $port . $dirname;
return $scheme . '://' . preg_replace('#//+#', '/', $server_name);
}

116
app/inc/config.test.php Normal file
View File

@ -0,0 +1,116 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
// Fully qualified domain name of your webserver.
// If this is unset or empty, the servername is determined automatically.
// You *have to set this* if you are running Framadate behind a reverse proxy.
// const APP_URL = '<www.mydomain.fr>';
// Application name
const NOMAPPLICATION = 'Framadate';
// Database administrator email
const ADRESSEMAILADMIN = 'admin@app.tld';
// Email for automatic responses (you should set it to "no-reply")
const ADRESSEMAILREPONSEAUTO = 'no@reply';
// Database driver
const DB_DRIVER = 'pdo_sqlite';
// Database name
const DB_NAME = 'framadate';
// Database host
const DB_HOST = '';
// Database port
const DB_PORT = '';
// Database user
const DB_USER = '';
// Database password
const DB_PASSWORD = '';
// Table name prefix
const TABLENAME_PREFIX = 'fd_';
// Name of the table that stores migration script already executed
const MIGRATION_TABLE = 'framadate_migration';
// Default Language
const DEFAULT_LANGUAGE = 'fr';
// List of supported languages, fake constant as arrays can be used as constants only in PHP >=5.6
$ALLOWED_LANGUAGES = [
'fr' => 'Français',
'en' => 'English',
'oc' => 'Occitan',
'es' => 'Español',
'de' => 'Deutsch',
'nl' => 'Dutch',
'it' => 'Italiano',
'br' => 'Brezhoneg',
];
// Path to image file with the title
const IMAGE_TITRE = 'images/logo-framadate.png';
// Clean URLs, boolean
const URL_PROPRE = false;
// Use REMOTE_USER data provided by web server
const USE_REMOTE_USER = true;
// Path to the log file
const LOG_FILE = 'admin/stdout.log';
// Days (after expiration date) before purging a poll
const PURGE_DELAY = 60;
// Max slots per poll
const MAX_SLOTS_PER_POLL = 366;
// Number of seconds before we allow to resend an "Remember Edit Link" email.
const TIME_EDIT_LINK_EMAIL = 60;
// Config
$config = [
/* general config */
'use_smtp' => false, // use email for polls creation/modification/responses notification
'smtp_options' => [
'host' => 'localhost', // SMTP server (you could add many servers (main and backup for example) : use ";" like separator
'auth' => false, // Enable SMTP authentication
'username' => '', // SMTP username
'password' => '', // SMTP password
'secure' => '', // Enable encryption (false, tls or ssl)
'port' => 25, // TCP port to connect to
],
/* home */
'show_what_is_that' => true, // display "how to use" section
'show_the_software' => true, // display technical information about the software
'show_cultivate_your_garden' => true, // display "development and administration" information
/* create_classic_poll.php / create_date_poll.php */
'default_poll_duration' => 180, // default values for the new poll duration (number of days).
/* create_classic_poll.php */
'user_can_add_img_or_link' => true, // user can add link or URL when creating his poll.
'markdown_editor_by_default' => true, // The markdown editor for the description is enabled by default
'provide_fork_awesome' => true, // Whether the build-in fork-awesome should be provided
];

View File

@ -18,7 +18,7 @@
*/
// FRAMADATE version
const VERSION = '1.1.7';
const VERSION = '1.2.0';
// PHP Needed version
const PHP_NEEDED_VERSION = '5.6';
@ -33,6 +33,7 @@ const CHOICE_REGEX = '/^[ 012]$/';
const BOOLEAN_REGEX = '/^(on|off|true|false|1|0)$/i';
const BOOLEAN_TRUE_REGEX = '/^(on|true|1)$/i';
const EDITABLE_CHOICE_REGEX = '/^[0-2]$/';
const COLLECT_MAIL_CHOICE_REGEX = '/^[0-3]$/';
const BASE64_REGEX = '/^[A-Za-z0-9]+$/';
const MD5_REGEX = '/^[A-Fa-f0-9]{32}$/';

View File

@ -16,8 +16,12 @@
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
use Framadate\FramaDB;
use Doctrine\DBAL\Configuration;
use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\DriverManager;
use Framadate\Repositories\RepositoryFactory;
use Framadate\Services\LogService;
// Autoloading of dependencies with Composer
require_once __DIR__ . '/../../vendor/autoload.php';
@ -32,17 +36,41 @@ if (ini_get('date.timezone') === '') {
}
define('ROOT_DIR', __DIR__ . '/../../');
define('CONF_FILENAME', ROOT_DIR . '/app/inc/config.php');
$path = '/app/inc/config.php';
if (getenv('APP_ENV') === 'test') {
$path = '/app/inc/config.test.php';
}
define('CONF_FILENAME', ROOT_DIR . $path);
require_once __DIR__ . '/constants.php';
if (is_file(CONF_FILENAME)) {
@include_once __DIR__ . '/config.php';
@include_once CONF_FILENAME;
// Connection to database
$connect = new FramaDB(DB_CONNECTION_STRING, DB_USER, DB_PASSWORD);
$doctrineConfig = new Configuration();
$connectionParams = [
'dbname' => DB_NAME,
'user' => DB_USER,
'password' => DB_PASSWORD,
'host' => DB_HOST,
'driver' => DB_DRIVER,
'charset' => DB_DRIVER === 'pdo_mysql' ? 'utf8mb4' : 'utf8',
];
if (DB_DRIVER === 'pdo_sqlite') {
$connectionParams['path'] = 'test_database.sqlite';
}
try {
$connect = DriverManager::getConnection($connectionParams, $doctrineConfig);
RepositoryFactory::init($connect);
$err = 0;
} catch (DBALException $e) {
$logger = new LogService();
$logger->log('ERROR', $e->getMessage());
}
} else {
define('NOMAPPLICATION', 'Framadate');
define('DEFAULT_LANGUAGE', 'fr');

View File

@ -25,11 +25,14 @@ $smarty->setCompileDir(ROOT_DIR . COMPILE_DIR);
$smarty->setCacheDir(ROOT_DIR . '/cache/');
$smarty->caching = false;
$serverName = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : '';
$smarty->assign('APPLICATION_NAME', NOMAPPLICATION);
$smarty->assign('SERVER_URL', Utils::get_server_name());
$smarty->assign('SCRIPT_NAME', $_SERVER['SCRIPT_NAME']);
$smarty->assign('TITLE_IMAGE', IMAGE_TITRE);
$smarty->assign('use_nav_js', strstr($_SERVER['SERVER_NAME'], 'framadate.org'));
$smarty->assign('use_nav_js', strstr($serverName, 'framadate.org'));
$smarty->assign('provide_fork_awesome', !isset($config['provide_fork_awesome']) || $config['provide_fork_awesome']);
$smarty->assign('locale', $locale);
$smarty->assign('langs', $ALLOWED_LANGUAGES);
@ -42,7 +45,7 @@ if (defined('FAVICON')) {
}
// Dev Mode
if (isset($_SERVER['FRAMADATE_DEVMODE']) && $_SERVER['FRAMADATE_DEVMODE']) {
if (isset($_SERVER['FRAMADATE_DEVMODE']) && $_SERVER['FRAMADATE_DEVMODE'] || php_sapi_name() === 'cli-server') {
$smarty->force_compile = true;
$smarty->compile_check = true;
} else {
@ -77,6 +80,21 @@ function smarty_modifier_html($html) {
return Utils::htmlEscape($html);
}
/**
* markdown_to_text
* Retrieves a markdown string and tries to make a plain text value
*
* @param array $options
* @return string
*/
function smarty_function_markdown_to_text($options, Smarty_Internal_Template $template)
{
$locale = \o80\i18n\I18N::instance()->getLoadedLang();
$text = strip_tags(Parsedown::instance()->text($options['markdown']));
$number_letters = (new NumberFormatter($locale, NumberFormatter::ORDINAL))->format($options['id'] + 1);
return $text !== '' ? $text : __f('Poll results', '%s option', $number_letters);
}
function smarty_modifier_html_special_chars($html) {
return Utils::htmlMailEscape($html);
}

View File

@ -1,11 +1,13 @@
<?php
namespace Framadate\Services;
use Framadate\FramaTestCase;
class InputServiceUnitTest extends FramaTestCase
{
public function liste_emails() {
public function liste_emails()
{
return [
// valids addresses
"valid address" => ["example@example.com", "example@example.com"],
@ -23,7 +25,8 @@ class InputServiceUnitTest extends FramaTestCase
/**
* @dataProvider liste_emails
*/
public function test_filterMail($email, $expected) {
public function test_filterMail($email, $expected)
{
$inputService = new InputService();
$filtered = $inputService->filterMail($email);

View File

@ -43,15 +43,6 @@ function bandeau_titre($titre)
<hr class="trait" role="presentation" />
</header>
<main role="main">';
global $connect;
$tables = $connect->allTables();
$diff = array_diff([Utils::table('comment'), Utils::table('poll'), Utils::table('slot'), Utils::table('vote')], $tables);
if (0 !== count($diff)) {
echo '<div class="alert alert-danger">' . __('Error', 'Framadate is not properly installed, please check the "INSTALL" to setup the database before continuing.') . '</div>';
bandeau_pied();
die();
}
}
function liste_lang()

58
bin/doctrine Executable file
View File

@ -0,0 +1,58 @@
#!/usr/bin/env php
<?php
use Doctrine\DBAL\Migrations\Configuration\Configuration;
use Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper;
use Framadate\Utils;
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Helper\HelperSet;
use Symfony\Component\Console\Helper\QuestionHelper;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Style\SymfonyStyle;
try {
require_once __DIR__ . '/../app/inc/init.php';
$input = new ArgvInput();
$output = new ConsoleOutput();
$style = new SymfonyStyle($input, $output);
if ($connect === null) {
throw new \Exception("Undefined database connection\n");
}
// replace the ConsoleRunner::run() statement with:
$cli = new Application('Doctrine Command Line Interface', VERSION);
$cli->setCatchExceptions(true);
$helperSet = new HelperSet(
[
'db' => new ConnectionHelper($connect),
'question' => new QuestionHelper(),
]
);
$cli->setHelperSet($helperSet);
$migrateCommand = new \Doctrine\DBAL\Migrations\Tools\Console\Command\MigrateCommand();
$statusCommand = new \Doctrine\DBAL\Migrations\Tools\Console\Command\StatusCommand();
$migrationsDirectory = __DIR__ . '/../app/classes/Framadate/Migrations';
$configuration = new Configuration($connect);
$configuration->setMigrationsTableName(Utils::table(MIGRATION_TABLE) . '_new');
$configuration->setMigrationsDirectory($migrationsDirectory);
$configuration->setMigrationsNamespace('DoctrineMigrations');
$configuration->registerMigrationsFromDirectory($migrationsDirectory);
$migrateCommand->setMigrationConfiguration($configuration);
$statusCommand->setMigrationConfiguration($configuration);
// Register All Doctrine Commands
$cli->addCommands([$migrateCommand, $statusCommand]);
// Runs console application
$cli->run($input, $output);
} catch (\Exception $e) {
$style->error($e->getMessage());
}

View File

@ -62,7 +62,10 @@
"ircmaxell/password-compat": "dev-master",
"roave/security-advisories": "dev-master",
"erusev/parsedown": "^1.7",
"egulias/email-validator": "~2.1"
"egulias/email-validator": "~2.1",
"doctrine/dbal": "^2.5",
"doctrine/migrations": "^1.5",
"sensiolabs/ansi-to-html": "^1.1"
},
"require-dev": {

1463
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -17,6 +17,8 @@
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
use Framadate\Choice;
use Framadate\Form;
use Framadate\Services\InputService;
use Framadate\Services\LogService;
use Framadate\Services\MailService;
use Framadate\Services\PollService;
@ -30,7 +32,7 @@ include_once __DIR__ . '/app/inc/init.php';
/*---------*/
$logService = new LogService();
$pollService = new PollService($connect, $logService);
$mailService = new MailService($config['use_smtp'], $config['smtp_options']);
$mailService = new MailService($config['use_smtp'], $config['smtp_options'], $config['use_sendmail']);
$purgeService = new PurgeService($connect, $logService);
$sessionService = new SessionService();
@ -40,102 +42,85 @@ if (is_file('bandeaux_local.php')) {
include_once('bandeaux.php');
}
// Step 1/4 : error if $_SESSION from info_sondage are not valid
if (empty($_SESSION['form']->title) || empty($_SESSION['form']->admin_name) || (($config['use_smtp']) ? empty($_SESSION['form']->admin_mail) : false)) {
$smarty->assign('title', __('Error', 'Error!'));
$smarty->assign('error', __('Error', 'You haven\'t filled the first section of the poll creation.'));
$smarty->display('error.tpl');
exit;
}
// Min/Max archive date
$min_expiry_time = $pollService->minExpiryDate();
$max_expiry_time = $pollService->maxExpiryDate();
// The poll format is AUTRE (other)
if ($_SESSION['form']->format !== 'A') {
$_SESSION['form']->format = 'A';
$_SESSION['form']->clearChoices();
}
$form = isset($_SESSION['form']) ? unserialize($_SESSION['form']) : null;
// Step 4 : Data prepare before insert in DB
if (isset($_POST['confirmation'])) {
// Define expiration date
$enddate = filter_input(INPUT_POST, 'enddate', FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => '#^[0-9]{2}/[0-9]{2}/[0-9]{4}$#']]);
if (!empty($enddate)) {
$registredate = explode('/', $enddate);
if (is_array($registredate) && count($registredate) === 3) {
$time = mktime(0, 0, 0, $registredate[1], $registredate[0], $registredate[2]);
if ($time < $min_expiry_time) {
$_SESSION['form']->end_date = $min_expiry_time;
} elseif ($max_expiry_time < $time) {
$_SESSION['form']->end_date = $max_expiry_time;
} else {
$_SESSION['form']->end_date = $time;
}
}
}
if (empty($_SESSION['form']->end_date)) {
// By default, expiration date is 6 months after last day
$_SESSION['form']->end_date = $max_expiry_time;
}
// Insert poll in database
$ids = $pollService->createPoll($_SESSION['form']);
$poll_id = $ids[0];
$admin_poll_id = $ids[1];
// Send confirmation by mail if enabled
if ($config['use_smtp'] === true) {
$message = __('Mail', "This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.");
$message .= '<br/><br/>';
$message .= Utils::htmlMailEscape($_SESSION['form']->admin_name) . ' ' . __('Mail', 'hast just created a poll called') . ' : "' . Utils::htmlMailEscape($_SESSION['form']->title) . '".<br/>';
$message .= sprintf(__('Mail', 'Thanks for filling the poll at the link above') . ' :<br/><br/><a href="%1$s">%1$s</a>', Utils::getUrlSondage($poll_id));
$message_admin = __('Mail', "This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above");
$message_admin .= sprintf(' :<br/><br/><a href="%1$s">%1$s</a>', Utils::getUrlSondage($admin_poll_id, true));
if ($mailService->isValidEmail($_SESSION['form']->admin_mail)) {
$mailService->send($_SESSION['form']->admin_mail, '[' . NOMAPPLICATION . '][' . __('Mail', 'Author\'s message') . '] ' . __('Generic', 'Poll') . ': ' . $_SESSION['form']->title, $message_admin);
$mailService->send($_SESSION['form']->admin_mail, '[' . NOMAPPLICATION . '][' . __('Mail', 'For sending to the polled users') . '] ' . __('Generic', 'Poll') . ': ' . $_SESSION['form']->title, $message);
}
}
// Clean Form data in $_SESSION
unset($_SESSION['form']);
// Delete old polls
$purgeService->purgeOldPolls();
// creation message
$sessionService->set("Framadate", "messagePollCreated", TRUE);
// Redirect to poll administration
header('Location:' . Utils::getUrlSondage($admin_poll_id, true));
if ($form === null || !($form instanceof Form)) {
$smarty->assign('title', __('Error', 'Error!'));
$smarty->assign('error', __('Error', 'You haven\'t filled the first section of the poll creation, or your session has expired.'));
$smarty->display('error.tpl');
exit;
} // Step 3/4 : Confirm poll creation and choose a removal date
else if (isset($_POST['fin_sondage_autre'])) {
// Store choices in $_SESSION
if (isset($_POST['choices'])) {
$_SESSION['form']->clearChoices();
}
// The poll format is AUTRE (other) if we are in this file
if (!isset($form->format)) {
$form->format = 'A';
}
// The poll format is AUTRE (other)
if ($form->format !== 'A') {
$form->format = 'A';
$form->clearChoices();
}
if (!isset($form->title) || !isset($form->admin_name) || ($config['use_smtp'] && !isset($form->admin_mail))) {
$step = 1;
} elseif (isset($_POST['confirmation'])) {
$step = 4;
} elseif (empty($_POST['fin_sondage_autre']) ) {
$step = 2;
} else {
$step = 3;
}
switch ($step) {
case 2: // Step 2/4 : Select choices of the poll
$choices = $form->getChoices();
$nb_choices = max( 5- count($choices), 0);
while ($nb_choices-- > 0) {
$c = new Choice('');
$form->addChoice($c);
}
$_SESSION['form'] = serialize($form);
// Display step 2
$smarty->assign('title', __('Step 2 classic', 'Poll subjects (2 on 3)'));
$smarty->assign('choices', $form->getChoices());
$smarty->assign('allowMarkdown', $config['user_can_add_img_or_link']);
$smarty->assign('error', null);
$smarty->display('create_classic_poll_step_2.tpl');
exit;
case 3: // Step 3/4 : Confirm poll creation and choose a removal date
// Handle Step2 submission
if (!empty($_POST['choices'])) {
// remove empty choices
$_POST['choices'] = array_filter($_POST['choices'], function ($c) {
return !empty($c);
});
$form->clearChoices();
// store choices in $_SESSION
foreach ($_POST['choices'] as $c) {
if (!empty($c)) {
$c = strip_tags($c);
$choice = new Choice($c);
$_SESSION['form']->addChoice($choice);
}
$form->addChoice($choice);
}
}
// Expiration date is initialised with config parameter. Value will be modified in step 4 if user has defined an other date
$_SESSION['form']->end_date = $max_expiry_time;
$form->end_date = $max_expiry_time;
// Summary
$summary = '<ol>';
foreach ($_SESSION['form']->getChoices() as $i=>$choice) {
foreach ($form->getChoices() as $i => $choice) {
/** @var Choice $choice */
preg_match_all('/\[!\[(.*?)\]\((.*?)\)\]\((.*?)\)/', $choice->getName(), $md_a_img); // Markdown [![alt](src)](href)
preg_match_all('/!\[(.*?)\]\((.*?)\)/', $choice->getName(), $md_img); // Markdown ![alt](src)
preg_match_all('/\[(.*?)\]\((.*?)\)/', $choice->getName(), $md_a); // Markdown [text](href)
@ -159,98 +144,77 @@ if (empty($_SESSION['form']->title) || empty($_SESSION['form']->admin_name) || (
$end_date_str = utf8_encode(strftime($date_format['txt_date'], $max_expiry_time)); //textual date
$_SESSION['form'] = serialize($form);
$smarty->assign('title', __('Step 3', 'Removal date and confirmation (3 on 3)'));
$smarty->assign('summary', $summary);
$smarty->assign('end_date_str', $end_date_str);
$smarty->assign('default_poll_duration', $config['default_poll_duration']);
$smarty->assign('use_smtp', $config['use_smtp']);
$smarty->display('create_classic_poll_step3.tpl');
$smarty->display('create_poll_step_3.tpl');
exit;
case 4: // Step 4 : Data prepare before insert in DB
$enddate = filter_input(INPUT_POST, 'enddate', FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => '#^[0-9]{2}/[0-9]{2}/[0-9]{4}$#']]);
// Step 2/4 : Select choices of the poll
if (!empty($enddate)) {
$registredate = explode('/', $enddate);
if (is_array($registredate) && count($registredate) === 3) {
$time = mktime(0, 0, 0, $registredate[1], $registredate[0], $registredate[2]);
if ($time < $min_expiry_time) {
$form->end_date = $min_expiry_time;
} elseif ($max_expiry_time < $time) {
$form->end_date = $max_expiry_time;
} else {
Utils::print_header(__('Step 2 classic', 'Poll subjects (2 on 3)'));
bandeau_titre(__('Step 2 classic', 'Poll subjects (2 on 3)'));
echo '
<form name="formulaire" action="' . Utils::get_server_name() . 'create_classic_poll.php" method="POST" class="form-horizontal" role="form">
<div class="row">
<div class="col-md-8 col-md-offset-2">';
echo '
<div class="alert alert-info">
<p>' . __('Step 2 classic', 'To make a generic poll you need to propose at least two choices between differents subjects.') . '</p>
<p>' . __('Step 2 classic', 'You can add or remove additional choices with the buttons') . ' <span class="glyphicon glyphicon-minus text-info"></span><span class="sr-only">' . __('Generic', 'Remove') . '</span> <span class="glyphicon glyphicon-plus text-success"></span><span class="sr-only">' . __('Generic', 'Add') . '</span></p>';
if ($config['user_can_add_img_or_link']) {
echo ' <p>' . __('Step 2 classic', 'It\'s possible to propose links or images by using') . ' <a href="http://' . $locale . '.wikipedia.org/wiki/Markdown">' . __('Step 2 classic', 'the Markdown syntax') . '</a>.</p>';
$form->end_date = $time;
}
echo ' </div>' . "\n";
// Fields choices : 5 by default
$choices = $_SESSION['form']->getChoices();
$nb_choices = max(count($choices), 5);
for ($i = 0; $i < $nb_choices; $i++) {
$choice = isset($choices[$i]) ? $choices[$i] : new Choice();
echo '
<div class="form-group choice-field">
<label for="choice' . $i . '" class="col-sm-2 control-label">' . __('Generic', 'Choice') . ' ' . ($i + 1) . '</label>
<div class="col-sm-10 input-group">
<input type="text" class="form-control" name="choices[]" size="40" value="' . $choice->getName() . '" id="choice' . $i . '" />';
if ($config['user_can_add_img_or_link']) {
echo '<span class="input-group-addon btn-link md-a-img" title="' . __('Step 2 classic', 'Add a link or an image') . ' - ' . __('Generic', 'Choice') . ' ' . ($i + 1) . '" ><span class="glyphicon glyphicon-picture"></span> <span class="glyphicon glyphicon-link"></span></span>';
}
echo '
</div>
</div>' . "\n";
}
echo '
<div class="col-md-4">
<div class="btn-group btn-group">
<button type="button" id="remove-a-choice" class="btn btn-default" title="' . __('Step 2 classic', 'Remove a choice') . '"><span class="glyphicon glyphicon-minus text-info"></span><span class="sr-only">' . __('Generic', 'Remove') . '</span></button>
<button type="button" id="add-a-choice" class="btn btn-default" title="' . __('Step 2 classic', 'Add a choice') . '"><span class="glyphicon glyphicon-plus text-success"></span><span class="sr-only">' . __('Generic', 'Add') . '</span></button>
</div>
</div>
<div class="col-md-8 text-right">
<a class="btn btn-default" href="' . Utils::get_server_name() . 'create_poll.php?type=classic" title="' . __('Step 2', 'Back to step 1') . '">' . __('Generic', 'Back') . '</a>
<button name="fin_sondage_autre" value="' . __('Generic', 'Next') . '" type="submit" class="btn btn-success disabled" title="' . __('Step 2', 'Go to step 3') . '">' . __('Generic', 'Next') . '</button>
</div>
</div>
</div>
<div class="modal fade" id="md-a-imgModal" tabindex="-1" role="dialog" aria-labelledby="md-a-imgModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">' . __('Generic', 'Close') . '</span></button>
<p class="modal-title" id="md-a-imgModalLabel">' . __('Step 2 classic', 'Add a link or an image') . '</p>
</div>
<div class="modal-body">
<p class="alert alert-info">' . __('Step 2 classic', 'These fields are optional. You can add a link, an image or both.') . '</p>
<div class="form-group">
<label for="md-img"><span class="glyphicon glyphicon-picture"></span> ' . __('Step 2 classic', 'URL of the image') . '</label>
<input id="md-img" type="text" placeholder="http://…" class="form-control" size="40" />
</div>
<div class="form-group">
<label for="md-a"><span class="glyphicon glyphicon-link"></span> ' . __('Generic', 'Link') . '</label>
<input id="md-a" type="text" placeholder="http://…" class="form-control" size="40" />
</div>
<div class="form-group">
<label for="md-text">' . __('Step 2 classic', 'Alternative text') . '</label>
<input id="md-text" type="text" class="form-control" size="40" />
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">' . __('Generic', 'Cancel') . '</button>
<button type="button" class="btn btn-primary">' . __('Generic', 'Add') . '</button>
</div>
</div>
</div>
</div>
</form>
<script type="text/javascript" src="js/app/framadatepicker.js"></script>
<script type="text/javascript" src="js/app/classic_poll.js"></script>
' . "\n";
bandeau_pied();
if (empty($form->end_date)) {
// By default, expiration date is 6 months after last day
$form->end_date = $max_expiry_time;
}
// Insert poll in database
$ids = $pollService->createPoll($form);
$poll_id = $ids[0];
$admin_poll_id = $ids[1];
// Send confirmation by mail if enabled
if ($config['use_smtp'] === true) {
$message = __('Mail', "This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.");
$message .= '<br/><br/>';
$message .= Utils::htmlMailEscape($form->admin_name) . ' ' . __('Mail', 'hast just created a poll called') . ' : "' . Utils::htmlMailEscape($form->title) . '".<br/>';
$message .= sprintf(__('Mail', 'Thanks for filling the poll at the link above') . ' :<br/><br/><a href="%1$s">%1$s</a>', Utils::getUrlSondage($poll_id));
$message_admin = __('Mail', "This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above");
$message_admin .= sprintf(' :<br/><br/><a href="%1$s">%1$s</a>', Utils::getUrlSondage($admin_poll_id, true));
if ($mailService->isValidEmail($form->admin_mail)) {
$mailService->send($form->admin_mail, '[' . NOMAPPLICATION . '][' . __('Mail', 'Author\'s message') . '] ' . __('Generic', 'Poll') . ': ' . $form->title, $message_admin);
$mailService->send($form->admin_mail, '[' . NOMAPPLICATION . '][' . __('Mail', 'For sending to the polled users') . '] ' . __('Generic', 'Poll') . ': ' . $form->title, $message);
}
}
// Clean Form data in $_SESSION
unset($_SESSION['form']);
// Delete old polls
$purgeService->purgeOldPolls();
// creation message
$sessionService->set("Framadate", "messagePollCreated", TRUE);
// Redirect to poll administration
header('Location:' . Utils::getUrlSondage($admin_poll_id, true));
exit;
case 1: // Step 1/4 : error if $_SESSION from info_sondage are not valid
default:
$smarty->assign('title', __('Error', 'Error!'));
$smarty->assign('error', __('Error', 'You haven\'t filled the first section of the poll creation, or your session has expired.'));
$smarty->display('error.tpl');
exit;
}

View File

@ -17,6 +17,7 @@
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft https://framagit.org/framasoft/framadate/)
*/
use Framadate\Choice;
use Framadate\Form;
use Framadate\Services\InputService;
use Framadate\Services\LogService;
use Framadate\Services\MailService;
@ -31,7 +32,7 @@ include_once __DIR__ . '/app/inc/init.php';
/*---------*/
$logService = new LogService();
$pollService = new PollService($connect, $logService);
$mailService = new MailService($config['use_smtp'], $config['smtp_options']);
$mailService = new MailService($config['use_smtp'], $config['smtp_options'], $config['use_sendmail']);
$purgeService = new PurgeService($connect, $logService);
$inputService = new InputService();
$sessionService = new SessionService();
@ -44,53 +45,62 @@ if (is_readable('bandeaux_local.php')) {
$min_expiry_time = $pollService->minExpiryDate();
$max_expiry_time = $pollService->maxExpiryDate();
// The poll format is DATE
if ($_SESSION['form']->format !== 'D') {
$_SESSION['form']->format = 'D';
$_SESSION['form']->clearChoices();
$form = isset($_SESSION['form']) ? unserialize($_SESSION['form']) : null;
if ($form === null || !($form instanceof Form)) {
$smarty->assign('title', __('Error', 'Error!'));
$smarty->assign('error', __('Error', 'You haven\'t filled the first section of the poll creation, or your session has expired.'));
$smarty->display('error.tpl');
exit;
}
if (!isset($_SESSION['form']->title) || !isset($_SESSION['form']->admin_name) || ($config['use_smtp'] && !isset($_SESSION['form']->admin_mail))) {
// The poll format is DATE if we are in this file
if (!isset($form->format)) {
$form->format = 'D';
}
// If we come from another format, we need to clear choices
if ($form->format !== 'D') {
$form->format = 'D';
$form->clearChoices();
}
if (!isset($form->title) || !isset($form->admin_name) || ($config['use_smtp'] && !isset($form->admin_mail))) {
$step = 1;
} else if (!empty($_POST['confirmation'])) {
$step = 4;
} else if (empty($_POST['choixheures']) || isset($_SESSION['form']->totalchoixjour)) {
} else if (empty($_POST['choixheures']) || isset($form->totalchoixjour)) {
$step = 2;
} else {
$step = 3;
}
switch ($step) {
case 1:
// Step 1/4 : error if $_SESSION from info_sondage are not valid
$smarty->assign('title', __('Error', 'Error!'));
$smarty->assign('error', __('Error', 'You haven\'t filled the first section of the poll creation.'));
$smarty->display('error.tpl');
exit;
case 2:
// Step 2/4 : Select dates of the poll
// Prefill form->choices
foreach ($_SESSION['form']->getChoices() as $c) {
foreach ($form->getChoices() as $c) {
/** @var Choice $c */
$count = 3 - count($c->getSlots());
for ($i = 0; $i < $count; $i++) {
$c->addSlot('');
}
}
$count = 3 - count($_SESSION['form']->getChoices());
$count = 3 - count($form->getChoices());
for ($i = 0; $i < $count; $i++) {
$c = new Choice('');
$c->addSlot('');
$c->addSlot('');
$c->addSlot('');
$_SESSION['form']->addChoice($c);
$form->addChoice($c);
}
$_SESSION['form'] = serialize($form);
// Display step 2
$smarty->assign('title', __('Step 2 date', 'Poll dates (2 on 3)'));
$smarty->assign('choices', $_SESSION['form']->getChoices());
$smarty->assign('choices', $form->getChoices());
$smarty->assign('error', null);
$smarty->display('create_date_poll_step_2.tpl');
@ -110,7 +120,7 @@ switch ($step) {
if (count($_POST['days']) > MAX_SLOTS_PER_POLL) {
// Display step 2
$smarty->assign('title', __('Step 2 date', 'Poll dates (2 on 3)'));
$smarty->assign('choices', $_SESSION['form']->getChoices());
$smarty->assign('choices', $form->getChoices());
$smarty->assign('error', __f('Error', 'You can\'t select more than %d dates', MAX_SLOTS_PER_POLL));
$smarty->display('create_date_poll_step_2.tpl');
@ -118,7 +128,7 @@ switch ($step) {
}
// Clear previous choices
$_SESSION['form']->clearChoices();
$form->clearChoices();
// Reorder moments to deal with suppressed dates
$moments = [];
@ -136,9 +146,9 @@ switch ($step) {
if (!empty($day)) {
// Add choice to Form data
$date = DateTime::createFromFormat(__('Date', 'datetime_parseformat'), $_POST['days'][$i])->setTime(0, 0, 0);
$time = $date->getTimestamp();
$time = (string) $date->getTimestamp();
$choice = new Choice($time);
$_SESSION['form']->addChoice($choice);
$form->addChoice($choice);
$schedules = $inputService->filterArray($moments[$i], FILTER_DEFAULT);
for ($j = 0; $j < count($schedules); $j++) {
@ -148,13 +158,14 @@ switch ($step) {
}
}
}
$_SESSION['form']->sortChoices();
$form->sortChoices();
}
// Display step 3
$summary = '<ul>';
$choices = $_SESSION['form']->getChoices();
$choices = $form->getChoices();
foreach ($choices as $choice) {
/** @var Choice $choice */
$summary .= '<li>' . strftime($date_format['txt_full'], $choice->getName());
$first = true;
foreach ($choice->getSlots() as $slots) {
@ -168,13 +179,15 @@ switch ($step) {
$end_date_str = utf8_encode(strftime($date_format['txt_date'], $max_expiry_time)); // textual date
$_SESSION['form'] = serialize($form);
$smarty->assign('title', __('Step 3', 'Removal date and confirmation (3 on 3)'));
$smarty->assign('summary', $summary);
$smarty->assign('end_date_str', $end_date_str);
$smarty->assign('default_poll_duration', $config['default_poll_duration']);
$smarty->assign('use_smtp', $config['use_smtp']);
$smarty->display('create_classic_poll_step3.tpl');
$smarty->display('create_poll_step_3.tpl');
exit;
case 4:
@ -190,22 +203,22 @@ switch ($step) {
$time = mktime(0, 0, 0, $registredate[1], $registredate[0], $registredate[2]);
if ($time < $min_expiry_time) {
$_SESSION['form']->end_date = $min_expiry_time;
$form->end_date = $min_expiry_time;
} elseif ($max_expiry_time < $time) {
$_SESSION['form']->end_date = $max_expiry_time;
$form->end_date = $max_expiry_time;
} else {
$_SESSION['form']->end_date = $time;
$form->end_date = $time;
}
}
}
if (empty($_SESSION['form']->end_date)) {
if (empty($form->end_date)) {
// By default, expiration date is 6 months after last day
$_SESSION['form']->end_date = $max_expiry_time;
$form->end_date = $max_expiry_time;
}
// Insert poll in database
$ids = $pollService->createPoll($_SESSION['form']);
$ids = $pollService->createPoll($form);
$poll_id = $ids[0];
$admin_poll_id = $ids[1];
@ -213,7 +226,7 @@ switch ($step) {
if ($config['use_smtp'] === true) {
$message = __('Mail', "This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.");
$message .= '<br/><br/>';
$message .= Utils::htmlEscape($_SESSION['form']->admin_name) . ' ' . __('Mail', 'hast just created a poll called') . ' : "' . Utils::htmlEscape($_SESSION['form']->title) . '".<br/>';
$message .= Utils::htmlEscape($form->admin_name) . ' ' . __('Mail', 'hast just created a poll called') . ' : "' . Utils::htmlEscape($form->title) . '".<br/>';
$message .= __('Mail', 'Thanks for filling the poll at the link above') . ' :<br/><br/><a href="%1$s">%1$s</a>';
$message_admin = __('Mail', "This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above");
@ -222,17 +235,16 @@ switch ($step) {
$message = sprintf($message, Utils::getUrlSondage($poll_id));
$message_admin = sprintf($message_admin, Utils::getUrlSondage($admin_poll_id, true));
if ($mailService->isValidEmail($_SESSION['form']->admin_mail)) {
$mailService->send($_SESSION['form']->admin_mail, '[' . NOMAPPLICATION . '][' . __('Mail', 'Author\'s message') . '] ' . __('Generic', 'Poll') . ': ' . Utils::htmlEscape($_SESSION['form']->title), $message_admin);
$mailService->send($_SESSION['form']->admin_mail, '[' . NOMAPPLICATION . '][' . __('Mail', 'For sending to the polled users') . '] ' . __('Generic', 'Poll') . ': ' . Utils::htmlEscape($_SESSION['form']->title), $message);
if ($mailService->isValidEmail($form->admin_mail)) {
$mailService->send($form->admin_mail, '[' . NOMAPPLICATION . '][' . __('Mail', 'Author\'s message') . '] ' . __('Generic', 'Poll') . ': ' . Utils::htmlEscape($form->title), $message_admin);
$mailService->send($form->admin_mail, '[' . NOMAPPLICATION . '][' . __('Mail', 'For sending to the polled users') . '] ' . __('Generic', 'Poll') . ': ' . Utils::htmlEscape($form->title), $message);
}
}
// Clean Form data in $_SESSION
unset($_SESSION['form']);
// Delete old polls
$purgeService->purgeOldPolls();
$purgeService->repeatedCleanings();
// creation message
$sessionService->set("Framadate", "messagePollCreated", TRUE);
@ -240,4 +252,12 @@ switch ($step) {
// Redirect to poll administration
header('Location:' . Utils::getUrlSondage($admin_poll_id, true));
exit;
case 1:
default:
// Step 1/4 : error if $_SESSION from info_sondage are not valid
$smarty->assign('title', __('Error', 'Error!'));
$smarty->assign('error', __('Error', 'You haven\'t filled the first section of the poll creation, or your session has expired.'));
$smarty->display('error.tpl');
exit;
}

View File

@ -35,20 +35,19 @@ $pollRepository = RepositoryFactory::pollRepository();
/* PAGE */
/* ---- */
$form = isset($_SESSION['form']) ? unserialize($_SESSION['form']) : null;
if (!isset($_SESSION['form'])) {
$_SESSION['form'] = new Form();
if ($form === null || !($form instanceof Form)) {
$form = new Form();
}
// Type de sondage
if (isset($_GET['type']) && $_GET['type'] === 'date' ||
isset($_POST['type']) && $_POST['type'] === 'date'
) {
if (isset($_GET['type']) && $_GET['type'] === 'date') {
$poll_type = 'date';
$_SESSION['form']->choix_sondage = $poll_type;
$form->choix_sondage = $poll_type;
} else {
$poll_type = 'classic';
$_SESSION['form']->choix_sondage = $poll_type;
$form->choix_sondage = $poll_type;
}
// We clean the data
@ -69,6 +68,8 @@ if ($goToStep2) {
$receiveNewComments = isset($_POST['receiveNewComments']) ? $inputService->filterBoolean($_POST['receiveNewComments']) : false;
$hidden = isset($_POST['hidden']) ? $inputService->filterBoolean($_POST['hidden']) : false;
$use_password = filter_input(INPUT_POST, 'use_password', FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => BOOLEAN_REGEX]]);
$collect_users_mail = $inputService->filterCollectMail($_POST['collect_users_mail']);
$use_password = filter_input(INPUT_POST, 'use_password', FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => BOOLEAN_REGEX]]);
$password = isset($_POST['password']) ? $_POST['password'] : null;
$password_repeat = isset($_POST['password_repeat']) ? $_POST['password_repeat'] : null;
$results_publicly_visible = filter_input(INPUT_POST, 'results_publicly_visible', FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => BOOLEAN_REGEX]]);
@ -83,20 +84,21 @@ if ($goToStep2) {
$error_on_customized_url = false;
$error_on_ValueMax = false;
$_SESSION['form']->title = $title;
$_SESSION['form']->id = $customized_url;
$_SESSION['form']->use_customized_url = $use_customized_url;
$_SESSION['form']->use_ValueMax = $use_ValueMax;
$_SESSION['form']->ValueMax = $ValueMax;
$_SESSION['form']->admin_name = $name;
$_SESSION['form']->admin_mail = $mail;
$_SESSION['form']->description = $description;
$_SESSION['form']->editable = $editable;
$_SESSION['form']->receiveNewVotes = $receiveNewVotes;
$_SESSION['form']->receiveNewComments = $receiveNewComments;
$_SESSION['form']->hidden = $hidden;
$_SESSION['form']->use_password = ($use_password !== null);
$_SESSION['form']->results_publicly_visible = ($results_publicly_visible !== null);
$form->title = $title;
$form->id = $customized_url;
$form->use_customized_url = $use_customized_url;
$form->use_ValueMax = $use_ValueMax;
$form->ValueMax = $ValueMax;
$form->admin_name = $name;
$form->admin_mail = $mail;
$form->description = $description;
$form->editable = $editable;
$form->receiveNewVotes = $receiveNewVotes;
$form->receiveNewComments = $receiveNewComments;
$form->hidden = $hidden;
$form->collect_users_mail = $collect_users_mail;
$form->use_password = ($use_password !== null);
$form->results_publicly_visible = ($results_publicly_visible !== null);
if ($config['use_smtp'] === true && empty($mail)) {
$error_on_mail = true;
@ -149,13 +151,15 @@ if ($goToStep2) {
&& !$error_on_password && !$error_on_password_repeat &&!$error_on_ValueMax
) {
// If no errors, we hash the password if needed
if ($_SESSION['form']->use_password) {
$_SESSION['form']->password_hash = PasswordHasher::hash($password);
if ($form->use_password) {
$form->password_hash = PasswordHasher::hash($password);
} else {
$_SESSION['form']->password_hash = null;
$_SESSION['form']->results_publicly_visible = null;
$form->password_hash = null;
$form->results_publicly_visible = null;
}
$_SESSION['form'] = serialize($form);
if ($goToStep2 === 'date') {
header('Location:create_date_poll.php');
exit();
@ -289,20 +293,21 @@ $smarty->assign('default_to_marldown_editor', $config['markdown_editor_by_defaul
$smarty->assign('goToStep2', GO_TO_STEP_2);
$smarty->assign('poll_type', $poll_type);
$smarty->assign('poll_title', Utils::fromPostOrDefault('title', $_SESSION['form']->title));
$smarty->assign('customized_url', Utils::fromPostOrDefault('customized_url', $_SESSION['form']->id));
$smarty->assign('use_customized_url', Utils::fromPostOrDefault('use_customized_url', $_SESSION['form']->use_customized_url));
$smarty->assign('ValueMax', Utils::fromPostOrDefault('ValueMax', $_SESSION['form']->ValueMax));
$smarty->assign('use_ValueMax', Utils::fromPostOrDefault('use_ValueMax', $_SESSION['form']->use_ValueMax));
$smarty->assign('poll_description', !empty($_POST['description']) ? $_POST['description'] : $_SESSION['form']->description);
$smarty->assign('poll_name', Utils::fromPostOrDefault('name', $_SESSION['form']->admin_name));
$smarty->assign('poll_mail', Utils::fromPostOrDefault('mail', $_SESSION['form']->admin_mail));
$smarty->assign('poll_editable', Utils::fromPostOrDefault('editable', $_SESSION['form']->editable));
$smarty->assign('poll_receiveNewVotes', Utils::fromPostOrDefault('receiveNewVotes', $_SESSION['form']->receiveNewVotes));
$smarty->assign('poll_receiveNewComments', Utils::fromPostOrDefault('receiveNewComments', $_SESSION['form']->receiveNewComments));
$smarty->assign('poll_hidden', Utils::fromPostOrDefault('hidden', $_SESSION['form']->hidden));
$smarty->assign('poll_use_password', Utils::fromPostOrDefault('use_password', $_SESSION['form']->use_password));
$smarty->assign('poll_results_publicly_visible', Utils::fromPostOrDefault('results_publicly_visible', $_SESSION['form']->results_publicly_visible));
$smarty->assign('form', $_SESSION['form']);
$smarty->assign('poll_title', Utils::fromPostOrDefault('title', $form->title));
$smarty->assign('customized_url', Utils::fromPostOrDefault('customized_url', $form->id));
$smarty->assign('use_customized_url', Utils::fromPostOrDefault('use_customized_url', $form->use_customized_url));
$smarty->assign('ValueMax', Utils::fromPostOrDefault('ValueMax', $form->ValueMax));
$smarty->assign('use_ValueMax', Utils::fromPostOrDefault('use_ValueMax', $form->use_ValueMax));
$smarty->assign('collect_users_mail', Utils::fromPostOrDefault('collect_users_mail', $form->collect_users_mail));
$smarty->assign('poll_description', !empty($_POST['description']) ? $_POST['description'] : $form->description);
$smarty->assign('poll_name', Utils::fromPostOrDefault('name', $form->admin_name));
$smarty->assign('poll_mail', Utils::fromPostOrDefault('mail', $form->admin_mail));
$smarty->assign('poll_editable', Utils::fromPostOrDefault('editable', $form->editable));
$smarty->assign('poll_receiveNewVotes', Utils::fromPostOrDefault('receiveNewVotes', $form->receiveNewVotes));
$smarty->assign('poll_receiveNewComments', Utils::fromPostOrDefault('receiveNewComments', $form->receiveNewComments));
$smarty->assign('poll_hidden', Utils::fromPostOrDefault('hidden', $form->hidden));
$smarty->assign('poll_use_password', Utils::fromPostOrDefault('use_password', $form->use_password));
$smarty->assign('poll_results_publicly_visible', Utils::fromPostOrDefault('results_publicly_visible', $form->results_publicly_visible));
$smarty->assign('form', $form);
$smarty->display('create_poll.tpl');

View File

@ -449,19 +449,10 @@ span.edit-username-left {
border-color: #949494 !important;
}
table.results .bg-danger .glyphicon {
/* TODO : Refactor me ! */
table.results .bg-danger .glyphicon:not(.glyphicon-alert) {
opacity:0;
-moz-animation-name: hideNoIcon;
-moz-animation-iteration-count: 1;
-moz-animation-timing-function: ease-in;
-moz-animation-duration: 2s;
-webkit-animation-name: hideNoIcon;
-webkit-animation-iteration-count: 1;
-webkit-animation-timing-function: ease-in;
-webkit-animation-duration: 2s;
animation-name: hideNoIcon;
animation-iteration-count: 1;
animation-timing-function: ease-in;

40
docker-compose.yml Normal file
View File

@ -0,0 +1,40 @@
version: '3'
services:
db:
container_name: framadate-db
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=rootpassword
- MYSQL_USER=framadate
- MYSQL_PASSWORD=framadatedbpassword
- MYSQL_DATABASE=framadate
restart: always
ports:
- "3307:3306"
framadate:
container_name: framadate
build:
dockerfile: ./docker/stretch/Dockerfile
context: .
depends_on:
- db
ports:
- 80:80
environment:
- ENV=dev
- DOMAIN=localhost
- APP_NAME=Framadate
- ADMIN_MAIL=mon@email.fr
- MYSQL_USER=framadate
- MYSQL_PASSWORD=framadatedbpassword
- MYSQL_DB=framadate
- MYSQL_HOST=db
- MYSQL_PORT=3307
- ADMIN_USER=admin
- ADMIN_PASSWORD=adminpassword
- DISABLE_SMTP=true
- APACHE_RUN_USER=#1000
restart: always
volumes:
- '.:/var/www/framadate'

30
docker/stretch/Dockerfile Normal file
View File

@ -0,0 +1,30 @@
FROM php:apache
MAINTAINER kyane@kyane.fr
RUN apt-get -y update && DEBIAN_FRONTEND=noninteractive apt-get install -y -qq zip unzip git zlib1g-dev libicu-dev g++ mysql-client
RUN docker-php-ext-install intl && docker-php-ext-install pdo_mysql
RUN a2enmod rewrite
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
COPY docker/stretch/php.ini /usr/local/etc/php/php.ini
COPY docker/stretch/apache-framadate.conf /etc/apache2/sites-enabled/framadate.conf
COPY docker/stretch/entrypoint.sh /usr/local/bin/entrypoint
ENV COMPOSER_ALLOW_SUPERUSER=1
RUN set -eux; \
composer global require "hirak/prestissimo:^0.3" --prefer-dist --no-progress --no-suggest --classmap-authoritative; \
composer clear-cache
ENV PATH="${PATH}:/root/.composer/vendor/bin"
ENV COMPOSER_ALLOW_SUPERUSER 0
WORKDIR /var/www/framadate
# Some Apache and PHP configuration
RUN if [ "$ENV" = "dev" ] ; then echo Using PHP production mode ; else echo Using PHP development mode && echo "error_reporting = E_ERROR | E_WARNING | E_PARSE\ndisplay_errors = On" > /usr/local/etc/php/conf.d/php.ini ; fi
RUN rm /etc/apache2/sites-enabled/000-default.conf
EXPOSE 80
ENTRYPOINT ["entrypoint"]

37
docker/stretch/README.md Normal file
View File

@ -0,0 +1,37 @@
# Framadate
**Cette image est en phase de test. NE PAS UTILISER EN PRODUCTION**
Image Docker pour le déploiement de Framadate
## Configuration
### Base de données
Pour fonctionner, Framadate a besoin d'une base de données. Dans notre cas nous utilisons MySQL, que l'on déploie avec Docker. Afin que Framadate fonctionne correctement, nous devons désactiver le *SQL MODE* `NO_ZERO_DATE` de MySQL. On peut donc déployer une base de données pour Framadate ainsi (avec Docker Compose):
```
framadate-db:
image: mysql:5.7
container_name: framadate-db
command: --sql-mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
volumes:
- /path/to/data/volume:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=myrootpassword
- MYSQL_USER=framadate
- MYSQL_PASSWORD=myframadatepassword
- MYSQL_DATABASE=framadate
restart: always
```
### Framadate
Pour initialiser Framadate, on utilise plusieurs variables d'environnement :
- `DOMAIN`: sous domaine du serveur Framadate (ex: `framadate.picasoft.net`)
- `APP_NAME`: nom de l'application (`Framadate` par défaut)
- `ADMIN_MAIL`: adresse mail de l'administrateur du serveur
- `NO_REPLY_MAIL`: adresse mail qui servira à l'envoi des mails
- `MYSQL_USER`: utilisateur MySQL
- `MYSQL_PASSWORD`: mot de passe de l'utilisateur MySQL
- `MYSQL_DB`: nom de la base de données
- `MYSQL_HOST`: adresse du serveur de base de données
- `MYSQL_PORT`: port du serveur MySQL (`3306` par défaut)
- `ADMIN_USER`: utilisateur de l'interface d'administration
- `ADMIN_PASSWORD`: mot de passe de l'interface d'administration
- `DISABLE_SMTP`: mettre à `true` pour désactiver SMTP (sinon `false` par défaut)

View File

@ -0,0 +1,28 @@
<VirtualHost *:80>
DocumentRoot /var/www/framadate
# URL rewrite
<Directory "/">
AllowOverride All
</Directory>
# Admin folder
<Directory "/var/www/framadate/admin/">
AuthType Basic
AuthName "Administration"
AuthUserFile "/var/www/framadate/admin/.htpasswd"
Require valid-user
</Directory>
# Protection fichiers htpasswd et htaccess
<FilesMatch "^\.ht.*">
Deny from all
Satisfy all
ErrorDocument 403 "Accès refusé."
</FilesMatch>
# Logs
ErrorLog /dev/stdout
CustomLog /dev/stdout combined
</VirtualHost>

86
docker/stretch/entrypoint.sh Executable file
View File

@ -0,0 +1,86 @@
#!/bin/bash
# Read environment variables or set default values
FRAMADATE_CONFIG=${FRAMADATE_CONFIG:-/var/www/framadate/app/inc/config.php}
DOMAIN=${DOMAIN-localhost}
APP_NAME=${APP_NAME-Framadate}
ADMIN_MAIL=${ADMIN_MAIL-}
NO_REPLY_MAIL=${NO_REPLY_MAIL-}
MYSQL_USER=${MYSQL_USER-user}
MYSQL_PASSWORD=${MYSQL_PASSWORD-password}
MYSQL_DB=${MYSQL_DB-framadate}
MYSQL_HOST=${MYSQL_HOST-mysql}
MYSQL_PORT=${MYSQL_PORT-3306}
DISABLE_SMTP=${DISABLE_SMTP-false}
# Add configuration file if not exist
if [ ! -f $FRAMADATE_CONFIG ]; then
echo "There is no configuration file. Create one with environment variables"
cp /var/www/framadate/tpl/admin/config.tpl $FRAMADATE_CONFIG
# Set values on configuration file
if [ ! -z "$DOMAIN" ]; then
sed -i -E "s/^(\/\/ )?const APP_URL( )?=.*;/const APP_URL = '$DOMAIN';/g" $FRAMADATE_CONFIG
fi
sed -i -E "s/^(\/\/ )?const NOMAPPLICATION( )?=.*;/const NOMAPPLICATION = '$APP_NAME';/g" $FRAMADATE_CONFIG
# Configure mail
sed -i -E "s/^(\/\/ )?const ADRESSEMAILADMIN( )?=.*;/const ADRESSEMAILADMIN = '$ADMIN_MAIL';/g" $FRAMADATE_CONFIG
sed -i -E "s/^(\/\/ )?const ADRESSEMAILREPONSEAUTO( )?=.*;/const ADRESSEMAILREPONSEAUTO = '$NO_REPLY_MAIL';/g" $FRAMADATE_CONFIG
# Database configuration
sed -i -E "s/^(\/\/ )?const DB_USER( )?=.*;/const DB_USER = '$MYSQL_USER';/g" $FRAMADATE_CONFIG
sed -i -E "s/^(\/\/ )?const DB_PASSWORD( )?=.*;/const DB_PASSWORD = '$MYSQL_PASSWORD';/g" $FRAMADATE_CONFIG
sed -i -E "s/^(\/\/ )?const DB_DRIVER( )?=.*;/const DB_DRIVER = 'pdo_mysql';/g" $FRAMADATE_CONFIG
sed -i -E "s/^(\/\/ )?const DB_NAME( )?=.*;/const DB_NAME = '$MYSQL_DB';/g" $FRAMADATE_CONFIG
sed -i -E "s/^(\/\/ )?const DB_HOST( )?=.*;/const DB_HOST = '$MYSQL_HOST';/g" $FRAMADATE_CONFIG
sed -i -E "s/^(\/\/ )?const DB_PORT( )?=.*;/const DB_PORT = '$MYSQL_PORT';/g" $FRAMADATE_CONFIG
# SMTP config
if [ "$DISABLE_SMTP" = "true" ]; then
sed -i -E "s/'use_smtp' => true,/'use_smtp' => false,/g" $FRAMADATE_CONFIG
fi
# Framadate internal config
sed -i -E "s/^(\/\/ )?const TABLENAME_PREFIX( )?=.*;/const TABLENAME_PREFIX = 'fd_';/g" $FRAMADATE_CONFIG
sed -i -E "s/^(\/\/ )?const MIGRATION_TABLE( )?=.*;/const MIGRATION_TABLE = 'framadate_migration';/g" $FRAMADATE_CONFIG
sed -i -E "s/^(\/\/ )?const DEFAULT_LANGUAGE( )?=.*;/const DEFAULT_LANGUAGE = 'fr';/g" $FRAMADATE_CONFIG
sed -i -E "s/^(\/\/ )?const URL_PROPRE( )?=.*;/const URL_PROPRE = true;/g" $FRAMADATE_CONFIG
else
echo "Using existing config file " $FRAMADATE_CONFIG
fi
# Configure /admin basic auth
if [ ! -f /var/www/framadate/admin/.htpasswd ]; then
if [ "$ADMIN_USER" ] && [ "$ADMIN_PASSWORD" ]; then
htpasswd -bc /var/www/framadate/admin/.htpasswd $ADMIN_USER $ADMIN_PASSWORD
else
echo "!!! You need to configure ADMIN_USER and ADMIN_PASSWORD environment variables !!!"
exit 1
fi
fi
if [ "$ENV" = "dev" ]; then
echo Installing PHP development dependencies
composer install --no-interaction --no-progress
else
echo Installing PHP production dependencies
composer install -o --no-interaction --no-progress --prefer-dist --no-dev
composer dump-autoload --optimize --no-dev --classmap-authoritative
fi
# Await MySQL Container being ready
until /usr/bin/mysql --host=$MYSQL_HOST --user=$MYSQL_USER --password=$MYSQL_PASSWORD --silent --execute "SELECT 1;" $MYSQL_DB; do
>&2 echo "MySQL is unavailable - sleeping"
sleep 1
done
>&2 echo "Resuming setup"
echo "Setting up .htaccess"
cp /var/www/framadate/htaccess.txt /var/www/framadate/.htaccess
# Run Database migrations
echo "Running database migrations"
php /var/www/framadate/bin/doctrine migrations:status --no-interaction -vvv
php /var/www/framadate/bin/doctrine migrations:migrate --no-interaction -vvv
# Run apache server
# chown -R www-data:www-data /var/www/framadate
source /etc/apache2/envvars
exec apache2 -D FOREGROUND

11
docker/stretch/php.ini Normal file
View File

@ -0,0 +1,11 @@
apc.enable_cli = 1
date.timezone = UTC
session.auto_start = Off
short_open_tag = Off
# http://symfony.com/doc/current/performance.html
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 20000
opcache.memory_consumption = 256
realpath_cache_size = 4096K
realpath_cache_ttl = 600

View File

@ -28,7 +28,7 @@ include_once __DIR__ . '/app/inc/init.php';
/* -------- */
$logService = new LogService();
$pollService = new PollService($connect, $logService);
$mailService = new MailService($config['use_smtp'], $config['smtp_options']);
$mailService = new MailService($config['use_smtp'], $config['smtp_options'], $config['use_sendmail']);
/* PAGE */
/* ---- */
@ -55,5 +55,6 @@ if (!empty($_POST['mail'])) {
$smarty->assign('title', __('Homepage', 'Where are my polls'));
$smarty->assign('message', $message);
$smarty->assign('locale', $locale);
$smarty->display('find_polls.tpl');

View File

@ -35,14 +35,19 @@ $pollService = new PollService($connect, new $logService());
/* PAGE */
/* ---- */
$demoPoll = $pollService->findById('aqg259dth55iuhwm');
$demoPollURL = "";
if (defined("DEMO_POLL_ID")) {
$demoPollURL = Utils::getUrlSondage(DEMO_POLL_ID);
}
$nbcol = max( $config['show_what_is_that'] + $config['show_the_software'] + $config['show_cultivate_your_garden'], 1 );
$smarty->assign('show_what_is_that', $config['show_what_is_that']);
$smarty->assign('show_the_software', $config['show_the_software']);
$smarty->assign('show_cultivate_your_garden', $config['show_cultivate_your_garden']);
$smarty->assign('col_size', 12 / $nbcol);
$smarty->assign('demo_poll', $demoPoll);
$smarty->assign('demo_poll_url', $demoPollURL);
$smarty->assign('title', __('Generic', 'Make your polls'));

View File

@ -1,9 +1,67 @@
$(document).ready(function() {
/**
* Markdown Editor
* @type {MDEWrapper}
*/
wrapper = new MDEWrapper($('.js-desc textarea')[0], $('#rich-editor-button'), $('#simple-editor-button'));
var firstOpening = true;
/**
* Save a list of admin polls inside LocalStorage
* @param adminPolls
*/
function setAdminPolls(adminPolls) {
localStorage.setItem('admin_polls', JSON.stringify(adminPolls));
}
/**
* Add an admin poll inside LocalStorage
* @param adminPoll
*/
function addAdminPoll(adminPoll) {
var adminPolls = localStorage.getItem('admin_polls');
if (adminPolls === null) {
adminPolls = [];
} else {
adminPolls = JSON.parse(adminPolls);
}
/**
* Test if the poll is already inside the list
*/
var index = adminPolls.findIndex(function (existingPoll) {
return existingPoll.url === adminPoll.url;
});
if (index === -1) {
adminPolls.push(adminPoll);
} else { // if the poll is already present, we need to update the last access date
adminPolls[index] = adminPoll;
}
setAdminPolls(adminPolls);
}
var adminPoll = {
url: window.location.href,
title: $('#title-form h3').get(0).childNodes[0].nodeValue,
accessed: (new Date()).toISOString()
};
if (!localStorage.getItem('admin_polls')) {
setAdminPolls([adminPoll]);
} else {
addAdminPoll(adminPoll);
}
/**
* Initiate popovers
*/
$('[data-toggle="popover"]').popover();
/**
* Create node with text to use the Clipboard API
* @param text
* @returns {HTMLPreElement}
*/
function createNode(text) {
var node = document.createElement('pre');
node.style.width = '1px';
@ -14,6 +72,10 @@ $(document).ready(function() {
return node;
}
/**
* Copy a Node to use for Clipboard API
* @param node
*/
function copyNode(node) {
var selection = getSelection();
selection.removeAllRanges();
@ -26,6 +88,10 @@ $(document).ready(function() {
selection.removeAllRanges();
}
/**
* Copy a text inside the clipboard
* @param text
*/
function copyText(text) {
var node = createNode(text);
document.body.appendChild(node);

View File

@ -15,39 +15,49 @@
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
(function () {
// 2 choices filled and you can submit
var submitChoicesAvalaible = function () {
$(document).ready(function () {
$(document.formulaire).on('submit', function (e) {
if (!isSubmitChoicesAvalaible()) {
e.preventDefault();
e.stopPropagation();
}
});
var $next = $('button[name="fin_sondage_autre"]');
var $removeAChoice = $('#remove-a-choice');
var $addAChoice = $('#add-a-choice');
var updateButtonState = function() {
var $choiceFields = $('.choice-field');
$removeAChoice.prop('disabled', function() { return $choiceFields.length <= 2; });
$next.prop('disabled', !isSubmitChoicesAvalaible());
}
var isSubmitChoicesAvalaible = function () {
return (countFilledChoices() >= 2);
};
var countFilledChoices = function() {
var nb_filled_choices = 0;
$('.choice-field input').each(function () {
if ($(this).val() != '') {
nb_filled_choices++;
}
});
if (nb_filled_choices >= 1) {
$('button[name="fin_sondage_autre"]').removeClass('disabled');
return true;
} else {
$('button[name="fin_sondage_autre"]').addClass('disabled');
return false;
}
return nb_filled_choices;
};
// Handle form submission
$(document.formulaire).on('submit', function (e) {
if (!submitChoicesAvalaible()) {
e.preventDefault();
e.stopPropagation();
}
$removeAChoice.on('click', function () {
$('.choice-field:last').remove();
updateButtonState();
});
// Button "Add a choice"
$('#add-a-choice').on('click', function () {
var nb_choices = $('.choice-field').length;
var last_choice = $('.choice-field:last');
$addAChoice.on('click', function () {
var $choiceFields = $('.choice-field');
var nb_choices = $choiceFields.length;
var last_choice = $choiceFields.last();
var new_choice = last_choice.html();
@ -62,28 +72,17 @@
.replace(last_choice_label, choice_text + ' ' + (nb_choices + 1))
.replace(/value="(.*?)"/g, 'value=""');
last_choice.after('<div class="form-group choice-field">' + new_choice_html + '</div>');
last_choice.after('<div class="form-group choice-field row">' + new_choice_html + '</div>');
$('#choice' + nb_choices).focus();
$('#remove-a-choice').removeClass('disabled');
updateButtonState()
});
// Button "Remove a choice"
$('#remove-a-choice').on('click', function () {
$('.choice-field:last').remove();
var nb_choices = $('.choice-field').length;
$('#choice' + (nb_choices - 1)).focus();
if (nb_choices == 1) {
$('#remove-a-choice').addClass('disabled');
}
submitChoicesAvalaible();
});
$(document).on('keyup, change', '.choice-field input', function () {
submitChoicesAvalaible();
updateButtonState();
});
submitChoicesAvalaible();
updateButtonState();
// Button to build markdown from: link + image-url + text
@ -92,7 +91,7 @@
var md_img = $('#md-img');
var md_val = $('#md-a');
$(document).on('click', '.md-a-img', function () {
$('.md-a-img').on('click' , function () {
md_a_imgModal.modal('show');
md_a_imgModal.find('.btn-primary').attr('value', $(this).prev().attr('id'));
$('#md-a-imgModalLabel').text($(this).attr('title'));
@ -116,6 +115,6 @@
md_img.val('');
md_val.val('');
md_text.val('');
submitChoicesAvalaible();
updateButtonState();
});
});
})();

View File

@ -39,6 +39,17 @@ $(document).ready(function () {
$("#use_customized_url").change(function () {
if ($(this).prop("checked")) {
$("#customized_url_options").removeClass("hidden");
// Check url pattern
$('#customized_url').on('input', function() {
var regex_url = /^[a-zA-Z0-9-]*$/
if (! regex_url.test(this.value)) {
$(this).parent(".input-group").addClass("has-error");
$(this).attr("aria-invalid", "true");
} else {
$(this).parent(".input-group").removeClass("has-error");
$(this).attr("aria-invalid", "false");
}
});
} else {
$("#customized_url_options").addClass("hidden");
}
@ -49,9 +60,9 @@ $(document).ready(function () {
*/
$("#use_ValueMax").change(function () {
if ($(this).prop("checked")) {
$("#ValueMax").removeClass("hidden");
$("#valueMaxWrapper").removeClass("hidden");
} else {
$("#ValueMax").addClass("hidden");
$("#valueMaxWrapper").addClass("hidden");
}
});
@ -67,6 +78,25 @@ $(document).ready(function () {
}
});
/**
* Hide/Show Warning collect_users_mail + editable by all
*/
$("input[name='collect_users_mail']").change(function(){
if (($("input[name='collect_users_mail']:checked").val() != 0) && ($("input[name='editable']:checked").val() == 1)) {
$("#collect_warning").removeClass("hidden");
} else {
$("#collect_warning").addClass("hidden");
}
});
$("input[name='editable']").change(function(){
if ($("input[name='collect_users_mail']:checked").val() != 0 && $("input[name='editable']:checked").val() == 1) {
$("#collect_warning").removeClass("hidden");
} else {
$("#collect_warning").addClass("hidden");
}
});
// Check cookies are enabled too
var cookieEnabled = function () {
var cookieEnabled = navigator.cookieEnabled;

View File

@ -16,8 +16,64 @@
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
var form;
$(document).ready(function () {
/**
* Save a list of polls inside LocalStorage
* @param polls
*/
function setPolls(polls) {
localStorage.setItem('polls', JSON.stringify(polls));
}
/**
* Add an poll inside LocalStorage
* @param poll
*/
function addPoll(poll) {
var polls = localStorage.getItem('polls');
if (polls === null) {
polls = [];
} else {
polls = JSON.parse(polls);
}
/**
* Test if the poll is already inside the list
*/
var index = polls.findIndex(function (existingPoll) {
return existingPoll.url === poll.url;
});
if (index === -1) {
polls.push(poll);
} else { // if the poll is already present, we need to update the last access date
polls[index] = poll;
}
setPolls(polls);
}
var poll = {
url: window.location.href,
title: $('#title-form h3').get(0).childNodes[0].nodeValue,
accessed: (new Date()).toISOString()
};
function isAdmin() {
return $('.jumbotron').hasClass('bg-danger');
}
if (!isAdmin()) {
if (!localStorage.getItem('polls')) {
setPolls([poll]);
} else {
addPoll(poll);
}
}
$('#poll_form').submit(function (event) {
var name = $('#name').val().trim();
@ -55,7 +111,19 @@ $(document).ready(function () {
}
});
var form = $('#comment_form');
form = $('#comment_form');
checkCommentSending();
$("#comment_name").on("keyup change", checkCommentSending);
$("#comment").on("keyup change", checkCommentSending);
$("#comment_name").on("change", formatValues);
$("#comment").on("change", formatValues);
form.submit(function(event) {
event.preventDefault();
@ -115,3 +183,30 @@ $(document).ready(function () {
}
});
});
function formatValues() {
var value = $(this).val().trim();
if (0 === value.length) {
$(this).val("");
}
}
function checkCommentSending() {
var button = $("#add_comment");
// on page load, "textSend" is not set
if ("undefined" === typeof button.data("textSend")) {
button.data("textSend", button.text());
}
if (!form.get(0).checkValidity()) {
button.prop("disabled", true);
button.text(button.data("textWait"));
} else {
button.prop("disabled", false);
button.text(button.data("textSend"));
}
}

1
js/moment-with-locales.min.js vendored Normal file

File diff suppressed because one or more lines are too long

6
js/vue.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -1,5 +0,0 @@
msgfmt -o locale\fr_FR\LC_MESSAGES\Studs.mo locale\fr_FR\LC_MESSAGES\Studs.po
msgfmt -o locale\es_ES\LC_MESSAGES\Studs.mo locale\es_ES\LC_MESSAGES\Studs.po
msgfmt -o locale\de_DE\LC_MESSAGES\Studs.mo locale\de_DE\LC_MESSAGES\Studs.po
msgfmt -o locale\en_GB\LC_MESSAGES\Studs.mo locale\en_GB\LC_MESSAGES\Studs.po
pause

View File

@ -122,7 +122,7 @@
"Enter a name and a comment!": "Enter a name and a comment!",
"Enter a title": "Enter a title",
"Enter an email address": "Enter an email address",
"Error on amount of voters limitation : value must be an integer greater than 0": "Error on amount of voters limitation: value must be an integer greater than 0",
"Error on amount of voters limitation : value must be an integer greater than 0": "Error on amount of votes limitation: Value must be an integer greater than 0",
"Error!": "خطأ !",
"Failed to delete all comments": "Failed to delete all comments",
"Failed to delete all votes": "Failed to delete all votes",
@ -143,7 +143,7 @@
"Poll id already used": "Identifier is already used",
"Something is going wrong...": "حدث هناك خطأ ما ...",
"Something is wrong with the format": "Something is wrong with the format",
"Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Something is wrong with the format: Customized urls should only consist of alphanumeric characters and hyphens.",
"Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Something is wrong with the format: Customized URLs should only consist of alphanumeric characters and hyphens.",
"Something is wrong with the format: name shouldn't have any spaces before or after": "Something is wrong with the format: name shouldn't have any spaces before or after",
"The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.": "The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.",
"The column already exists": "The column already exists",
@ -161,7 +161,7 @@
"FindPolls": {
"Have a good day!": "طاب نهارك !",
"Here is the list of the polls that you manage on %s:": "Here is the list of the polls that you manage on %s:",
"If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.": "If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.",
"If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.": "If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator at %s.",
"List of your polls": "قائمة إستطلاعات الرأي الخاصة بك",
"PS: this email has been sent because you or someone else asked to get back the polls created with your email address.": "PS: this email has been sent because you or someone else asked to get back the polls created with your email address.",
"Polls sent": "Polls sent",
@ -174,7 +174,7 @@
"Back": "العودة",
"Back to the homepage of": "العودة إلى صفحة",
"Cancel": "إلغاء",
"Caption": "Caption",
"Caption": "Information",
"Choice": "الخَيار",
"Classic": "عادي",
"Close": "إغلاق",
@ -185,10 +185,10 @@
"Edit": "تعديل",
"Framadate is an online service for planning an appointment or make a decision quickly and easily.": "Framadate is an online service for planning an appointment or make a decision quickly and easily.",
"Home": "الرئيسية",
"Ifneedbe": "If need be",
"Ifneedbe": "Under reserve",
"Legend:": "Legend:",
"Link": "الرابط",
"Make your polls": "Make your polls",
"Make your polls": "Create your polls",
"Markdown": "Markdown",
"Next": "التالي",
"No": "لا",
@ -235,17 +235,17 @@
"Select the language": "إختيار لغة"
},
"Mail": {
"Author's message": "Author's message",
"Author's message": "Message for the author",
"FOOTER": "\"The road is long, but the way is clear…\"<br/>Framasoft lives only by your donations.<br/>Thank you in advance for your support https://soutenir.framasoft.org",
"For sending to the polled users": "Participant link",
"Notification of poll: %s": "Notification of poll: %s",
"Poll's participation: %s": "Poll participation: %s",
"Someone just change your poll available at the following link %s.": "Someone just changed your poll at the following link <a href=\"%1$s\">%1$s</a>.",
"Someone just delete your poll %s.": "Someone just deleted your poll \"%s\".",
"Thanks for filling the poll at the link above": "Please fill in the poll at the link above",
"Thanks for filling the poll at the link above": "Thank you for participating in the poll at the following link",
"Thanks for your trust.": "شكرا لك على ثقتك.",
"This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.": "This is the message to forward to the poll participants.",
"This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above": "This message should NOT be sent to the poll participants. You should keep it private. <br/><br/>You can modify your poll at the link above",
"This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above": "This message should NOT be sent to the poll participants. You should keep it private. <br/><br/>You can modify your poll at the following link",
"You have changed the settings of your poll. \nYou can modify this poll with this link": "You have changed the settings of your poll.<br/>You can modify this poll with this link",
"[ADMINISTRATOR] New settings for your poll": "[ADMINISTRATOR] New settings for your poll",
"filled a vote.\nYou can find your poll at the link": "added a vote.<br/>You can visit your poll at the link",
@ -273,13 +273,14 @@
"Display the chart of the results": "عرض المنحنى البياني للنتائج",
"Edit the line: %s": "Edit line: %s",
"Link to edit this particular line": "Link to edit this particular line",
"Link to edit this particular line has been copied inside the clipboard!": "The link to edit this particular line has been copied to the clipboard!",
"Remove the line:": "Remove line:",
"Save the choices": "Save choices",
"Scroll to the left": "Scroll to the left",
"Scroll to the right": "Scroll to the right",
"The best choice at this time is:": "The current best choice is:",
"The bests choices at this time are:": "The current best choices are:",
"Vote ifneedbe for": "Vote \"If need be\" for",
"Vote ifneedbe for": "Votes under reserve for",
"Vote no for": "Vote \"no\" for",
"Vote yes for": "Vote \"yes\" for",
"Votes of the poll": "الأصوات",
@ -352,7 +353,7 @@
"To receive an email for each new vote": "Receive an email for each new vote",
"Use a password to restrict access": "Use a password to restrict access",
"Value Max": "Value Max",
"ValueMax instructions": "voters per options ",
"ValueMax instructions": "votes per options ",
"Voters can modify their vote themselves": "Voters can modify their vote themselves",
"Votes cannot be modified": "Votes cannot be modified",
"You are in the poll creation section.": "You are in the poll creation section.",
@ -432,19 +433,19 @@
"Remove the column": "حذف عمود",
"Remove the comments": "إزالة التعليقات",
"Remove the votes": "حذف الأصوات",
"The poll is created.": "The poll was created.",
"Vote added": "Vote added",
"Vote deleted": "Vote deleted",
"Vote updated": "تم تحديث التصويت",
"You can add a new scheduling date to your poll.": "You can add a new scheduling date to your poll.",
"Your poll has been removed!": "Your poll has been removed!",
"The poll is created." : "The poll is created.",
"and add a new column with": "and add a new column with",
"remove a column or a line with": "remove a column or a line with"
},
"studs": {
"Adding the vote succeeded": "Vote added",
"Deletion date:": "Deletion date:",
"If you want to vote in this poll, you have to give your name, choose the values that fit best for you and validate with the plus button at the end of the line.": "If you want to vote in this poll, you have to give your name, make your choice, and submit it with the plus button at the end of the line.",
"If you want to vote in this poll, you have to give your name, choose the values that fit best for you and validate with the plus button at the end of the line.": "If you want to vote in this poll, you have to give your name, make your choice, and submit it by selecting the save button at the end of the line.",
"POLL_LOCKED_WARNING": "The administrator locked this poll. Votes and comments are frozen, it is no longer possible to participate",
"The poll is expired, it will be deleted soon.": "The poll has expired, it will soon be deleted.",
"Update vote succeeded": "Vote updated",

View File

@ -31,8 +31,9 @@
"Back to administration": "Distreiñ d'ar bajenn verañ",
"Change the poll": "Kemmañ ar sontadeg",
"Confirm removal of the poll": "Kadarnait dilemel ar sontadeg",
"Deleted the poll": "Dilemel ar sontadeg",
"Deleted the poll": "Poll deleted",
"Email": "Chomlec'h postel",
"Executed": "Executed",
"Expiration date": "Diamzeriñ",
"Fail": "C'hwitadenn",
"Failed:": "C'hwitadenn:",
@ -49,11 +50,13 @@
"Purged:": "Spurjet:",
"See the poll": "Sellet ar sontadeg",
"Skipped:": "Tremenet:",
"Status": "Status",
"Succeeded:": "Berzh:",
"Success": "Berzh",
"Summary": "Diverradenn",
"Title": "Titl",
"Votes": "Mouezhioù",
"Waiting": "Waiting",
"polls in the database at this time": "sontadeg er stlennvon"
},
"Check": {
@ -83,6 +86,7 @@
"Comments of polled people": "Evezhiadennoù",
"Remove the comment": "Dilemel an evezhiadenn",
"Send the comment": "Kas an evezhiadenn",
"Type your name and a comment to send it": "Enter your name and comment prior to submitting the form",
"Your comment": "Hoc'h evezhiadenn",
"anonyme": "dizanv"
},
@ -122,7 +126,7 @@
"Enter a name and a comment!": "Enankit un anv hag un evezhiadenn!",
"Enter a title": "Ret eo enankañ un titl!",
"Enter an email address": "Ret eo enankañ ur chomlec'h postel",
"Error on amount of voters limitation : value must be an integer greater than 0": "Error on amount of voters limitation: Value must be an integer greater than 0",
"Error on amount of voters limitation : value must be an integer greater than 0": "Error on amount of votes limitation: Value must be an integer greater than 0",
"Error!": "Fazi!",
"Failed to delete all comments": "C'hwitadenn en ur zilemel an holl evezhiadennoù",
"Failed to delete all votes": "C'hwitadenn en ur zilemel an holl vouezhioù",
@ -150,22 +154,39 @@
"The name is invalid.": "Didalvoudek eo an anv.",
"The name you've chosen already exist in this poll!": "An anv bet enanket ganeoc'h a zo dioutañ endeo!",
"There is a problem with your choices": "Ur gudenn a zo gant ho tibaboù",
"This id is not allowed": "This identifier is not allowed",
"This poll doesn't exist !": "N'eus ket eus ar sontadeg-mañ!",
"Update vote failed": "C'hwitadenn war hizivadenn ar vouezh",
"You already voted": "Mouezhzt ho peus endeo",
"You can't create a poll with hidden results with the following edition option:": "N'hallit ket krouiñ ur sontadeg gant respontoù kuzhet gant an dibarzhioù embann da heul:",
"You can't select more than %d dates": "N'hallit ket diuzañ ouzhpenn %d a zeiziadoù",
"You haven't filled the first section of the poll creation, or your session has expired.": "You haven't filled the first section of the poll creation, or your session has expired.",
"You haven't filled the first section of the poll creation.": "N'ho peus ket leuniet lodenn gentañ ar sontadeg",
"Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry.": "Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry."
},
"FindPolls": {
"Address": "Address",
"Created polls": "Created polls",
"Have a good day!": "Devezh mat deoc'h!",
"Here is the list of the polls that you manage on %s:": "Sed aze roll ho sontadegoù a verit war %s",
"If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.": "Ma n'ho peus ket savet ar goulenn ha ma soñj deoc'h eo un drougimplij eus ar gwazerezh kit e darempred gant merour %s.",
"Last access date": "Last access date",
"List of your polls": "Roll ho sontadegoù",
"Local Storage Help": "To help you find your previous polls, we save each poll you create or access inside your browser. This data is saved inside this browser only. The following data will be saved:",
"Local Storage Help Delete": "To delete this data click the trashcan on the according line or click the « delete my polls index » option. This won't delete your polls.",
"Local Storage Help Information Accessed": "The date you created or last accessed the poll",
"Local Storage Help Information Address": "It's address",
"Local Storage Help Information Title": "The title of the poll",
"PS: this email has been sent because you or someone else asked to get back the polls created with your email address.": "PS: kaset eo bet ar postel-mañ deoc'h peogwir ho peus (pe unan bennak all) goulennet vefe kaset deoc'h roll ar sontadegoù krouet gant ar chomlec'h postel-mañ.",
"Polls saved inside this browser": "Polls saved inside this browser",
"Polls sent": "Kaset eo bet ar sontadegoù",
"Send me my polls": "Kasit din ma sontadegoù"
"Remove all polls from this browser": "Remove all my polls from this browser's index",
"Remove poll from index": "Remove poll from index",
"Send me my polls": "Kasit din ma sontadegoù",
"Send my polls by email": "Send my polls by email",
"There are no polls saved inside your browser yet": "There are no polls saved inside your browser yet",
"Title": "Titl",
"Visited polls": "Visited polls"
},
"Generic": {
"(in the format name@mail.com)": "(dindan ar stumm anv@postel.bzh)",
@ -188,7 +209,7 @@
"Ifneedbe": "Marteze",
"Legend:": "Alc'hwez:",
"Link": "Ere",
"Make your polls": "Aozit emgavioù en un doare simpl ha dieub.",
"Make your polls": "Aozit emgavioù en un doare simpl ha dieub",
"Markdown": "Markdown",
"Next": "Kenderc'hel",
"No": "Ket",
@ -220,8 +241,11 @@
"AppName": "Anv an arload",
"CleanUrl": "URL naet",
"Database": "Stlennvon",
"DbConnectionString": "Chadenn gennaskañ",
"DbDriver": "Database driver",
"DbHost": "Database hostname",
"DbName": "Database name",
"DbPassword": "Ger-tremen",
"DbPort": "Database port",
"DbPrefix": "Rakger",
"DbUser": "Arveriad",
"DefaultLanguage": "Yezh dre ziouer",
@ -266,7 +290,9 @@
"You have to provide a password to access the poll.": "Ret eo deoc'h reiñ ur ger-tremen evit mont d'ar sontadeg."
},
"Poll results": {
"%s option": "%s option",
"Addition": "Sammad",
"Anyone will be able to access your email address after your vote": "Anyone will be able to see your email address after you voted",
"Best choice": "Dibab gwellañ",
"Best choices": "Dibaboù gwellañ",
"Chart": "Diervad",
@ -280,10 +306,11 @@
"Scroll to the right": "Dibunañ d'an tu dehou",
"The best choice at this time is:": "Evit ar mare, an dibab gant ar muiañ a vouezhioù a zo:",
"The bests choices at this time are:": "Evit ar mare, an dibaboù gant ar muiañ a vouezhioù a zo:",
"Vote ifneedbe for": "Vote under reserve for",
"Vote ifneedbe for": "Votes under reserve for",
"Vote no for": "Mouezhiañ « ket » evit",
"Vote yes for": "Mouezhiañ « ya » evit",
"Votes of the poll": "Mouezhioù ar sontadeg",
"Warning : anyone can access to your email address after voting": "Warning: Anyone can see your email address after voting",
"polled user": "mouezhier",
"polled users": "a vouezhierien"
},
@ -295,6 +322,8 @@
"Cancel the name edit": "Nullañ embann an anv",
"Cancel the rules edit": "Nullañ embann an aotreoù",
"Cancel the title edit": "Nullañ embann an titl",
"Collect of the polled users email addresses": "Collec the polled users' email addresses",
"Collecting the polled users emails": "Collecting the polled users email addresses",
"Edit the description": "Embann an deskrivadur",
"Edit the email adress": "Embann ar chomlec'h postel",
"Edit the expiration date": "Embann an deiziad diamzeriñ",
@ -305,6 +334,7 @@
"Expiration date": "Deiziad diamzeriñ",
"Export to CSV": "Ezporzhiañ e CSV",
"Initiator of the poll": "Aozer ar sontadeg",
"No collect of the polled users email addresses": "The polled users' email addresses are not collected",
"No password": "Ger-tremen ebet",
"Only votes are protected": "Only votes are protected",
"Password protected": "Gwarezet gant ur ger-tremen",
@ -326,12 +356,23 @@
"Save the new title": "Enrollañ an titl nevez",
"Simple editor": "Embanner eeun",
"Title": "Titl ar sontadeg",
"Voters email adresses are collected": "Voters' email adresses are collected",
"Voters email adresses are collected and required": "Voters' email adresses are collected and required",
"Voters email adresses are collected, required and verified": "Voters' email adresses are collected, required and verified",
"Voters email adresses are not collected": "Voters' email adresses are not collected",
"Votes and comments are locked": "Prennet eo ar mouezhioù hag an evezhiadennoù",
"Votes protected by password": "Gwarezet eo ar mouezhioù gant ur ger-tremen"
},
"Step 1": {
"All voters can modify any vote": "An holl vouezhierien a c'hall kemmañ an holl vouezhioù",
"Collect the polled users email addresses": "Collecting the polled users' email addresses",
"Collect users email": "Collect users' email addresses",
"Collect voters email": "Collect voters' email addresses",
"Customize the URL": "Personelaat an ere",
"Email addresses are collected but not required": "Email addresses are collected but not required",
"Email addresses are not collected": "Email addresses are not collected",
"Email addresses are required": "Email addresses are required",
"Email addresses are required and verified": "Email addresses are required and verified",
"Go to step 2": "Mont d'ar bazenn 2",
"Limit the amount of voters per option": "Bevenniñ an niver a vouezhierien dre zibab",
"More informations here:": "Titouroù ouzhpenn amañ:",
@ -353,9 +394,11 @@
"To receive an email for each new vote": "Degemer ur postel evit pep mouezh nevez",
"Use a password to restrict access": "Lakaat ur ger-tremen evit bevenniñ an haeziñ",
"Value Max": "Talvoud uc'hek",
"ValueMax instructions": "mouezhier dre zibab",
"ValueMax instructions": "votes per option",
"Voters can modify their vote themselves": "Pep mouezhier a c'hell kemmañ e vouezh",
"Votes cannot be modified": "N'hall ket ar mouezhioù bezañ kemmet",
"Warning : anyone can access to the polled users's email addresses.": "Warning: Anyone can see the polled users' email addresses.",
"Warning: anyone can access the polled users email addresses since all voters can modify any vote. You should restrict permission rules.": "Warning: Anyone can see the polled users' email addresses since all voters can modify any vote. You should restrict permission rules.",
"You are in the poll creation section.": "Dibabet ho peus krouiñ ur sontadeg nevez.",
"You can enable or disable the editor at will.": "Gallout a rit gweredekaat pe ziweredekaat an embanner diouzh ho tibab."
},
@ -412,6 +455,8 @@
"As poll administrator, you can change all the lines of this poll with this button": "Dre ma'z oc'h merour e c'hallit kemmañ holl linennoù ar sontadeg gant an afell-mañ",
"Back to the poll": "Distreiñ d'ar sontadeg",
"Choice added": "Dibab ouzhpennet",
"Collect the emails of the polled users for the choice": "Collect the emails of the polled users for the choice",
"Collect the emails of the polled users for this column": "Collect the email addresses of the polled users for this column",
"Column removed": "Bann dilamet",
"Column's adding": "Ouzhpennañ ur bann",
"Comment deleted": "Dilamet eo bet an evezhiadenn",
@ -419,7 +464,7 @@
"Confirm removal of all votes of the poll": "Kadarnaat dilemel holl vouezhioù ar sontadeg",
"Confirm removal of the column.": "Kadarnaat dilemel ar bann.",
"Confirm removal of the poll": "Kadarnaat dilemel ar sontadeg",
"Delete the poll": "Dilemel ar sontadeg",
"Delete the poll": "Delete poll",
"Finally, you can change the informations of this poll like the title, the comments or your email address.": "Gallout a rit ivez kemmañ an titouroù a-zivout ar sontadeg evel an titl, an evezhiadennoù pe ho chomlec'h postel.",
"If you just want to add a new hour to an existant date, put the same date and choose a new hour.": "Ma fell deoc'h ouzhpennañ un eur d'un deiziad a zo dioutañ endeo e c'hallit lakaat an hevelep deiziad ha dibab un eur all. Lakaet e vo er sontadeg.",
"Keep comments": "Mirout an evezhiadennoù",
@ -442,6 +487,14 @@
"and add a new column with": "ha m'ho peus disoñjet un dibab e c'hallit ouzhpennañ ur bann en ur glikañ war",
"remove a column or a line with": "dilemel ur bann pe ul linenn gant"
},
"display_mails": {
"People who have answered 'If need be' to this option have left those email addresses :": "Users who voted 'If need be' for this option have left those email addresses:",
"People who have answered 'If need be' to this option have not left any email addresses.": "Users who voted 'If need be' for this option have not left any email addresses:",
"People who have answered 'No' to this option have left those email addresses :": "Users who voted 'No' for this option have left those email addresses:",
"People who have answered 'No' to this option have not left any email addresses.": "Users who voted 'No' for this option have not left any email addresses.",
"People who have answered 'Yes' to this option have left those email addresses :": "Users who voted 'Yes' for this option have left those email addresses:",
"People who have answered 'Yes' to this option have not left any email addresses.": "Users who voted 'Yes' for this option have not left any email addresses."
},
"studs": {
"Adding the vote succeeded": "Mouezh ouzhpennet",
"Deletion date:": "Deiziad dilemel:",

507
locale/ca.json Normal file
View File

@ -0,0 +1,507 @@
{
"1st section": {
"Define dates or subjects to choose": "Definir dates o temes per triar",
"Discuss and make a decision": "Discutir i prendre una decisió",
"Do you want to": "Vols",
"Framadate is an online service for planning an appointment or make a decision quickly and easily. No registration is required.": "Framadate és un servei en línia per planificar una cita o prendre una decisió de forma ràpida i senzilla. No cal registrar-se.",
"Here is how it works:": "Així és com funciona:",
"Make a poll": "Crea una enquesta",
"Send the poll link to your friends or colleagues": "Envia l'enllaç de l'enquesta als teus amics o col·legues",
"What is that?": "Què és Framadate?",
"view an example?": "veure un exemple?"
},
"2nd section": {
"CeCILL-B license": "Llicència CeCILL-B",
"Framadate was initially based on ": "Framadate es va basar inicialment en",
"It is governed by the": "Framadate està llicenciat sota la",
"The software": "El programari",
"This software needs javascript and cookies enabled. It is compatible with the following web browsers:": "Aquest programari necessita JavaScript i galetes habilitades. És compatible amb els següents navegadors web:",
"a software developed by the University of Strasbourg. Today, it is devevoped by the association Framasoft.": "programari desenvolupat per la Universitat d'Estrasburg. Actualment desenvolupat per l'associació Framasoft."
},
"3rd section": {
"Cultivate your garden": "Créixer el teu compte",
"If you want to install the software for your own use and thus increase your independence, we help you on:": "Si vols instal·lar el programari per al teu propi ús i, per tant, augmentar la teva independència, et podem ajudar a:",
"To participate in the software development, suggest improvements or simply download it, please visit ": "Per participar en el desenvolupament del programari, suggerir millores o simplement descarregar-lo, visita",
"the development site": "el lloc del desenvolupament"
},
"Admin": {
"Actions": "Accions",
"Administration": "Administració",
"Author": "Autor",
"Back to administration": "Tornar a l'administració",
"Change the poll": "Canvia l'enquesta",
"Confirm removal of the poll": "Confirma la supressió de l'enquesta",
"Deleted the poll": "Enquesta eliminada",
"Email": "Correu electrònic",
"Executed": "Executat",
"Expiration date": "Data de caducitat",
"Fail": "Suspens",
"Failed:": "Ha fallat:",
"Format": "Format de",
"Installation": "Instal·lació",
"Logs": "Registres",
"Migration": "Migració",
"Nothing": "Res",
"Pages:": "Pàgines:",
"Poll ID": "Enquesta ID",
"Polls": "Enquestes",
"Purge": "Purga",
"Purge the polls": "Purga les enquestes",
"Purged:": "Purgat:",
"See the poll": "Veure l'enquesta",
"Skipped:": "Omesos:",
"Status": "L'estat",
"Succeeded:": "Amb èxit",
"Success": "Èxit",
"Summary": "Resum",
"Title": "Títol",
"Votes": "Vots",
"Waiting": "Esperant",
"polls in the database at this time": "enquestes a la base de dades en aquest moment"
},
"Check": {
"Check again": "Comprova una altra vegada",
"Consider enabling the PHP extension OpenSSL for increased security.": "Per una major seguretat, considera habilitar l'extensió OpenSSL de PHP OpenSSL ",
"Consider setting the date.timezone in php.ini.": "Considera establir la date.timezone a php.ini.",
"Consider setting « session.cookie_httponly = 1 » inside your php.ini or add « php_value session.cookie_httponly 1 » to your .htaccess so that cookies can't be accessed through Javascript.": "Considera establir « session.cookie_httponly = 1 » a l'arxiu php.ini o afegeix « php_value session.cookie_httponly 1 » a l'arxiu .htaccess de forma que les galetes no siguin accessibles des de Javascript",
"Continue the installation": "Continuar la instal·lació",
"Cookies are served from HTTP only.": "Les galetes només es poden enviar des d'HTTP",
"Installation checking": "Comprovació de la instal·lació",
"OpenSSL extension loaded.": "Extensió OpenSSL carregada.",
"PHP Intl extension is enabled.": "L'extensió de PHP Intl està habilitada.",
"PHP version %s is enough (needed at least PHP %s).": "Versió %s PHP és suficient (almenys necessitava PHP %s).",
"The config file directory (%s) is not writable and the config file (%s) does not exists.": "El directori de fitxers de configuració (%s) no es pot escriure i el fitxer de configuració (%s) no existeix.",
"The config file directory (%s) is writable.": "El directori de fitxers de configuració (%s) es pot escriure.",
"The config file exists.": "Existeix el fitxer de configuració.",
"The template compile directory (%s) doesn't exist in \"%s\". Retry the installation process.": "El directori de compilació de plantilles (%s) no existeix al \"%s\". Torna a intentar el procés d'instal·lació.",
"The template compile directory (%s) is not writable.": "El directori de compilació de plantilla (%s) no es pot escriure.",
"The template compile directory (%s) is writable.": "El directori de compilació de la plantilla (%s) es pot escriure.",
"You need to enable the PHP Intl extension.": "Necessites habilitar l'extensió de PHP Intl.",
"Your PHP version (%s) is too old. This application needs at least PHP %s.": "La teva versió PHP (%s) és massa vella. Aquesta aplicació necessita almenys PHP %s.",
"date.timezone is set.": "date.timezone està establert."
},
"Comments": {
"Add a comment to the poll": "Afegeix un comentari a l'enquesta",
"Comment added": "S'ha desat el comentari",
"Comments of polled people": "Comentaris",
"Remove the comment": "Elimina el comentari",
"Send the comment": "Enviar Comentari",
"Type your name and a comment to send it": "Introdueix el teu nom i el comentari abans d'enviar el formulari",
"Your comment": "Comentari",
"anonyme": "Anònim"
},
"Date": {
"Add range dates": "Afegir rang",
"DATE": "%Y-%m-%d",
"DATETIME": "%m/%d/%Y %H:%M",
"DAY": "%a %e",
"End date": "Data final",
"FULL": "%A, %B %e, %Y",
"MONTH_YEAR": "%B %Y",
"Max dates count": "Pots seleccionar com a màxim 4 mesos",
"SHORT": "%A %e %B %Y",
"Start date": "Data d'inici",
"datepicker": "yyyy-mm-dd",
"datetime_parseformat": "Y-m-d",
"dd/mm/yyyy": "yyyy-mm-dd"
},
"EditLink": {
"Edit link for poll \"%s\"": "Edita l'enllaç de l'enquesta \"%s\"",
"Here is the link for editing your vote:": "Aquí tens l'enllaç per editar el vostre vot:",
"If you don't want to lose your personalized link, we can send it to your email.": "Si no vols perdre el teu enllaç personalitzat, te'l podem enviar per correu electrònic.",
"Please wait %d seconds before we can send an email to you then try again.": "Espera %d segons abans que et puguem enviar un correu electrònic i torna-ho a provar.",
"REMINDER": "RECORDATORI",
"Send": "Envia",
"The email address is not correct.": "L'adreça de correu electrònic no és correcta.",
"Your reminder has been successfully sent!": "El teu recordatori s'ha enviat amb èxit!"
},
"Error": {
"Adding vote failed": "S'ha produït un error en afegir el vot",
"CANT_CONNECT_TO_DATABASE": "No es pot connectar a la base de dades",
"Can't create an empty column.": "No es pot crear una columna buida.",
"Can't create the config.php file in '%s'.": "No es pot crear el fitxer config.php a '%s'.",
"Comment failed": "Error de comentari",
"Cookies are disabled on your browser. Theirs activation is required to create a poll.": "Les galetes estan desactivades al vostre navegador. Cal que estiguin activades per a crear una enquesta.",
"Enter a name": "Introdueix un nom",
"Enter a name and a comment!": "Introdueix un nom i un comentari.",
"Enter a title": "Introdueix un títol",
"Enter an email address": "Introdueix una adreça de correu electrònic",
"Error on amount of voters limitation : value must be an integer greater than 0": "Error en la limitació de la quantitat de vots: El valor ha de ser un enter més gran que 0",
"Error!": "Error!",
"Failed to delete all comments": "No s'han pogut eliminar tots els comentaris",
"Failed to delete all votes": "No s'han pogut eliminar tots els vots",
"Failed to delete column": "No s'ha pogut eliminar la columna",
"Failed to delete the comment": "No s'han pogut eliminar el comentari",
"Failed to delete the poll": "No s'ha pogut eliminar l'enquesta",
"Failed to delete the vote!": "No s'ha pogut eliminar el vot!",
"Failed to insert the comment!": "No s'ha pogut inserí el comentari",
"Failed to save poll": "No ha pogut desar l'enquesta",
"Forbidden!": "Prohibit!",
"Framadate is not properly installed, please check the \"INSTALL\" to setup the database before continuing.": "Framadate no està instal·lat correctament, si us plau, consulta el fitxer 'INSTALL' per obtenir instruccions sobre com configurar la base de dades abans de continuar.",
"Javascript is disabled on your browser. Its activation is required to create a poll.": "JavaScript està desactivat al vostre navegador. Cal activar-lo per a crear una enquesta.",
"MISSING_VALUES": "Valors que falten",
"No polls found": "No s'han trobat enquestes",
"Password is empty": "La contrasenya està buida.",
"Passwords do not match": "Les contrasenyes no coincideixen.",
"Poll has been updated before you vote": "L'enquesta s'ha actualitzat abans de votar",
"Poll id already used": "Ja s'utilitza l'identificador",
"Something is going wrong...": "Alguna cosa no ha anat bé...",
"Something is wrong with the format": "Alguna cosa està malament amb el format",
"Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Alguna cosa està malament amb el format: els URL personalitzats només han de consistir en caràcters alfanumèrics i guions.",
"Something is wrong with the format: name shouldn't have any spaces before or after": "Alguna cosa està malament amb el format: el nom no hauria de tenir cap espai abans o després",
"The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.": "L'adreça no és correcta. Has d'introduir una adreça de correu electrònic vàlida (com ara r.stallman@outlock.com) per rebre l'enllaç a la teva enquesta.",
"The column already exists": "La columna ja existeix",
"The name is invalid.": "El nom és invàlid.",
"The name you've chosen already exist in this poll!": "El nom que has introduït ja existeix!",
"There is a problem with your choices": "Hi ha un problema amb les teves eleccions",
"This id is not allowed": "Aquest identificador no està permès",
"This poll doesn't exist !": "Aquesta enquesta no existeix!",
"Update vote failed": "S'ha produït un error en afegir el vot",
"You already voted": "Ja has votat...",
"You can't create a poll with hidden results with the following edition option:": "No pots crear una enquesta amb resultats ocults amb la següent opció:",
"You can't select more than %d dates": "No pots seleccionar més que %d dates",
"You haven't filled the first section of the poll creation, or your session has expired.": "No has omplert la primera secció de la creació de l'enquesta, o la sessió ha expirat.",
"You haven't filled the first section of the poll creation.": "No has omplert la secció primera de l'enquesta.",
"Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry.": "El teu vot no es tindrà en compte, perquè algú ha votat en el mateix moment i això entra en conflicte amb les teves opcions i les condicions de l'enquesta. Si us plau, torna a provar."
},
"FindPolls": {
"Address": "adreça",
"Created polls": "S'han creat les enquestes",
"Have a good day!": "Que tinguis un bon dia!",
"Here is the list of the polls that you manage on %s:": "Aquí tens la llista de les enquestes que gestioneu a%s:",
"If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.": "Si no ets l'orígen d'aquesta acció i si creus que aquest és un abús del servei, notifica-ho a l'administrador a%s.",
"Last access date": "Última data d'accés",
"List of your polls": "Llista de les teves enquestes",
"Local Storage Help": "Per ajudar-te a trobar les teves enquestes anteriors, guardem cada enquesta que creeu o accediu al teu navegador. Aquestes dades només es guarden dins d'aquest navegador. Es guardaran les dades següents:",
"Local Storage Help Delete": "Per eliminar aquestes dades feu clic a la paperera a la línia corresponent o feu clic a l'opció «Eliminar els índexs d'enquestes». Això no suprimirà les enquestes.",
"Local Storage Help Information Accessed": "La data en què vas crear o vas accedir per darrer cop a l'enquesta",
"Local Storage Help Information Address": "És l'adreça",
"Local Storage Help Information Title": "El títol de l'enquesta",
"PS: this email has been sent because you or someone else asked to get back the polls created with your email address.": "PS: aquest correu electrònic s'ha enviat perquè tu, o algú més, heu sol•licitat tornar les enquestes creades amb la vostra adreça de correu electrònic.",
"Polls saved inside this browser": "S'han desat les enquestes dins d'aquest navegador",
"Polls sent": "Enquestes enviades",
"Remove all polls from this browser": "Eliminar totes les meves enquestes de l'índex del aquest navegador",
"Remove poll from index": "Elimina l'enquesta de l'índex",
"Send me my polls": "Envia'm les enquestes",
"Send my polls by email": "Envia les meves enquestes per correu electrònic",
"There are no polls saved inside your browser yet": "Encara no hi ha enquestes desades al teu navegador",
"Title": "Títol",
"Visited polls": "Enquestes visites"
},
"Generic": {
"(in the format name@mail.com)": "(en format nom@mail.com)",
"ASTERISK": "*",
"Add": "Afegeix",
"Back": "Torna",
"Back to the homepage of": "Torna a la pàgina d'inici de",
"Cancel": "Cancel·lar",
"Caption": "Informació",
"Choice": "Elecció",
"Classic": "Clàssic",
"Close": "Tanca",
"Creation date:": "Data de creació:",
"Date": "Data",
"Day": "Dia",
"Description": "Descripció",
"Edit": "Edita",
"Framadate is an online service for planning an appointment or make a decision quickly and easily.": "Framadate és un servei en línia per planificar una cita o prendre una decisió de forma ràpida i senzilla.",
"Home": "Inici",
"Ifneedbe": "Sota reserva",
"Legend:": "Llegenda:",
"Link": "Enllaç",
"Make your polls": "Crea les teves pròpies enquestes",
"Markdown": "Markdown",
"Next": "Pròxim",
"No": "No",
"Page generated in": "Pàgina generada a",
"Poll": "Enquesta",
"Remove": "Elimina",
"Save": "Desa",
"Search": "Cerca",
"Time": "Temps",
"Validate": "Valida",
"Yes": "Sí",
"Your email address": "la teva adreça de correu electrònic",
"Your name": "El teu nom",
"days": "dies",
"for": "per a",
"months": "mesos",
"seconds": "segons",
"vote": "votar",
"votes": "vots",
"with": "amb"
},
"Homepage": {
"Make a classic poll": "Feu una enquesta estàndard",
"Schedule an event": "Programeu un esdeveniment",
"Where are my polls": "On són les meves enquestes?"
},
"Installation": {
"AppMail": "Adreça de correu d'administrador",
"AppName": "Nom de l'aplicació",
"CleanUrl": "Neteja URL",
"Database": "Nom de la base de dades",
"DbDriver": "Controlador de base de dades",
"DbHost": "Nom del servidor de base de dades",
"DbName": "Nom de la base de dades",
"DbPassword": "Contrasenya",
"DbPort": "Port de base de dades",
"DbPrefix": "Prefix",
"DbUser": "Usuari",
"DefaultLanguage": "Idioma per defecte",
"General": "General",
"Install": "Instal·lar",
"MigrationTable": "Taula de migració",
"ResponseMail": "Respon a l'adreça de correu"
},
"Language selector": {
"Change the language": "Canviar d'idioma",
"Select the language": "Escull l'idioma"
},
"Mail": {
"Author's message": "Missatge per a l'autor",
"FOOTER": "\"El camí és llarg, però el camí està clar ...\" <br/> Framasoft només viu de les vostres donacions. <br/> Gràcies per endavant pel vostre suport https://soutenir.framasoft.org",
"For sending to the polled users": "Enllaç del participant",
"Notification of poll: %s": "Notificació de l'enquesta: %s",
"Poll's participation: %s": "Participació en l'enquesta: %s",
"Someone just change your poll available at the following link %s.": "Algú ha canviat la teva enquesta al següent enllaç <a href=\"%1$s\">%1$s</a>.",
"Someone just delete your poll %s.": "Algú acaba d'eliminar la teva enquesta \"%s\".",
"Thanks for filling the poll at the link above": "Gràcies per participar a l'enquesta al següent enllaç",
"Thanks for your trust.": "Gràcies per la teva confiança.",
"This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.": "Aquest és el missatge que es reenviarà als participants de l'enquesta.",
"This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above": "Aquest missatge NO s'haurà d'enviar als participants de l'enquesta. Has de mantenir-lo privat. <br/> <br/> Pots modificar la teva enquesta al següent enllaç",
"You have changed the settings of your poll. \nYou can modify this poll with this link": "Has canviat la configuració de la teva enquesta. <br/> Pots modificar aquesta enquesta amb aquest enllaç",
"[ADMINISTRATOR] New settings for your poll": "[ADMINISTRADOR] Nova configuració per a la teva enquesta",
"filled a vote.\nYou can find your poll at the link": "afegit un vot. <br/> Pots visitar la teva enquesta a l'enllaç",
"hast just created a poll called": "acaba de crear una enquesta anomenada",
"updated a vote.\nYou can find your poll at the link": "s'ha actualitzat una votació. <br/> Pots visitar la teva enquesta a l'enllaç",
"wrote a comment.\nYou can find your poll at the link": "s'ha escrit un comentari. <br/> Pots visitar la teva enquesta a l'enllaç"
},
"Maintenance": {
"Thank you for your understanding.": "Gràcies per la teva comprensió.",
"The application": "L'aplicació",
"is currently under maintenance.": "actualment està en manteniment"
},
"Password": {
"Password": "Contrasenya",
"Submit access": "Enviar accés",
"Wrong password": "Contrasenya ",
"You have to provide a password so you can participate to the poll.": "Has de proporcionar una contrasenya perquè puguis participar a l'enquesta.",
"You have to provide a password to access the poll.": "Has de proporcionar una contrasenya per accedir a l'enquesta."
},
"Poll results": {
"%s option": "%s opció",
"Addition": "Total",
"Anyone will be able to access your email address after your vote": "Qualsevol persona podrà veure la teva adreça de correu electrònic després de que hagis votat",
"Best choice": "Millor elecció",
"Best choices": "Millors eleccions",
"Chart": "Gràfic",
"Display the chart of the results": "Mostra el gràfic dels resultats",
"Edit the line: %s": "Edita la línia: %s",
"Link to edit this particular line": "Enllaça per editar aquesta línia en particular",
"Link to edit this particular line has been copied inside the clipboard!": "L'enllaç per editar aquesta línia en particular s'ha copiat al porta-retalls.",
"Remove the line:": "Suprimeix la línia:",
"Save the choices": "Desa les opcions",
"Scroll to the left": "Desplaça't cap a l'esquerra",
"Scroll to the right": "Desplaça't cap a la dreta",
"The best choice at this time is:": "La millor opció actual és:",
"The bests choices at this time are:": "Les millors opcions actuals són:",
"Vote ifneedbe for": "Vots sota reserva per a",
"Vote no for": "Vota \"no\" per a",
"Vote yes for": "Vota \"sí\" per a",
"Votes of the poll": "Vots",
"Warning : anyone can access to your email address after voting": "Compte: qualsevol pot accedir al teu correu electrònic després de vostar",
"polled user": "usuari enquestat",
"polled users": "usuaris enquestats"
},
"PollInfo": {
"Admin link of the poll": "Enllaç d'administració per a l'enquesta",
"Cancel the description edit": "Cancel·la l'edició de la descripció",
"Cancel the email address edit": "Cancel·la l'edició de l'adreça electrònica",
"Cancel the expiration date edit": "Cancel·la l'edició de la data de venciment",
"Cancel the name edit": "Cancel·la l'edició del nom",
"Cancel the rules edit": "Cancel·la l'edició de les regles",
"Cancel the title edit": "Cancel·la l'edició del títol",
"Collect of the polled users email addresses": "Recopilació de les adreces electròniques dels usuaris enquestats",
"Collecting the polled users emails": "Recopilació de les adreces electròniques dels usuaris enquestats",
"Edit the description": "Edita la descripció",
"Edit the email adress": "Edita l'adreça de correu electrònic",
"Edit the expiration date": "Edita la data de caducitat",
"Edit the name": "Edita el nom",
"Edit the poll rules": "Edita les regles d'enquesta",
"Edit the title": "Edita el títol",
"Email": "Correu electrònic",
"Expiration date": "Data de caducitat",
"Export to CSV": "Exporta a CSV",
"Initiator of the poll": "Creador de l'enquesta",
"No collect of the polled users email addresses": "No es recullen les adreces electròniques dels usuaris enquestats",
"No password": "Sense contrasenya",
"Only votes are protected": "Només els vots estan protegits",
"Password protected": "Contrasenya protegida",
"Poll rules": "Regles d'enquesta",
"Print": "Imprimir",
"Public link of the poll": "Enllaç públic a l'enquesta",
"Remove all the comments": "Elimina tots els comentaris",
"Remove all the votes": "Elimina tots els vots",
"Remove password": "Elimina la contrasenya",
"Remove the poll": "Elimina l'enquesta",
"Results are hidden": "Els resultats estan amagats",
"Results are visible": "Els resultats són visibles",
"Rich editor": "Editor enriquit",
"Save the description": "Desa la descripció",
"Save the email address": "Desa l'adreça de correu electrònic",
"Save the new expiration date": "Desa la nova data de venciment",
"Save the new name": "Desa el nom nou",
"Save the new rules": "Desa les noves regles",
"Save the new title": "Desa el títol nou",
"Simple editor": "Editor simple",
"Title": "Títol de l'enquesta",
"Voters email adresses are collected": "S'han recopilat les adreces de correu electrònic dels votants",
"Voters email adresses are collected and required": "S'han recopilat i requerit les adreces de correu electrònic dels votants",
"Voters email adresses are collected, required and verified": "S'han recopilat, requerit i verificat les adreces de correu electrònic dels votants",
"Voters email adresses are not collected": "No s'han recopilat les adreces de correu electrònic dels votants",
"Votes and comments are locked": "Els vots i els comentaris estan bloquejats",
"Votes protected by password": "Vots protegits per contrasenya"
},
"Step 1": {
"All voters can modify any vote": "Tots els votants poden modificar qualsevol vot",
"Collect the polled users email addresses": "Recopilació de les adreces de correu electrònic dels usuaris enquestats",
"Collect users email": "Recull les adreces de correu electrònic dels usuaris",
"Collect voters email": "Recull les adreces de correu electrònic dels votants",
"Customize the URL": "Personalitza l'URL",
"Email addresses are collected but not required": "Les adreces electròniques es recopilen però no es requereixen",
"Email addresses are not collected": "No s'han recopilat adreces de correu electrònic",
"Email addresses are required": "S'han requerit les adreces de correu electrònic",
"Email addresses are required and verified": "S'han requerit i verificat les adreces de correu electrònic",
"Go to step 2": "Ves al pas 2",
"Limit the amount of voters per option": "Limita la quantitat de votants per opció",
"More informations here:": "Més informació aquí:",
"Only the poll maker can see the poll's results": "Només el creador de l'enquesta pot veure els resultats de l'enquesta",
"Optional parameters": "Paràmetres opcionals",
"Password choice": "Elecció",
"Password confirmation": "Confirmació",
"Permissions": "Permisos",
"Poll creation (1 on 3)": "Creació d'enquestes (1 de 3)",
"Poll id": "Enllaç d'enquesta",
"Poll id rules": "L'identificador pot contenir lletres, números i guions \"-\".",
"Poll id warning": "Definint un identificador que podria facilitar l'accés a l'enquesta per a persones no desitjades. Es recomana protegir-lo amb una contrasenya.",
"Poll password": "Contrasenya",
"Poll title": "Títol de l'enquesta",
"Required fields cannot be left blank.": "Els camps obligatoris no es poden deixar en blanc.",
"The results are publicly visible": "Els resultats són públicament visibles",
"To make the description more attractive, you can use the Markdown format.": "Per fer que la descripció sigui més atractiva, pots utilitzar el format Markdown.",
"To receive an email for each new comment": "Reps un correu electrònic per a cada comentari nou",
"To receive an email for each new vote": "Reps un correu electrònic per a cada nou vot",
"Use a password to restrict access": "Utilitzeu una contrasenya per restringir l'accés",
"Value Max": "Valor màx",
"ValueMax instructions": "vots per opció",
"Voters can modify their vote themselves": "Els votants poden modificar el seu vot ells mateixos",
"Votes cannot be modified": "Els vots no es poden modificar",
"Warning : anyone can access to the polled users's email addresses.": "Advertència: Qualsevol pot veure les adreces de correu electrònic dels usuaris enquestats ",
"Warning: anyone can access the polled users email addresses since all voters can modify any vote. You should restrict permission rules.": "Advertència: Qualsevol pot veure les adreces de correu electrònic dels usuaris enquestats ja que tots els votants poden modificar qualsevol vot. Heu de restringir les regles de permís.",
"You are in the poll creation section.": "Sou a la secció de creació d'enquestes.",
"You can enable or disable the editor at will.": "Podeu habilitar o deshabilitar l'editor a voluntat."
},
"Step 2": {
"Back to step 1": "Torna al pas 1",
"Go to step 3": "Vés al pas 3"
},
"Step 2 classic": {
"Add a choice": "Afegir una elecció",
"Add a link or an image": "Afegiu un enllaç o una imatge",
"Alternative text": "Text alternatiu",
"It's possible to propose links or images by using": "Es poden incloure enllaços o imatges utilitzant",
"Poll subjects (2 on 3)": "Opcions de votació (2 de 3)",
"Remove a choice": "Elimina una elecció",
"These fields are optional. You can add a link, an image or both.": "Aquests camps són opcionals. Podeu afegir un enllaç, una imatge o ambdós.",
"To make a generic poll you need to propose at least two choices between differents subjects.": "Per crear una enquesta, heu de proporcionar almenys dues opcions diferents.",
"URL of the image": "URL de la imatge",
"You can add or remove additional choices with the buttons": "Pots afegir o eliminar opcions amb els botons",
"the Markdown syntax": "Sintaxi Markdown"
},
"Step 2 date": {
"Add a day": "Afegeix un dia",
"Add an hour": "Afegeix un espai horari",
"Choose the dates of your poll": "Tria dates per a la teva enquesta",
"Copy hours of the first day": "Copia els temps del primer dia",
"For each selected day, you can choose, or not, meeting hours (e.g.: \"8h\", \"8:30\", \"8h-10h\", \"evening\", etc.)": "Per cada dia seleccionat, pots suggerir temps de trobada (per exemple, \"8h\", \"8:30\", \"8h-10h\", \"tarda\", etc.).",
"Poll dates (2 on 3)": "Dates de l'enquesta (2 de 3)",
"Remove a day": "Treure un dia",
"Remove all days": "Treure tots els dies",
"Remove all hours": "Treure tots els temps",
"Remove an hour": "Treure un espai horari",
"Remove this day": "Treu aquest dia",
"To schedule an event you need to propose at least two choices (two hours for one day or two days).": "Per programar un esdeveniment, hauràs de proporcionar almenys dues opcions (per exemple, dos espais horaris en un o dos dies).",
"You can add or remove additionnal days and hours with the buttons": "Podeu afegir o treure dies i hores addicionals amb els botons"
},
"Step 3": {
"Archiving date:": "Data de caducitat:",
"Back to step 2": "Torna al pas 2",
"Confirm the creation of your poll": "Confirma la creació de la teva enquesta",
"Create the poll": "Crea l'enquesta",
"List of your choices": "Llista d'opcions",
"Once you have confirmed the creation of your poll, you will be automatically redirected on the administration page of your poll.": "Un cop hagis confirmat la creació de la teva enquesta, se't redirigirà automàticament a la pàgina d'administració de l'enquesta.",
"Removal date and confirmation (3 on 3)": "Data de supressió i confirmació (3 de 3)",
"Then, you will receive quickly two emails: one contening the link of your poll for sending it to the voters, the other contening the link to the administration page of your poll.": "A continuació, rebras dos correus electrònics: un que contindrà l'enllaç de la teva enquesta per enviar-la als participants i l'altre que contindrà l'enllaç a la pàgina d'administració de l'enquesta.",
"You can set a closer archiving date for it.": "Pots establir una data de caducitat específica de l'enquesta.",
"Your poll will automatically be archived": "La teva enquesta s'arxivarà automàticament",
"Your poll will be automatically archived in %d days.": "La teva enquesta s'arxivarà automàticament d'aquí a %d dies.",
"after the last date of your poll.": "després de l'última data de la teva enquesta."
},
"adminstuds": {
"Add a column": "Afegeix una columna",
"All comments deleted": "S'han suprimit tots els comentaris",
"All votes deleted": "Tots els vots suprimits",
"As poll administrator, you can change all the lines of this poll with this button": "Com a administrador, pots canviar totes les línies d'aquesta enquesta amb aquest botó",
"Back to the poll": "Torna a l'enquesta",
"Choice added": "Elecció afegida",
"Collect the emails of the polled users for the choice": "Recopila els correus electrònics dels usuaris enquestats per a l'elecció",
"Collect the emails of the polled users for this column": "Recopila els correus electrònics dels usuaris enquestats per aquesta columna",
"Column removed": "S'ha suprimit la columna",
"Column's adding": "Afegint una columna",
"Comment deleted": "Comentaris eliminats",
"Confirm removal of all comments of the poll": "Confirma l'eliminació de tots els comentaris",
"Confirm removal of all votes of the poll": "Confirma l'eliminació de tots els vots",
"Confirm removal of the column.": "Confirma l'eliminació de la columna.",
"Confirm removal of the poll": "Confirma l'eliminació de la vostra enquesta",
"Delete the poll": "Suprimeix l'enquesta",
"Finally, you can change the informations of this poll like the title, the comments or your email address.": "Finalment, pots canviar les propietats d'aquesta enquesta, com ara el títol, els comentaris o la teva adreça de correu electrònic.",
"If you just want to add a new hour to an existant date, put the same date and choose a new hour.": "Si només vols afegir un nou espai horari a una data existent, afegeix la data aquí i selecciona un nou espai horari.",
"Keep comments": "Mantenir comentaris",
"Keep the comments": "Conserva els comentaris",
"Keep the poll": "Conserva l'enquesta",
"Keep the votes": "Conserva els vots",
"Keep this poll": "Conserva aquesta enquesta",
"Keep votes": "Mantenir vots",
"Poll fully deleted": "Enquesta eliminada completament",
"Poll saved": "S'ha desat la votació",
"Remove the column": "Elimina la columna",
"Remove the comments": "Elimina els comentaris",
"Remove the votes": "Elimina els vots",
"The poll is created.": "S'ha creat l'enquesta.",
"Vote added": "Vot afegit",
"Vote deleted": "S'ha suprimit el vot",
"Vote updated": "Vot actualitzat",
"You can add a new scheduling date to your poll.": "Pots afegir una nova data de programació a la teva enquesta.",
"Your poll has been removed!": "S'ha eliminat la teva enquesta.",
"and add a new column with": "i afegeix una columna nova amb",
"remove a column or a line with": "treu una columna o una línia amb"
},
"display_mails": {
"People who have answered 'If need be' to this option have left those email addresses :": "Les persones que han respost 'Si és necessari' a aquesta opció, han deixat aquestes adreces de correu electrònic:",
"People who have answered 'If need be' to this option have not left any email addresses.": "Les persones que han respost 'Si és necessari' a aquesta opció, no han deixat cap adreça de correu electrònic.",
"People who have answered 'No' to this option have left those email addresses :": "Les persones que han respost 'No' a aquesta opció, han deixat aquestes adreces de correu electrònic:",
"People who have answered 'No' to this option have not left any email addresses.": "Les persones que han respost 'No' a aquesta opció, no han deixat cap adreça de correu electrònic.",
"People who have answered 'Yes' to this option have left those email addresses :": "Les persones que han respost 'Sí' a aquesta opció, han deixat aquestes adreces de correu electrònic:",
"People who have answered 'Yes' to this option have not left any email addresses.": "Les persones que han respost 'No' a aquesta opció, no han deixat cap adreça de correu electrònic."
},
"studs": {
"Adding the vote succeeded": "Vot afegit",
"Deletion date:": "Data de supressió:",
"If you want to vote in this poll, you have to give your name, choose the values that fit best for you and validate with the plus button at the end of the line.": "Si vols votar en aquesta enquesta, hauràs de donar el teu nom, fer la teva elecció i enviar-la seleccionant el botó de desar al final de la línia.",
"POLL_LOCKED_WARNING": "L'administrador va bloquejar aquesta enquesta. Els vots i els comentaris estan congelats, ja no és possible participar",
"The poll is expired, it will be deleted soon.": "L'enquesta ha caducat, aviat se suprimirà.",
"Update vote succeeded": "Vot actualitzat",
"Your vote has been registered successfully, but be careful: regarding this poll options, you need to keep this personal link to edit your own vote:": "El teu vot s'ha desat, però tingues en compte que has de conservar aquest enllaç personalitzat per poder-lo modificar."
}
}

View File

@ -1,6 +1,6 @@
{
"1st section": {
"Define dates or subjects to choose": "Zeitpunkte oder andere Alternativen zur Auswahl stellen",
"Define dates or subjects to choose": "Zeitpunkte oder andere Optionen zur Auswahl stellen",
"Discuss and make a decision": "Besprechen und Entscheidungen treffen",
"Do you want to": "Wollen Sie sich",
"Framadate is an online service for planning an appointment or make a decision quickly and easily. No registration is required.": "Framadate ist ein Online-Dienst, der Ihnen bei der Absprache von Terminen oder der Entscheidungsfindung hilft. Es ist keine Registrierung erforderlich.",
@ -33,12 +33,13 @@
"Confirm removal of the poll": "Bestätigen Sie die Löschung der Umfrage",
"Deleted the poll": "Umfrage gelöscht",
"Email": "E-Mail-Adresse",
"Executed": "Ausgeführt",
"Expiration date": "Verfallsdatum",
"Fail": "Gescheitert",
"Fail": "Fehler",
"Failed:": "Fehlgeschlagen:",
"Format": "Format",
"Installation": "Installation",
"Logs": "Verlauf",
"Logs": "Logs",
"Migration": "Migration",
"Nothing": "Nichts",
"Pages:": "Seiten:",
@ -49,11 +50,13 @@
"Purged:": "Entfernt:",
"See the poll": "Umfrage ansehen",
"Skipped:": "Übersprungene:",
"Status": "Status",
"Succeeded:": "Erfolgreich:",
"Success": "Erfolg",
"Summary": "Zusammenfassung",
"Title": "Titel",
"Votes": "Stimmen",
"Waiting": "Wartend",
"polls in the database at this time": "Umfragen derzeit in der Datenbank"
},
"Check": {
@ -83,6 +86,7 @@
"Comments of polled people": "Kommentare der Teilnehmer",
"Remove the comment": "Kommentar entfernen",
"Send the comment": "Kommentar abschicken",
"Type your name and a comment to send it": "Geben Sie Ihren Namen und einen Kommentar ein bevor Sie das Formular abschicken",
"Your comment": "Ihr Kommentar",
"anonyme": "anonym"
},
@ -103,34 +107,34 @@
},
"EditLink": {
"Edit link for poll \"%s\"": "Link für die Abstimmung \"%s\" bearbeiten",
"Here is the link for editing your vote:": "Hier ist der Link zum Ändern ihrer Wertung:",
"If you don't want to lose your personalized link, we can send it to your email.": "Wenn Sie ihren personalisierten Link nicht verlieren möchten, können wir ihn an Ihre E-Mail-Adresse senden.",
"Here is the link for editing your vote:": "Hier ist der Link zum Ändern ihrer Stimme:",
"If you don't want to lose your personalized link, we can send it to your email.": "Wenn Sie Ihren persönlichen Link nicht verlieren möchten, können wir Ihnen diesen per E-Mail zusenden.",
"Please wait %d seconds before we can send an email to you then try again.": "Bitte warten Sie %d Sekunden bis die E-Mail an Sie gesendet werden kann. Versuchen Sie es dann erneut.",
"REMINDER": "HINWEIS",
"Send": "Absenden",
"The email address is not correct.": "Die E-Mail-Adresse ist fehlerhaft.",
"Your reminder has been successfully sent!": "Ihre Erinnerungsnachricht wurde erfolgreich abgesendet."
"Your reminder has been successfully sent!": "Ihre Erinnerungsnachricht wurde erfolgreich abgesendet!"
},
"Error": {
"Adding vote failed": "Stimmabgabe fehlgeschlagen",
"CANT_CONNECT_TO_DATABASE": "Kann nicht mit der Datenbank verbinden",
"Can't create an empty column.": "Kann keine leere Spalte anlegen.",
"Can't create the config.php file in '%s'.": "Kann die config.php nicht in '%s' angelegen.",
"CANT_CONNECT_TO_DATABASE": "Datenbankverbindung fehlgeschlagen",
"Can't create an empty column.": "Es kann keine leere Spalte angelegt werden.",
"Can't create the config.php file in '%s'.": "Die config.php kann nicht in '%s' angelegt werden.",
"Comment failed": "Abgabe des Kommentars gescheitert",
"Cookies are disabled on your browser. Theirs activation is required to create a poll.": "Cookies werden von Ihrem Browser abgelehnt. Um eine Umfrage zu erstellen, müssen Sie Cookies zulassen.",
"Enter a name": "Geben Sie einen Namen ein",
"Enter a name and a comment!": "Geben Sie einen Namen und einen Kommentar ein!",
"Enter a title": "Titel eingeben",
"Enter an email address": "Geben Sie eine E-Mail Adresse ein",
"Error on amount of voters limitation : value must be an integer greater than 0": "Fehler bei der Beschränkung der Anzahl der Wähler: Der Wert muss größer als 0 sein",
"Error on amount of voters limitation : value must be an integer greater than 0": "Fehler bei der Beschränkung der Anzahl der Stimmen: Der Wert muss größer als 0 sein",
"Error!": "Fehler!",
"Failed to delete all comments": "Es konnten nicht alle Kommentare gelöscht werden",
"Failed to delete all votes": "Es konnten nicht alle Stimmen gelöscht werden",
"Failed to delete column": "Löschen der Spalte fehlgeschlagen",
"Failed to delete the comment": "Der Kommentar konnte nicht gelöscht werden",
"Failed to delete the poll": "Die Umfrage konnte nicht gelöscht werden",
"Failed to delete the vote!": "Löschen der Wertung gescheitert!",
"Failed to insert the comment!": "Einfügen des Kommentars gescheitert!",
"Failed to delete the vote!": "Löschen der Stimme gescheitert!",
"Failed to insert the comment!": "Speichern des Kommentars gescheitert!",
"Failed to save poll": "Speichern der Umfrage fehlgeschlagen",
"Forbidden!": "Verboten!",
"Framadate is not properly installed, please check the \"INSTALL\" to setup the database before continuing.": "Framadate ist nicht richtig installiert. Bevor Sie fortfahren, beachten Sie bitte die Angaben zum Aufsetzen der Datenbank in der Datei \"INSTALL\".",
@ -143,29 +147,46 @@
"Poll id already used": "Der Bezeichner ist bereits in Verwendung",
"Something is going wrong...": "Etwas ging schief ...",
"Something is wrong with the format": "Mit dem Format stimmt etwas nicht",
"Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Etwas ist falsch mit dem Format: Individuelle URLs dürfen nur aus alphanumerischen Zeichen und Bindestrichen bestehen.",
"Something is wrong with the format: name shouldn't have any spaces before or after": "Etwas ist falsch mit dem Format: Es sollte kein Leerzeichen vor oder nach dem Namen stehen.",
"Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Etwas stimmt mit dem Format nicht: Individuelle URLs dürfen nur aus alphanumerischen Zeichen und Bindestrichen bestehen.",
"Something is wrong with the format: name shouldn't have any spaces before or after": "Etwas ist falsch mit dem Format: Es darf kein Leerzeichen vor oder nach dem Namen stehen.",
"The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.": "Die Adresse ist nicht korrekt! Sie sollten eine gültige E-Mail-Adresse angeben, damit Ihnen der Link zur Umfrage zugeschickt werden kann.",
"The column already exists": "Die Spalte existiert bereits",
"The name is invalid.": "Der Name ist ungültig.",
"The name you've chosen already exist in this poll!": "Der von Ihnen eingegebene Name existiert schon in dieser Umfrage!",
"There is a problem with your choices": "Es gibt ein Problem mit Ihrer Auswahl",
"This id is not allowed": "Dieser Bezeichner ist nicht erlaubt",
"This poll doesn't exist !": "Diese Umfrage existiert nicht!",
"Update vote failed": "Aktualisierung der Stimme fehlgeschlagen",
"You already voted": "Sie haben bereits abgestimmt",
"You can't create a poll with hidden results with the following edition option:": "Sie können mit der folgenden Editier-Option keine Umfrage mit versteckten Ergebnissen erzeugen:",
"You can't create a poll with hidden results with the following edition option:": "Sie können mit den folgenden Optionen keine Umfrage mit versteckten Ergebnissen erzeugen:",
"You can't select more than %d dates": "Es können nicht mehr als %d Termine ausgewählt werden",
"You haven't filled the first section of the poll creation, or your session has expired.": "Sie haben den ersten Teil der Umfrageerstellung nicht ausgefüllt oder Ihre Session ist abgelaufen.",
"You haven't filled the first section of the poll creation.": "Sie haben den ersten Teil der Umfrageerstellung nicht ausgefüllt.",
"Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry.": "Ihre Stimme wurde nicht gezählt, da jemand in der Zwischenzeit gewählt hat und dies mit Ihrer Abstimmung und den Umfrage-Bestimmungen in Konflikt stand. Bitte versuchen Sie es erneut."
},
"FindPolls": {
"Address": "Adresse",
"Created polls": "Erstellte Umfragen",
"Have a good day!": "Einen schönen Tag noch!",
"Here is the list of the polls that you manage on %s:": "Hier ist die Liste der Umfragen die Sie auf %s verwalten:",
"If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.": "Wenn Sie diesen Vorgang nicht veranlasst haben und glauben, dass dieser Dienst missbraucht wurde, benachrichtigen Sie bitte den Administrator auf %s.",
"Here is the list of the polls that you manage on %s:": "Hier ist die Liste der Umfragen, die Sie auf %s verwalten:",
"If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.": "Wenn Sie diesen Vorgang nicht veranlasst haben und glauben, dass dieser Dienst missbraucht wurde, benachrichtigen Sie bitte den Administrator unter %s.",
"Last access date": "Letzter Zugriff",
"List of your polls": "Liste Ihrer Umfragen",
"Local Storage Help": "Um Ihre bisherigen Umfragen leichter zu finden, speichern wir jede Umfrage, die Sie erstellt oder die Sie aufgerufen haben, in Ihrem Browser. Die folgenden Daten werden dabei gespeichert:",
"Local Storage Help Delete": "Um diese Daten zu löschen klicken Sie auf den Mülleimer in der entsprechenden Zeile oder klicken Sie auf « Umfrage vom Index entfernen ». Ihre Umfragen selbst werden dabei nicht gelöscht.",
"Local Storage Help Information Accessed": "Das Datum, an dem Sie die Umfrage erstellt oder auf sie zugegriffen haben",
"Local Storage Help Information Address": "Ihre Adresse",
"Local Storage Help Information Title": "Der Titel der Umfrage",
"PS: this email has been sent because you or someone else asked to get back the polls created with your email address.": "PS: Diese E-Mail wurde abgeschickt weil Sie oder jemand anderes Zugriff auf die mit Ihrer E-Mail-Adresse angelegten Umfragen angefordert hat.",
"Polls saved inside this browser": "Umfragen, die in diesem Browser gespeichert sind",
"Polls sent": "Umfragen abgeschickt",
"Send me my polls": "Senden Sie mir meine Umfragen"
"Remove all polls from this browser": "Alle Umfragen aus dem Index dieses Browsers entfernen",
"Remove poll from index": "Umfrage vom Index entfernen",
"Send me my polls": "Senden Sie mir meine Umfragen",
"Send my polls by email": "Schicken Sie mir meine Umfragen per E-Mail",
"There are no polls saved inside your browser yet": "In Ihrem Browser wurden bisher noch keine Umfragen gespeichert",
"Title": "Titel",
"Visited polls": "Aufgerufene Umfragen"
},
"Generic": {
"(in the format name@mail.com)": "(Format: name@mail.com)",
@ -174,7 +195,7 @@
"Back": "Zurück",
"Back to the homepage of": "Zurück zur Startseite von ",
"Cancel": "Abbrechen",
"Caption": "Bildunterschrift",
"Caption": "Information",
"Choice": "Wahl",
"Classic": "Klassiker",
"Close": "Schließen",
@ -219,15 +240,18 @@
"AppMail": "E-Mail-Adresse der Anwendung/des Datenbankadministrators",
"AppName": "Name der Anwendung",
"CleanUrl": "Säubere URLs (boolean)",
"Database": "Datenbank",
"DbConnectionString": "Name des Datenbankservers (leer lassen um eine lokale Socket-Verbindung zu nutzen)",
"Database": "Datenbankname",
"DbDriver": "Datenbanktreiber",
"DbHost": "Datenbank-Hostname",
"DbName": "Datenbankname",
"DbPassword": "Datenbank-Passwort",
"DbPort": "Datenbank-Port",
"DbPrefix": "Tabellen-Präfix",
"DbUser": "Datenbank-Nutzername",
"DbUser": "Datenbank-Benutzername",
"DefaultLanguage": "Standardsprache",
"General": "Allgemeine Konfiguration",
"Install": "Installieren",
"MigrationTable": "Name der Tabelle welche den Migrationsstatus speichert",
"MigrationTable": "Name der Tabelle, welche den Migrationsstatus speichert",
"ResponseMail": "E-Mail-Adresse für automatische Antworten (sollte auf \"no-reply\" gesetzt werden)"
},
"Language selector": {
@ -235,22 +259,22 @@
"Select the language": "Sprache wählen"
},
"Mail": {
"Author's message": "Nachricht vom Autor ",
"FOOTER": "„Die Strecke ist lang, aber der Weg ist frei… \"<br/>Framasoft besteht nur durch Ihre Spenden (in Frankreich von der Steuer absetzbar).<br/>Herzlichen Dank für Ihre Unterstützung https://soutenir.framasoft.org",
"Author's message": "Nachricht für den Autor",
"FOOTER": "„Die Strecke ist lang, aber der Weg ist frei… \"<br/>Framasoft besteht nur durch Ihre Spenden (in Frankreich von der Steuer absetzbar).<br/>Herzlichen Dank für Ihre Unterstützung! https://soutenir.framasoft.org",
"For sending to the polled users": "Nachricht für die Teilnehmer",
"Notification of poll: %s": "Mitteilung bezüglich der Umfrage: %s",
"Poll's participation: %s": "Beteiligung an der Umfrage: %s",
"Someone just change your poll available at the following link %s.": "Jemand hat gerade Ihre Umfrage auf <a href=\"%1$s\">%1$s</a> geändert.",
"Someone just delete your poll %s.": "Jemand hat gerade Ihre Umfrage auf %s gelöscht.",
"Thanks for filling the poll at the link above": "Danke, dass Sie die Umfrage unter dem obigen Link ausgefüllt haben",
"Someone just delete your poll %s.": "Jemand hat gerade Ihre Umfrage \"%s\" gelöscht.",
"Thanks for filling the poll at the link above": "Danke, dass Sie an der Umfrage unter folgendem Link teilnehmen",
"Thanks for your trust.": "Danke für Ihr Vertrauen.",
"This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.": "Dies ist die Nachricht an die Umfrageteilnehmer.",
"This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above": "Diese Meldung sollte NICHT an die befragten Personen gesendet werden. Sie sollten sie für sich behalten. <br/><br/>Sie können Ihre Umfrage über den oben genannten Link abändern",
"This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above": "Diese Meldung sollte NICHT an die befragten Personen gesendet werden. Sie sollten sie für sich behalten. <br/><br/>Sie können Ihre Umfrage über den folgenden Link abändern",
"You have changed the settings of your poll. \nYou can modify this poll with this link": "Sie haben die Einstellungen Ihrer Umfrage verändert.<br/>Sie können diese Umfrage über diesen Link ändern",
"[ADMINISTRATOR] New settings for your poll": "[ADMINISTRATOR] Neue Einstellungen für Ihre Umfrage ",
"filled a vote.\nYou can find your poll at the link": "hat abgestimmt.<br/>Sie finden Ihre Umfrage über den Link",
"hast just created a poll called": " hat gerade eine Umfrage erstellt. Sie trägt den Titel",
"updated a vote.\nYou can find your poll at the link": "hat eine Wertung aktualisiert.<br/>Sie finden Ihre Umfrage über den Link",
"updated a vote.\nYou can find your poll at the link": "hat eine Stimme aktualisiert.<br/>Sie finden Ihre Umfrage über den Link",
"wrote a comment.\nYou can find your poll at the link": "hat einen Kommentar geschrieben.<br/>Sie finden Ihre Umfrage über den Link"
},
"Maintenance": {
@ -266,7 +290,9 @@
"You have to provide a password to access the poll.": "Sie müssen ein Passwort eingeben um auf die Abstimmung zuzugreifen."
},
"Poll results": {
"Addition": "Hinzufügen",
"%s option": "%s Option",
"Addition": "Insgesamt",
"Anyone will be able to access your email address after your vote": "Jeder wird Ihre E-Mail-Adresse sehen können nachdem Sie abgestimmt haben",
"Best choice": "Beste Alternative",
"Best choices": "Beste Alternativen",
"Chart": "Grafik",
@ -284,6 +310,7 @@
"Vote no for": "Nein-Stimmen für",
"Vote yes for": "Ja-Stimmen für",
"Votes of the poll": "Stimmabgaben zur Umfrage",
"Warning : anyone can access to your email address after voting": "Achtung: Jeder kann nach der Stimmabgabe Ihre E-Mail-Adresse einsehen ",
"polled user": "Stimme",
"polled users": "Stimmen"
},
@ -295,18 +322,21 @@
"Cancel the name edit": "Abbruch, Namen nicht ändern",
"Cancel the rules edit": "Abbruch, Regeln nicht ändern",
"Cancel the title edit": "Abbruch, Titel nicht ändern",
"Collect of the polled users email addresses": "Sammeln der E-Mail-Adressen der zur Umfrage eingeladenen Benutzer",
"Collecting the polled users emails": "Sammeln der E-Mail-Adressen der zur Umfrage eingeladenen Benutzer",
"Edit the description": "Beschreibung bearbeiten",
"Edit the email adress": "E-Mail-Adresse ändern",
"Edit the expiration date": "Bearbeiten Sie das Ablaufdatum",
"Edit the name": "Bearbeiten Sie den Namen",
"Edit the expiration date": "Das Ablaufdatum bearbeiten",
"Edit the name": "Den Namen bearbeiten",
"Edit the poll rules": "Regeln der Umfrage bearbeiten",
"Edit the title": "Titel bearbeiten",
"Email": "E-Mail-Adresse",
"Expiration date": "Ablaufdatum",
"Export to CSV": "CSV-Export",
"Initiator of the poll": "Autor der Umfrage",
"No collect of the polled users email addresses": "Kein Sammeln der E-Mail-Adressen der zur Umfrage eingeladenen Benutzer",
"No password": "Kein Passwort",
"Only votes are protected": "Only votes are protected",
"Only votes are protected": "Nur Abstimmungen sind geschützt",
"Password protected": "Passwortgeschützt",
"Poll rules": "Regeln der Umfrage",
"Print": "Drucken",
@ -319,19 +349,30 @@
"Results are visible": "Ergebnisse sind sichtbar",
"Rich editor": "Rich Text Editor",
"Save the description": "Beschreibung speichern",
"Save the email address": "Speichern Sie die E-Mail-Adresse",
"Save the new expiration date": "Speichern Sie das neue Ablaufdatum",
"Save the new name": "Speichern Sie den neuen Namen",
"Save the email address": "Die neue E-Mail-Adresse speichern",
"Save the new expiration date": "Das neue Ablaufdatum speichern",
"Save the new name": "Den neuen Namen speichern",
"Save the new rules": "Neue Regeln speichern",
"Save the new title": "Den neuen Titel speichern",
"Simple editor": "Einfacher Editor",
"Title": "Titel",
"Votes and comments are locked": "Wertungen und Kommentare sind gesperrt",
"Votes protected by password": "Wertungen sind passwortgeschützt"
"Title": "Titel der Umfrage",
"Voters email adresses are collected": "Die E-Mail-Adressen, der zur Umfrage eingeladenen Benutzer, werden gesammelt",
"Voters email adresses are collected and required": "Die E-Mail-Adressen, der zur Umfrage eingeladenen Benutzer, werden gesammelt und werden benötigt",
"Voters email adresses are collected, required and verified": "Die E-Mail-Adressen, der zur Umfrage eingeladenen Benutzer, werden gesammelt, werden benötigt und werden überprüft",
"Voters email adresses are not collected": "Die E-Mail-Adressen, der zur Umfrage eingeladenen Benutzer, werden nicht gesammelt",
"Votes and comments are locked": "Abstimmungen und Kommentare sind gesperrt",
"Votes protected by password": "Abstimmungen sind passwortgeschützt"
},
"Step 1": {
"All voters can modify any vote": "Jeder Teilnehmer kann jede abgegebene Wertung ändern",
"All voters can modify any vote": "Jeder Teilnehmer kann jede abgegebene Stimme ändern",
"Collect the polled users email addresses": "Sammeln der E-Mail-Adressen der zur Umfrage eingeladenen Benutzer",
"Collect users email": "Sammeln der E-Mail-Adressen der Benutzer",
"Collect voters email": "Sammeln der E-Mail-Adressen der Benutzer",
"Customize the URL": "Link anpassen",
"Email addresses are collected but not required": "E-Mail-Adressen werden gesammelt aber sind nicht benötigt",
"Email addresses are not collected": "E-Mail-Adressen werden nicht gesammelt",
"Email addresses are required": "E-Mail-Adressen werden benötigt",
"Email addresses are required and verified": "E-Mail-Adressen werden benötigt und überprüft",
"Go to step 2": "Weiter zum 2. Schritt",
"Limit the amount of voters per option": "Anzahl der Stimmen pro Option begrenzen",
"More informations here:": "Weitere Informationen gibt es hier:",
@ -350,12 +391,14 @@
"The results are publicly visible": "Die Ergebnisse sind öffentlich einsehbar",
"To make the description more attractive, you can use the Markdown format.": "Sie können das Markdown Format nutzen um die Beschreibung attraktiver zu gestalten.",
"To receive an email for each new comment": "Bei jedem neuen Kommentar eine E-Mail erhalten",
"To receive an email for each new vote": "Bei jeder neuen Wertung eine E-Mail erhalten",
"Use a password to restrict access": "Verwende ein Passwort um den Zugriff zu beschänken",
"To receive an email for each new vote": "Bei jeder neuen Stimme eine E-Mail erhalten",
"Use a password to restrict access": "Ein Passwort verwenden um den Zugriff zu beschränken",
"Value Max": "Wert Max",
"ValueMax instructions": "Stimmen pro Option",
"Voters can modify their vote themselves": "Teilnehmer können ihre Wertungen verändern",
"Votes cannot be modified": "Wertungen können nicht verändert werden",
"Voters can modify their vote themselves": "Teilnehmer können ihre Stimmen verändern",
"Votes cannot be modified": "Stimmen können nicht verändert werden",
"Warning : anyone can access to the polled users's email addresses.": "Achtung: Jeder kann die E-Mail-Adressen der zur Umfrage eingeladenen Benutzer sehen.",
"Warning: anyone can access the polled users email addresses since all voters can modify any vote. You should restrict permission rules.": "Achtung: Jeder kann die E-Mail-Adressen der zur Umfrage eingeladenen Benutzer sehen da jeder Wähler jede Stimme verändern kann. Sie sollten die Zugriffsrechte beschränken.",
"You are in the poll creation section.": "Hier erstellen Sie die Umfrage",
"You can enable or disable the editor at will.": "Sie können den Editor nach Belieben ein- und wieder ausschalten."
},
@ -371,7 +414,7 @@
"Poll subjects (2 on 3)": "Umfrageoptionen (2 von 3)",
"Remove a choice": "Eine Auswahlmöglichkeit entfernen",
"These fields are optional. You can add a link, an image or both.": "Diese Felder sind optional. Sie können einen Link, ein Bild oder beides hinzufügen.",
"To make a generic poll you need to propose at least two choices between differents subjects.": "Um eine gewöhnliche Umfrage zu erstellen, müssen Sie mindestens zwei Alternativen zur Auswahl stellen.",
"To make a generic poll you need to propose at least two choices between differents subjects.": "Beim Erstellen einer Umfrage müssen mindestens zwei Alternativen zur Auswahl gestellt werden.",
"URL of the image": "URL des Bildes",
"You can add or remove additional choices with the buttons": "Um Auswahlmöglichkeiten hinzuzufügen oder zu entfernen, verwenden Sie die Buttons",
"the Markdown syntax": "Markdown Syntax"
@ -379,7 +422,7 @@
"Step 2 date": {
"Add a day": "Einen Tag hinzufügen",
"Add an hour": "Eine Uhrzeit hinzufügen",
"Choose the dates of your poll": "Machen Sie Terminvorschläge für Ihre Umfrage",
"Choose the dates of your poll": "Terminvorschläge für Ihre Umfrage machen",
"Copy hours of the first day": "Uhrzeiten des ersten Tags kopieren",
"For each selected day, you can choose, or not, meeting hours (e.g.: \"8h\", \"8:30\", \"8h-10h\", \"evening\", etc.)": "Für jeden ausgewählten Tag können Sie fakultativ Uhrzeiten vorschlagen (z. B.: \"8h\", \"8:30\", \"8h-10h\", \"abends\", usw.)",
"Poll dates (2 on 3)": "Umfragedaten (2 von 3)",
@ -389,7 +432,7 @@
"Remove an hour": "Eine Uhrzeit entfernen",
"Remove this day": "Diesen Tag entfernen",
"To schedule an event you need to propose at least two choices (two hours for one day or two days).": "Um eine Terminabsprache zu konfigurieren, müssen Sie mindestens zwei alternative Zeitpunkte vorschlagen (zwei Uhrzeiten am gleichen Tag oder verschiedene Tage).",
"You can add or remove additionnal days and hours with the buttons": "Sie können weitere Tage und Uhrzeiten über diesen Button hinzufügen oder entfernen"
"You can add or remove additionnal days and hours with the buttons": "Sie können weitere Tage und Uhrzeiten über die Buttons hinzufügen oder entfernen"
},
"Step 3": {
"Archiving date:": "Tag der Archivierung:",
@ -412,6 +455,8 @@
"As poll administrator, you can change all the lines of this poll with this button": "Als Administrator der Umfrage können Sie alle Zeilen der Umfrage über diesen Button ändern",
"Back to the poll": "Zurück zur Umfrage",
"Choice added": "Option hinzugefügt",
"Collect the emails of the polled users for the choice": "Sammeln der E-Mail-Adressen der zur Abstimmung eingeladenen Benutzer für die Auswahl",
"Collect the emails of the polled users for this column": "Sammeln der E-Mail-Adressen der zur Umfrage eingeladenen Benutzer dieser Spalte",
"Column removed": "Spalte entfernt",
"Column's adding": "Spalte hinzufügen",
"Comment deleted": "Kommentar gelöscht",
@ -427,12 +472,12 @@
"Keep the poll": "Umfrage beibehalten",
"Keep the votes": "Wertungen beibehalten",
"Keep this poll": "Diese Umfrage beibehalten",
"Keep votes": "Wertungen beibehalten",
"Keep votes": "Stimmabgaben beibehalten",
"Poll fully deleted": "Umfrage vollständig gelöscht",
"Poll saved": "Umfrage gespeichert",
"Remove the column": "Spalte entfernen",
"Remove the comments": "Kommentare entfernen",
"Remove the votes": "Entfernen Sie die Stimmen",
"Remove the votes": "Stimmen entfernen",
"The poll is created.": "Die Umfrage wurde erstellt.",
"Vote added": "Stimme hinzugefügt",
"Vote deleted": "Stimme gelöscht",
@ -442,13 +487,21 @@
"and add a new column with": "und neue Spalte hinzufügen mit",
"remove a column or a line with": "Zeile oder Spalte entfernen mit"
},
"display_mails": {
"People who have answered 'If need be' to this option have left those email addresses :": "E-Mail-Adressen aller Benutzer, die mit \"Ja - unter Vorbehalt\" für diese Option abgestimmt haben:",
"People who have answered 'If need be' to this option have not left any email addresses.": "Benutzer, die mit \"Ja - unter Vorbehalt\" für diese Option abgestimmt haben, haben keine E-Mail-Adresse angegeben.",
"People who have answered 'No' to this option have left those email addresses :": "E-Mail-Adressen aller Benutzer, die mit \"Nein\" für diese Option abgestimmt haben:",
"People who have answered 'No' to this option have not left any email addresses.": "Benutzer, die mit \"Nein\" für diese Option abgestimmt haben, haben keine E-Mail-Adresse angegeben.",
"People who have answered 'Yes' to this option have left those email addresses :": "E-Mail-Adressen aller Benutzer, die mit \"Ja\" für diese Option abgestimmt haben:",
"People who have answered 'Yes' to this option have not left any email addresses.": "Benutzer, die mit \"Ja\" für diese Option abgestimmt haben, haben keine E-Mail-Adresse angegeben."
},
"studs": {
"Adding the vote succeeded": "Die Wertung wurde hinzugefügt",
"Adding the vote succeeded": "Die Stimme wurde hinzugefügt",
"Deletion date:": "Löschdatum:",
"If you want to vote in this poll, you have to give your name, choose the values that fit best for you and validate with the plus button at the end of the line.": "Wenn Sie an dieser Umfrage teilnehmen möchten, müssen Sie ihren Namen angeben, die Auswahl treffen, die Ihnen am ehesten zusagt und mit dem Plus-Button am Ende der Zeile bestätigen.",
"POLL_LOCKED_WARNING": "Die Abstimmung wurde vom Administrator gesperrt. Bewertungen und Kommentare werden eingefroren; es ist nicht mehr möglich teilzunehmen",
"If you want to vote in this poll, you have to give your name, choose the values that fit best for you and validate with the plus button at the end of the line.": "Wenn Sie an dieser Umfrage teilnehmen möchten, müssen Sie ihren Namen angeben, die Auswahl treffen, die Ihnen am ehesten zusagt und mit dem Speichern-Button am Ende der Zeile bestätigen.",
"POLL_LOCKED_WARNING": "Die Abstimmung wurde vom Administrator gesperrt. Bewertungen und Kommentare wurden eingefroren; es ist nicht mehr möglich teilzunehmen",
"The poll is expired, it will be deleted soon.": "Der Zeitraum für die Umfrage ist überschritten, sie wird bald gelöscht werden.",
"Update vote succeeded": "Die Wertung wurde geändert",
"Update vote succeeded": "Die Stimme wurde geändert",
"Your vote has been registered successfully, but be careful: regarding this poll options, you need to keep this personal link to edit your own vote:": "Ihre Stimme wurde gezählt, aber beachten Sie, dass diese Umfrage die nachträgliche Änderung Ihrer Wertung nur über den nachfolgend genannten, personalisierten Link erlaubt; verwahren Sie ihn an einem sicheren Ort!"
}
}

View File

@ -31,8 +31,9 @@
"Back to administration": "Back to administration",
"Change the poll": "Change the poll",
"Confirm removal of the poll": "Confirm removal of the poll ",
"Deleted the poll": "Deleted the poll",
"Deleted the poll": "Poll deleted",
"Email": "Email",
"Executed": "Executed",
"Expiration date": "Expiry date",
"Fail": "Fail",
"Failed:": "Failed:",
@ -49,11 +50,13 @@
"Purged:": "Purged:",
"See the poll": "See the poll",
"Skipped:": "Skipped:",
"Status": "Status",
"Succeeded:": "Succeeded:",
"Success": "Success",
"Summary": "Summary",
"Title": "Title",
"Votes": "Votes",
"Waiting": "Waiting",
"polls in the database at this time": "polls in the database at this time"
},
"Check": {
@ -83,8 +86,9 @@
"Comments of polled people": "Comments",
"Remove the comment": "Remove comment",
"Send the comment": "Submit comment",
"Type your name and a comment to send it": "Enter your name and comment prior to submitting the form",
"Your comment": "Comment",
"anonyme": "anonyme"
"anonyme": "anonymous"
},
"Date": {
"Add range dates": "Add range dates",
@ -104,7 +108,7 @@
"EditLink": {
"Edit link for poll \"%s\"": "Edit link for poll \"%s\"",
"Here is the link for editing your vote:": "Here is the link for editing your vote:",
"If you don't want to lose your personalized link, we can send it to your email.": "If you don't want to lose your personalized link, we can send it to your email.",
"If you don't want to lose your personalized link, we can send it to your email.": "If you don't want to lose your personalized link, we can send it to you by email.",
"Please wait %d seconds before we can send an email to you then try again.": "Please wait %d seconds before we can send an email to you then try again.",
"REMINDER": "REMINDER",
"Send": "Send",
@ -122,7 +126,7 @@
"Enter a name and a comment!": "Enter a name and a comment!",
"Enter a title": "Enter a title",
"Enter an email address": "Enter an email address",
"Error on amount of voters limitation : value must be an integer greater than 0": "Error on amount of voters limitation: Value must be an integer greater than 0",
"Error on amount of voters limitation : value must be an integer greater than 0": "Error on amount of votes limitation: Value must be an integer greater than 0",
"Error!": "Error!",
"Failed to delete all comments": "Failed to delete all comments",
"Failed to delete all votes": "Failed to delete all votes",
@ -150,23 +154,39 @@
"The name is invalid.": "The name is invalid.",
"The name you've chosen already exist in this poll!": "The name you've chosen already exists in this poll!",
"There is a problem with your choices": "There is a problem with your choices",
"This id is not allowed": "This id is not allowed",
"This id is not allowed": "This identifier is not allowed",
"This poll doesn't exist !": "This poll doesn't exist!",
"Update vote failed": "Update vote failed",
"You already voted": "You already voted",
"You can't create a poll with hidden results with the following edition option:": "You can't create a poll with hidden results with the following option: ",
"You can't select more than %d dates": "You can't select more than %d dates",
"You haven't filled the first section of the poll creation, or your session has expired.": "You haven't filled the first section of the poll creation, or your session has expired.",
"You haven't filled the first section of the poll creation.": "You haven't filled in the first section of the poll.",
"Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry.": "Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry."
},
"FindPolls": {
"Address": "Address",
"Created polls": "Created polls",
"Have a good day!": "Have a good day!",
"Here is the list of the polls that you manage on %s:": "Here is the list of the polls that you manage on %s:",
"If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.": "If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.",
"If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.": "If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator at %s.",
"Last access date": "Last access date",
"List of your polls": "List of your polls",
"Local Storage Help": "To help you find your previous polls, we save each poll you create or access inside your browser. This data is saved inside this browser only. The following data will be saved:",
"Local Storage Help Delete": "To delete this data click the trashcan on the according line or click the « delete my polls index » option. This won't delete your polls.",
"Local Storage Help Information Accessed": "The date you created or last accessed the poll",
"Local Storage Help Information Address": "It's address",
"Local Storage Help Information Title": "The title of the poll",
"PS: this email has been sent because you or someone else asked to get back the polls created with your email address.": "PS: this email has been sent because you or someone else asked to get back the polls created with your email address.",
"Polls saved inside this browser": "Polls saved inside this browser",
"Polls sent": "Polls sent",
"Send me my polls": "Send me my polls"
"Remove all polls from this browser": "Remove all my polls from this browser's index",
"Remove poll from index": "Remove poll from index",
"Send me my polls": "Send me my polls",
"Send my polls by email": "Send my polls by email",
"There are no polls saved inside your browser yet": "There are no polls saved inside your browser yet",
"Title": "Title",
"Visited polls": "Visited polls"
},
"Generic": {
"(in the format name@mail.com)": "(in the format name@mail.com)",
@ -175,7 +195,7 @@
"Back": "Back",
"Back to the homepage of": "Back to the homepage of",
"Cancel": "Cancel",
"Caption": "Caption",
"Caption": "Information",
"Choice": "Choice",
"Classic": "Classic",
"Close": "Close",
@ -189,7 +209,7 @@
"Ifneedbe": "Under reserve",
"Legend:": "Legend:",
"Link": "Link",
"Make your polls": "Make your polls",
"Make your polls": "Create your own polls",
"Markdown": "Markdown",
"Next": "Next",
"No": "No",
@ -221,8 +241,11 @@
"AppName": "Application name",
"CleanUrl": "Clean URL",
"Database": "Database name",
"DbConnectionString": "Connection string",
"DbDriver": "Database driver",
"DbHost": "Database hostname",
"DbName": "Database name",
"DbPassword": "Password",
"DbPort": "Database port",
"DbPrefix": "Prefix",
"DbUser": "User",
"DefaultLanguage": "Default language",
@ -236,17 +259,17 @@
"Select the language": "Select language"
},
"Mail": {
"Author's message": "Author's message",
"Author's message": "Message for the author",
"FOOTER": "\"The road is long, but the way is clear…\"<br/>Framasoft lives only by your donations.<br/>Thank you in advance for your support https://soutenir.framasoft.org",
"For sending to the polled users": "Participant link",
"Notification of poll: %s": "Notification of poll: %s",
"Poll's participation: %s": "Poll participation: %s",
"Someone just change your poll available at the following link %s.": "Someone just changed your poll at the following link <a href=\"%1$s\">%1$s</a>.",
"Someone just delete your poll %s.": "Someone just deleted your poll \"%s\".",
"Thanks for filling the poll at the link above": "Please fill in the poll at the link above",
"Thanks for filling the poll at the link above": "Thank you for participating in the poll at the following link",
"Thanks for your trust.": "Thank you for your trust.",
"This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.": "This is the message to forward to the poll participants.",
"This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above": "This message should NOT be sent to the poll participants. You should keep it private. <br/><br/>You can modify your poll at the link above",
"This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above": "This message should NOT be sent to the poll participants. You should keep it private. <br/><br/>You can modify your poll at the following link",
"You have changed the settings of your poll. \nYou can modify this poll with this link": "You have changed the settings of your poll.<br/>You can modify this poll with this link",
"[ADMINISTRATOR] New settings for your poll": "[ADMINISTRATOR] New settings for your poll",
"filled a vote.\nYou can find your poll at the link": "added a vote.<br/>You can visit your poll at the link",
@ -267,7 +290,9 @@
"You have to provide a password to access the poll.": "You have to provide a password to access the poll."
},
"Poll results": {
"%s option": "%s option",
"Addition": "Total",
"Anyone will be able to access your email address after your vote": "Anyone will be able to see your email address after you voted",
"Best choice": "Best choice",
"Best choices": "Best choices",
"Chart": "Chart",
@ -281,10 +306,11 @@
"Scroll to the right": "Scroll to the right",
"The best choice at this time is:": "The current best choice is:",
"The bests choices at this time are:": "The current best choices are:",
"Vote ifneedbe for": "Vote under reserve for",
"Vote ifneedbe for": "Votes under reserve for",
"Vote no for": "Vote \"no\" for",
"Vote yes for": "Vote \"yes\" for",
"Votes of the poll": "Votes",
"Warning : anyone can access to your email address after voting": "Warning: Anyone can see your email address after voting",
"polled user": "polled user",
"polled users": "polled users"
},
@ -296,6 +322,8 @@
"Cancel the name edit": "Cancel the name edit",
"Cancel the rules edit": "Cancel the rules edit",
"Cancel the title edit": "Cancel the title edit",
"Collect of the polled users email addresses": "Collec the polled users' email addresses",
"Collecting the polled users emails": "Collecting the polled users email addresses",
"Edit the description": "Edit the description",
"Edit the email adress": "Edit the email address",
"Edit the expiration date": "Edit the expiry date",
@ -306,6 +334,7 @@
"Expiration date": "Expiry date",
"Export to CSV": "Export to CSV",
"Initiator of the poll": "Creator of the poll",
"No collect of the polled users email addresses": "The polled users' email addresses are not collected",
"No password": "No password",
"Only votes are protected": "Only votes are protected",
"Password protected": "Password protected",
@ -327,12 +356,23 @@
"Save the new title": "Save the new title",
"Simple editor": "Simple editor",
"Title": "Title of the poll",
"Voters email adresses are collected": "Voters' email adresses are collected",
"Voters email adresses are collected and required": "Voters' email adresses are collected and required",
"Voters email adresses are collected, required and verified": "Voters' email adresses are collected, required and verified",
"Voters email adresses are not collected": "Voters' email adresses are not collected",
"Votes and comments are locked": "Votes and comments are locked",
"Votes protected by password": "Votes protected by password"
},
"Step 1": {
"All voters can modify any vote": "All voters can modify any vote",
"Collect the polled users email addresses": "Collecting the polled users' email addresses",
"Collect users email": "Collect users' email addresses",
"Collect voters email": "Collect voters' email addresses",
"Customize the URL": "Customize the URL",
"Email addresses are collected but not required": "Email addresses are collected but not required",
"Email addresses are not collected": "Email addresses are not collected",
"Email addresses are required": "Email addresses are required",
"Email addresses are required and verified": "Email addresses are required and verified",
"Go to step 2": "Go to step 2",
"Limit the amount of voters per option": "Limit the amount of voters per option",
"More informations here:": "More informations here:",
@ -354,9 +394,11 @@
"To receive an email for each new vote": "Receive an email for each new vote",
"Use a password to restrict access": "Use a password to restrict access",
"Value Max": "Value Max",
"ValueMax instructions": "voters per options ",
"ValueMax instructions": "votes per option",
"Voters can modify their vote themselves": "Voters can modify their vote themselves",
"Votes cannot be modified": "Votes cannot be modified",
"Warning : anyone can access to the polled users's email addresses.": "Warning: Anyone can see the polled users' email addresses.",
"Warning: anyone can access the polled users email addresses since all voters can modify any vote. You should restrict permission rules.": "Warning: Anyone can see the polled users' email addresses since all voters can modify any vote. You should restrict permission rules.",
"You are in the poll creation section.": "You are in the poll creation section.",
"You can enable or disable the editor at will.": "You can enable or disable the editor at will."
},
@ -413,6 +455,8 @@
"As poll administrator, you can change all the lines of this poll with this button": "As poll administrator, you can change all the lines of this poll with this button",
"Back to the poll": "Back to the poll",
"Choice added": "Choice added",
"Collect the emails of the polled users for the choice": "Collect the emails of the polled users for the choice",
"Collect the emails of the polled users for this column": "Collect the email addresses of the polled users for this column",
"Column removed": "Column deleted",
"Column's adding": "Adding a column",
"Comment deleted": "Comment deleted",
@ -420,7 +464,7 @@
"Confirm removal of all votes of the poll": "Confirm removal of all votes",
"Confirm removal of the column.": "Confirm removal of the column.",
"Confirm removal of the poll": "Confirm removal of your poll",
"Delete the poll": "Delete the poll",
"Delete the poll": "Delete poll",
"Finally, you can change the informations of this poll like the title, the comments or your email address.": "Finally, you can change the properties of this poll such as the title, the comments or your email address.",
"If you just want to add a new hour to an existant date, put the same date and choose a new hour.": "If you just want to add a new time slot to an existing date, add that date here and choose a new time slot.",
"Keep comments": "Keep comments",
@ -443,10 +487,18 @@
"and add a new column with": "and add a new column with",
"remove a column or a line with": "remove a column or a line with"
},
"display_mails": {
"People who have answered 'If need be' to this option have left those email addresses :": "Users who voted 'If need be' for this option have left those email addresses:",
"People who have answered 'If need be' to this option have not left any email addresses.": "Users who voted 'If need be' for this option have not left any email addresses:",
"People who have answered 'No' to this option have left those email addresses :": "Users who voted 'No' for this option have left those email addresses:",
"People who have answered 'No' to this option have not left any email addresses.": "Users who voted 'No' for this option have not left any email addresses.",
"People who have answered 'Yes' to this option have left those email addresses :": "Users who voted 'Yes' for this option have left those email addresses:",
"People who have answered 'Yes' to this option have not left any email addresses.": "Users who voted 'Yes' for this option have not left any email addresses."
},
"studs": {
"Adding the vote succeeded": "Vote added",
"Deletion date:": "Deletion date:",
"If you want to vote in this poll, you have to give your name, choose the values that fit best for you and validate with the plus button at the end of the line.": "If you want to vote in this poll, you have to give your name, make your choice, and submit it with the plus button at the end of the line.",
"If you want to vote in this poll, you have to give your name, choose the values that fit best for you and validate with the plus button at the end of the line.": "If you want to vote in this poll, you have to give your name, make your choice, and submit it by selecting the save button at the end of the line.",
"POLL_LOCKED_WARNING": "The administrator locked this poll. Votes and comments are frozen, it is no longer possible to participate",
"The poll is expired, it will be deleted soon.": "The poll has expired, it will soon be deleted.",
"Update vote succeeded": "Vote updated",

View File

@ -31,8 +31,9 @@
"Back to administration": "Back to administration",
"Change the poll": "Change the poll",
"Confirm removal of the poll": "Confirm removal of the poll ",
"Deleted the poll": "Deleted the poll",
"Deleted the poll": "Poll deleted",
"Email": "Email",
"Executed": "Executed",
"Expiration date": "Expiry date",
"Fail": "Fail",
"Failed:": "Failed:",
@ -49,11 +50,13 @@
"Purged:": "Purged:",
"See the poll": "See the poll",
"Skipped:": "Skipped:",
"Status": "Status",
"Succeeded:": "Succeeded:",
"Success": "Success",
"Summary": "Summary",
"Title": "Title",
"Votes": "Votes",
"Waiting": "Waiting",
"polls in the database at this time": "polls in the database at this time"
},
"Check": {
@ -83,8 +86,9 @@
"Comments of polled people": "Comments",
"Remove the comment": "Remove comment",
"Send the comment": "Submit comment",
"Type your name and a comment to send it": "Enter your name and comment prior to submitting the form",
"Your comment": "Comment",
"anonyme": "anonyme"
"anonyme": "anonymous"
},
"Date": {
"Add range dates": "Add range dates",
@ -104,7 +108,7 @@
"EditLink": {
"Edit link for poll \"%s\"": "Edit link for poll \"%s\"",
"Here is the link for editing your vote:": "Here is the link for editing your vote:",
"If you don't want to lose your personalized link, we can send it to your email.": "If you don't want to lose your personalized link, we can send it to your email.",
"If you don't want to lose your personalized link, we can send it to your email.": "If you don't want to lose your personalized link, we can send it to you by email.",
"Please wait %d seconds before we can send an email to you then try again.": "Please wait %d seconds before we can send an email to you then try again.",
"REMINDER": "REMINDER",
"Send": "Send",
@ -122,7 +126,7 @@
"Enter a name and a comment!": "Enter a name and a comment!",
"Enter a title": "Enter a title",
"Enter an email address": "Enter an email address",
"Error on amount of voters limitation : value must be an integer greater than 0": "Error on amount of voters limitation: Value must be an integer greater than 0",
"Error on amount of voters limitation : value must be an integer greater than 0": "Error on amount of votes limitation: Value must be an integer greater than 0",
"Error!": "Error!",
"Failed to delete all comments": "Failed to delete all comments",
"Failed to delete all votes": "Failed to delete all votes",
@ -150,22 +154,39 @@
"The name is invalid.": "The name is invalid.",
"The name you've chosen already exist in this poll!": "The name you've chosen already exists in this poll!",
"There is a problem with your choices": "There is a problem with your choices",
"This id is not allowed": "This identifier is not allowed",
"This poll doesn't exist !": "This poll doesn't exist!",
"Update vote failed": "Update vote failed",
"You already voted": "You already voted",
"You can't create a poll with hidden results with the following edition option:": "You can't create a poll with hidden results with the following option: ",
"You can't select more than %d dates": "You can't select more than %d dates",
"You haven't filled the first section of the poll creation, or your session has expired.": "You haven't filled the first section of the poll creation, or your session has expired.",
"You haven't filled the first section of the poll creation.": "You haven't filled in the first section of the poll.",
"Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry.": "Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry."
},
"FindPolls": {
"Address": "Address",
"Created polls": "Created polls",
"Have a good day!": "Have a good day!",
"Here is the list of the polls that you manage on %s:": "Here is the list of the polls that you manage on %s:",
"If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.": "If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.",
"If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.": "If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator at %s.",
"Last access date": "Last access date",
"List of your polls": "List of your polls",
"Local Storage Help": "To help you find your previous polls, we save each poll you create or access inside your browser. This data is saved inside this browser only. The following data will be saved:",
"Local Storage Help Delete": "To delete this data click the trashcan on the according line or click the « delete my polls index » option. This won't delete your polls.",
"Local Storage Help Information Accessed": "The date you created or last accessed the poll",
"Local Storage Help Information Address": "It's address",
"Local Storage Help Information Title": "The title of the poll",
"PS: this email has been sent because you or someone else asked to get back the polls created with your email address.": "PS: this email has been sent because you or someone else asked to get back the polls created with your email address.",
"Polls saved inside this browser": "Polls saved inside this browser",
"Polls sent": "Polls sent",
"Send me my polls": "Send me my polls"
"Remove all polls from this browser": "Remove all my polls from this browser's index",
"Remove poll from index": "Remove poll from index",
"Send me my polls": "Send me my polls",
"Send my polls by email": "Send my polls by email",
"There are no polls saved inside your browser yet": "There are no polls saved inside your browser yet",
"Title": "Title",
"Visited polls": "Visited polls"
},
"Generic": {
"(in the format name@mail.com)": "(in the format name@mail.com)",
@ -174,7 +195,7 @@
"Back": "Back",
"Back to the homepage of": "Back to the homepage of",
"Cancel": "Cancel",
"Caption": "Caption",
"Caption": "Information",
"Choice": "Choice",
"Classic": "Classic",
"Close": "Close",
@ -188,7 +209,7 @@
"Ifneedbe": "Under reserve",
"Legend:": "Legend:",
"Link": "Link",
"Make your polls": "Make your polls",
"Make your polls": "Create your own polls",
"Markdown": "Markdown",
"Next": "Next",
"No": "No",
@ -220,8 +241,11 @@
"AppName": "Application name",
"CleanUrl": "Clean URL",
"Database": "Database name",
"DbConnectionString": "Connection string",
"DbDriver": "Database driver",
"DbHost": "Database hostname",
"DbName": "Database name",
"DbPassword": "Password",
"DbPort": "Database port",
"DbPrefix": "Prefix",
"DbUser": "User",
"DefaultLanguage": "Default language",
@ -235,17 +259,17 @@
"Select the language": "Select language"
},
"Mail": {
"Author's message": "Author's message",
"Author's message": "Message for the author",
"FOOTER": "\"The road is long, but the way is clear…\"<br/>Framasoft lives only by your donations.<br/>Thank you in advance for your support https://soutenir.framasoft.org",
"For sending to the polled users": "Participant link",
"Notification of poll: %s": "Notification of poll: %s",
"Poll's participation: %s": "Poll participation: %s",
"Someone just change your poll available at the following link %s.": "Someone just changed your poll at the following link <a href=\"%1$s\">%1$s</a>.",
"Someone just delete your poll %s.": "Someone just deleted your poll \"%s\".",
"Thanks for filling the poll at the link above": "Please fill in the poll at the link above",
"Thanks for filling the poll at the link above": "Thank you for participating in the poll at the following link",
"Thanks for your trust.": "Thank you for your trust.",
"This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.": "This is the message to forward to the poll participants.",
"This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above": "This message should NOT be sent to the poll participants. You should keep it private. <br/><br/>You can modify your poll at the link above",
"This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above": "This message should NOT be sent to the poll participants. You should keep it private. <br/><br/>You can modify your poll at the following link",
"You have changed the settings of your poll. \nYou can modify this poll with this link": "You have changed the settings of your poll.<br/>You can modify this poll with this link",
"[ADMINISTRATOR] New settings for your poll": "[ADMINISTRATOR] New settings for your poll",
"filled a vote.\nYou can find your poll at the link": "added a vote.<br/>You can visit your poll at the link",
@ -266,7 +290,9 @@
"You have to provide a password to access the poll.": "You have to provide a password to access the poll."
},
"Poll results": {
"%s option": "%s option",
"Addition": "Total",
"Anyone will be able to access your email address after your vote": "Anyone will be able to see your email address after you voted",
"Best choice": "Best choice",
"Best choices": "Best choices",
"Chart": "Chart",
@ -280,10 +306,11 @@
"Scroll to the right": "Scroll to the right",
"The best choice at this time is:": "The current best choice is:",
"The bests choices at this time are:": "The current best choices are:",
"Vote ifneedbe for": "Vote under reserve for",
"Vote ifneedbe for": "Votes under reserve for",
"Vote no for": "Vote \"no\" for",
"Vote yes for": "Vote \"yes\" for",
"Votes of the poll": "Votes",
"Warning : anyone can access to your email address after voting": "Warning: Anyone can see your email address after voting",
"polled user": "polled user",
"polled users": "polled users"
},
@ -295,6 +322,8 @@
"Cancel the name edit": "Cancel the name edit",
"Cancel the rules edit": "Cancel the rules edit",
"Cancel the title edit": "Cancel the title edit",
"Collect of the polled users email addresses": "Collec the polled users' email addresses",
"Collecting the polled users emails": "Collecting the polled users email addresses",
"Edit the description": "Edit the description",
"Edit the email adress": "Edit the email address",
"Edit the expiration date": "Edit the expiry date",
@ -305,6 +334,7 @@
"Expiration date": "Expiry date",
"Export to CSV": "Export to CSV",
"Initiator of the poll": "Creator of the poll",
"No collect of the polled users email addresses": "The polled users' email addresses are not collected",
"No password": "No password",
"Only votes are protected": "Only votes are protected",
"Password protected": "Password protected",
@ -326,12 +356,23 @@
"Save the new title": "Save the new title",
"Simple editor": "Simple editor",
"Title": "Title of the poll",
"Voters email adresses are collected": "Voters' email adresses are collected",
"Voters email adresses are collected and required": "Voters' email adresses are collected and required",
"Voters email adresses are collected, required and verified": "Voters' email adresses are collected, required and verified",
"Voters email adresses are not collected": "Voters' email adresses are not collected",
"Votes and comments are locked": "Votes and comments are locked",
"Votes protected by password": "Votes protected by password"
},
"Step 1": {
"All voters can modify any vote": "All voters can modify any vote",
"Collect the polled users email addresses": "Collecting the polled users' email addresses",
"Collect users email": "Collect users' email addresses",
"Collect voters email": "Collect voters' email addresses",
"Customize the URL": "Customize the URL",
"Email addresses are collected but not required": "Email addresses are collected but not required",
"Email addresses are not collected": "Email addresses are not collected",
"Email addresses are required": "Email addresses are required",
"Email addresses are required and verified": "Email addresses are required and verified",
"Go to step 2": "Go to step 2",
"Limit the amount of voters per option": "Limit the amount of voters per option",
"More informations here:": "More informations here:",
@ -353,9 +394,11 @@
"To receive an email for each new vote": "Receive an email for each new vote",
"Use a password to restrict access": "Use a password to restrict access",
"Value Max": "Value Max",
"ValueMax instructions": "voters per options ",
"ValueMax instructions": "votes per option",
"Voters can modify their vote themselves": "Voters can modify their vote themselves",
"Votes cannot be modified": "Votes cannot be modified",
"Warning : anyone can access to the polled users's email addresses.": "Warning: Anyone can see the polled users' email addresses.",
"Warning: anyone can access the polled users email addresses since all voters can modify any vote. You should restrict permission rules.": "Warning: Anyone can see the polled users' email addresses since all voters can modify any vote. You should restrict permission rules.",
"You are in the poll creation section.": "You are in the poll creation section.",
"You can enable or disable the editor at will.": "You can enable or disable the editor at will."
},
@ -412,6 +455,8 @@
"As poll administrator, you can change all the lines of this poll with this button": "As poll administrator, you can change all the lines of this poll with this button",
"Back to the poll": "Back to the poll",
"Choice added": "Choice added",
"Collect the emails of the polled users for the choice": "Collect the emails of the polled users for the choice",
"Collect the emails of the polled users for this column": "Collect the email addresses of the polled users for this column",
"Column removed": "Column deleted",
"Column's adding": "Adding a column",
"Comment deleted": "Comment deleted",
@ -419,7 +464,7 @@
"Confirm removal of all votes of the poll": "Confirm removal of all votes",
"Confirm removal of the column.": "Confirm removal of the column.",
"Confirm removal of the poll": "Confirm removal of your poll",
"Delete the poll": "Delete the poll",
"Delete the poll": "Delete poll",
"Finally, you can change the informations of this poll like the title, the comments or your email address.": "Finally, you can change the properties of this poll such as the title, the comments or your email address.",
"If you just want to add a new hour to an existant date, put the same date and choose a new hour.": "If you just want to add a new time slot to an existing date, add that date here and choose a new time slot.",
"Keep comments": "Keep comments",
@ -442,10 +487,18 @@
"and add a new column with": "and add a new column with",
"remove a column or a line with": "remove a column or a line with"
},
"display_mails": {
"People who have answered 'If need be' to this option have left those email addresses :": "Users who voted 'If need be' for this option have left those email addresses:",
"People who have answered 'If need be' to this option have not left any email addresses.": "Users who voted 'If need be' for this option have not left any email addresses:",
"People who have answered 'No' to this option have left those email addresses :": "Users who voted 'No' for this option have left those email addresses:",
"People who have answered 'No' to this option have not left any email addresses.": "Users who voted 'No' for this option have not left any email addresses.",
"People who have answered 'Yes' to this option have left those email addresses :": "Users who voted 'Yes' for this option have left those email addresses:",
"People who have answered 'Yes' to this option have not left any email addresses.": "Users who voted 'Yes' for this option have not left any email addresses."
},
"studs": {
"Adding the vote succeeded": "Vote added",
"Deletion date:": "Deletion date:",
"If you want to vote in this poll, you have to give your name, choose the values that fit best for you and validate with the plus button at the end of the line.": "If you want to vote in this poll, you have to give your name, make your choice, and submit it with the plus button at the end of the line.",
"If you want to vote in this poll, you have to give your name, choose the values that fit best for you and validate with the plus button at the end of the line.": "If you want to vote in this poll, you have to give your name, make your choice, and submit it by selecting the save button at the end of the line.",
"POLL_LOCKED_WARNING": "The administrator locked this poll. Votes and comments are frozen, it is no longer possible to participate",
"The poll is expired, it will be deleted soon.": "The poll has expired, it will soon be deleted.",
"Update vote succeeded": "Vote updated",

View File

@ -31,8 +31,9 @@
"Back to administration": "Volver a la administración",
"Change the poll": "Cambiar la encuesta",
"Confirm removal of the poll": "Confirmar la eliminación de la encuesta",
"Deleted the poll": "Borrar la encuesta",
"Deleted the poll": "Poll deleted",
"Email": "Correo electrónico",
"Executed": "Executed",
"Expiration date": "Fecha de expiración",
"Fail": "Error",
"Failed:": "Con error:",
@ -49,11 +50,13 @@
"Purged:": "Purgados:",
"See the poll": "Ver la encuesta",
"Skipped:": "Omitidos:",
"Status": "Status",
"Succeeded:": "Con éxito:",
"Success": "Éxito",
"Summary": "Resumen",
"Title": "Título",
"Title": "Title",
"Votes": "Votos",
"Waiting": "Waiting",
"polls in the database at this time": "encuestas en la base de datos a la fecha"
},
"Check": {
@ -83,8 +86,9 @@
"Comments of polled people": "Comentarios de los votantes",
"Remove the comment": "Borrar el comentario",
"Send the comment": "Enviar el comentario",
"Type your name and a comment to send it": "Enter your name and comment prior to submitting the form",
"Your comment": "Su comentario",
"anonyme": "anónimo"
"anonyme": "anonymous"
},
"Date": {
"Add range dates": "Agregar rango de fechas",
@ -104,7 +108,7 @@
"EditLink": {
"Edit link for poll \"%s\"": "Enlace para edición de encuesta \"%s\"",
"Here is the link for editing your vote:": "Este es el enlace para editar su votación:",
"If you don't want to lose your personalized link, we can send it to your email.": "Si no desea extraviar su enlace personalizado podemos enviárselo a su correo electrónico.",
"If you don't want to lose your personalized link, we can send it to your email.": "If you don't want to lose your personalized link, we can send it to you by email.",
"Please wait %d seconds before we can send an email to you then try again.": "Por favor espere %d segundos antes de que podamos enviar nuevamente un correo electrónico, y luego vuelva a intentarlo.",
"REMINDER": "RECORDATORIO",
"Send": "Enviar",
@ -122,7 +126,7 @@
"Enter a name and a comment!": "Introduzca su nombre y un comentario",
"Enter a title": "Introducza un título",
"Enter an email address": "Introduzca un correo electrónico",
"Error on amount of voters limitation : value must be an integer greater than 0": "Error en el límite en la cantidad de votantes: el valor debe ser un número entero mayor a 0",
"Error on amount of voters limitation : value must be an integer greater than 0": "Error on amount of votes limitation: Value must be an integer greater than 0",
"Error!": "¡Error!",
"Failed to delete all comments": "No se han eliminado todos los comentarios",
"Failed to delete all votes": "No se han eliminado todos los votos",
@ -150,22 +154,39 @@
"The name is invalid.": "Este nombre es invalido.",
"The name you've chosen already exist in this poll!": "El nombre que eligió ya existe en la encuesta",
"There is a problem with your choices": "Existe un problema con sus opciones",
"This id is not allowed": "This identifier is not allowed",
"This poll doesn't exist !": "Esta encuesta no existe",
"Update vote failed": "Error al actualizar el voto",
"You already voted": "Usted ya votó",
"You can't create a poll with hidden results with the following edition option:": "No puede crear una encuesta con resultados no visibles con los siguientes opciones de edición",
"You can't select more than %d dates": "No puede seleccionar más de %d fechas",
"You haven't filled the first section of the poll creation, or your session has expired.": "You haven't filled the first section of the poll creation, or your session has expired.",
"You haven't filled the first section of the poll creation.": "Usted no llenó la primera parte de la encuesta",
"Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry.": "Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry."
},
"FindPolls": {
"Address": "Address",
"Created polls": "Created polls",
"Have a good day!": "¡Que tenga un buen dia!",
"Here is the list of the polls that you manage on %s:": "Esta es la lista de encuestas que puede manejar en %s:",
"If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.": "Si usted no realizó esta acción, y cree que puede ser debido a un abuso del servicio, por favor notifique al administrador en %s.",
"If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.": "If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator at %s.",
"Last access date": "Last access date",
"List of your polls": "Listado de sus encuestas",
"Local Storage Help": "To help you find your previous polls, we save each poll you create or access inside your browser. This data is saved inside this browser only. The following data will be saved:",
"Local Storage Help Delete": "To delete this data click the trashcan on the according line or click the « delete my polls index » option. This won't delete your polls.",
"Local Storage Help Information Accessed": "The date you created or last accessed the poll",
"Local Storage Help Information Address": "It's address",
"Local Storage Help Information Title": "The title of the poll",
"PS: this email has been sent because you or someone else asked to get back the polls created with your email address.": "P.D.: Este correo electrónico se envió porque usted - o alguien más - solicitó recuperar todas las encuestas realizadas con esta dirección de corre electrónico.",
"Polls saved inside this browser": "Polls saved inside this browser",
"Polls sent": "Encuestas enviadas",
"Send me my polls": "Enviarme mis encuestas"
"Remove all polls from this browser": "Remove all my polls from this browser's index",
"Remove poll from index": "Remove poll from index",
"Send me my polls": "Enviarme mis encuestas",
"Send my polls by email": "Send my polls by email",
"There are no polls saved inside your browser yet": "There are no polls saved inside your browser yet",
"Title": "Title",
"Visited polls": "Visited polls"
},
"Generic": {
"(in the format name@mail.com)": "(en el formato nombre@correo.com)",
@ -174,7 +195,7 @@
"Back": "Volver",
"Back to the homepage of": "Retroceder al inicio de",
"Cancel": "Cancelar",
"Caption": "Leyenda",
"Caption": "Information",
"Choice": "Opción",
"Classic": "Clásico",
"Close": "Cerrar",
@ -188,7 +209,7 @@
"Ifneedbe": "En caso de ser necesario",
"Legend:": "Leyenda:",
"Link": "Enlace",
"Make your polls": "Cree sus encuestas",
"Make your polls": "Create your own polls",
"Markdown": "Markdown",
"Next": "Seguir",
"No": "No",
@ -219,9 +240,12 @@
"AppMail": "Correo electrónico del administrador",
"AppName": "Nombre de la aplicación",
"CleanUrl": "URL Limpia",
"Database": "Nombre de la base de datos",
"DbConnectionString": "'String' de conexión",
"Database": "Database name",
"DbDriver": "Database driver",
"DbHost": "Database hostname",
"DbName": "Database name",
"DbPassword": "Contraseña",
"DbPort": "Database port",
"DbPrefix": "Prefijo",
"DbUser": "Usuario",
"DefaultLanguage": "Lenguaje por defecto",
@ -235,17 +259,17 @@
"Select the language": "Elegir el idioma"
},
"Mail": {
"Author's message": "Reservado al autor",
"Author's message": "Message for the author",
"FOOTER": "\"El camino es largo, pero el camino está despejado...\"<br/>Framasoft vive sólo de sus donaciones<br/>Gracias de antemano por su apoyo https://soutenir.framasoft.org",
"For sending to the polled users": "Para difusión a los votantes",
"Notification of poll: %s": "Notificación de la encuesta: %s",
"Poll's participation: %s": "Participación a la encuesta: %s",
"Someone just change your poll available at the following link %s.": "Alguien acaba de modificar su encuesta, disponible en el siguiente enlace <a href=\"%1$s\">%1$s</a>.",
"Someone just delete your poll %s.": "Alguien acaba de borrar su encuesta \"%s\".",
"Thanks for filling the poll at the link above": "Gracias por ir a llenar la encuesta siguiendo este enlace",
"Thanks for filling the poll at the link above": "Thank you for participating in the poll at the following link",
"Thanks for your trust.": "Gracias por su confianza.",
"This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.": "Este es el mensaje que puede enviar a todos los votantes.",
"This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above": "Este mensaje NO tiene que ser difundido a los votantes. Es reservado para el autor de la encuesta.<br/><br/>Puede modificar esta encuesta en el enlace siguiente ",
"This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above": "This message should NOT be sent to the poll participants. You should keep it private. <br/><br/>You can modify your poll at the following link",
"You have changed the settings of your poll. \nYou can modify this poll with this link": "Acaba de cambiar los parámetros de su encuestra.<br/>Puede seguir modificando la encuesta siguiendo este enlace",
"[ADMINISTRATOR] New settings for your poll": "[ADMINISTRACIÓN] Cambio de configuración de la encuesta",
"filled a vote.\nYou can find your poll at the link": "acaba de votar.<br/>Puede acceder a la encuesta siguiendo este enlace",
@ -266,7 +290,9 @@
"You have to provide a password to access the poll.": "Debe ingresar una contraseña para acceder a la encuesta."
},
"Poll results": {
"%s option": "%s option",
"Addition": "Suma",
"Anyone will be able to access your email address after your vote": "Anyone will be able to see your email address after you voted",
"Best choice": "Mejor elección",
"Best choices": "Mejores elecciones",
"Chart": "Gráfico",
@ -280,10 +306,11 @@
"Scroll to the right": "Hacer desfilar hacia la derecha",
"The best choice at this time is:": "La mejor elección a la fecha es:",
"The bests choices at this time are:": "Las mejores elecciones a la fecha son:",
"Vote ifneedbe for": "Votar « si es necesario » para",
"Vote ifneedbe for": "Votes under reserve for",
"Vote no for": "Votar « no » para",
"Vote yes for": "Votar « si » para",
"Votes of the poll": "Votos de la encuesta",
"Warning : anyone can access to your email address after voting": "Warning: Anyone can see your email address after voting",
"polled user": "Votante",
"polled users": "Votantes"
},
@ -295,6 +322,8 @@
"Cancel the name edit": "Cancelar el cambio de autor",
"Cancel the rules edit": "Cancelar los cambios en las reglas",
"Cancel the title edit": "Cancelar el cambio de título",
"Collect of the polled users email addresses": "Collec the polled users' email addresses",
"Collecting the polled users emails": "Collecting the polled users email addresses",
"Edit the description": "Modificar la descripción",
"Edit the email adress": "Modificar el correo electrónico",
"Edit the expiration date": "Modificar la fecha de expiración",
@ -305,6 +334,7 @@
"Expiration date": "Fecha de expiración",
"Export to CSV": "Exportar en CSV",
"Initiator of the poll": "Autor de la encuesta",
"No collect of the polled users email addresses": "The polled users' email addresses are not collected",
"No password": "Sin contraseña",
"Only votes are protected": "Only votes are protected",
"Password protected": "Protegido por contraseña",
@ -326,12 +356,23 @@
"Save the new title": "Guardar el nuevo título",
"Simple editor": "Editor simple",
"Title": "Título de la encuesta",
"Voters email adresses are collected": "Voters' email adresses are collected",
"Voters email adresses are collected and required": "Voters' email adresses are collected and required",
"Voters email adresses are collected, required and verified": "Voters' email adresses are collected, required and verified",
"Voters email adresses are not collected": "Voters' email adresses are not collected",
"Votes and comments are locked": "Los votos y comentarios están bloqueados",
"Votes protected by password": "Votos protegidos por contraseña"
},
"Step 1": {
"All voters can modify any vote": "Los votos pueden ser modificados por cualquiera",
"Collect the polled users email addresses": "Collecting the polled users' email addresses",
"Collect users email": "Collect users' email addresses",
"Collect voters email": "Collect voters' email addresses",
"Customize the URL": "Personalizar la URL",
"Email addresses are collected but not required": "Email addresses are collected but not required",
"Email addresses are not collected": "Email addresses are not collected",
"Email addresses are required": "Email addresses are required",
"Email addresses are required and verified": "Email addresses are required and verified",
"Go to step 2": "Ir al paso número 2",
"Limit the amount of voters per option": "Limitar el número de votantes por opción",
"More informations here:": "Más información aqui:",
@ -353,9 +394,11 @@
"To receive an email for each new vote": "Recibir un correo electrónico para cada nuevo voto",
"Use a password to restrict access": "Utilice una contraseña para restringir el acceso",
"Value Max": "Valor max",
"ValueMax instructions": "votantes por opciones ",
"ValueMax instructions": "votes per option",
"Voters can modify their vote themselves": "Los votos peuden ser modificados por su autor",
"Votes cannot be modified": "Los votos no pueden ser modificados",
"Warning : anyone can access to the polled users's email addresses.": "Warning: Anyone can see the polled users' email addresses.",
"Warning: anyone can access the polled users email addresses since all voters can modify any vote. You should restrict permission rules.": "Warning: Anyone can see the polled users' email addresses since all voters can modify any vote. You should restrict permission rules.",
"You are in the poll creation section.": "Usted ha eligido crear una nueva encuesta",
"You can enable or disable the editor at will.": "Puede activar o desactivar el editor cuando lo desee."
},
@ -412,6 +455,8 @@
"As poll administrator, you can change all the lines of this poll with this button": "Como administrador, Usted puede cambiar todas las filas de la encuesta con este botón",
"Back to the poll": "Volver a la encuesta",
"Choice added": "Elección añadida",
"Collect the emails of the polled users for the choice": "Collect the emails of the polled users for the choice",
"Collect the emails of the polled users for this column": "Collect the email addresses of the polled users for this column",
"Column removed": "Columna borrado",
"Column's adding": "Añadir una columna",
"Comment deleted": "Comentario borrado",
@ -419,7 +464,7 @@
"Confirm removal of all votes of the poll": "Confirma la supresión de todos los votos de la encuesta",
"Confirm removal of the column.": "Confirmar la eliminación de la columna.",
"Confirm removal of the poll": "Confirmar la supresión de la encuesta",
"Delete the poll": "Borrar la encuesta",
"Delete the poll": "Delete poll",
"Finally, you can change the informations of this poll like the title, the comments or your email address.": "Finalmente, puede cambiar las informaciones de esta encuesta, como el título, los comentarios o la dirección de correo electrónico.",
"If you just want to add a new hour to an existant date, put the same date and choose a new hour.": "Si solo quiere añadir una nueva hora para una fecha existente, ponga la misma fecha y elija una nueva hora.",
"Keep comments": "Conservar los comentarios",
@ -442,10 +487,18 @@
"and add a new column with": "y se puede añadir una columna con",
"remove a column or a line with": "borrar una columna o una fila con"
},
"display_mails": {
"People who have answered 'If need be' to this option have left those email addresses :": "Users who voted 'If need be' for this option have left those email addresses:",
"People who have answered 'If need be' to this option have not left any email addresses.": "Users who voted 'If need be' for this option have not left any email addresses:",
"People who have answered 'No' to this option have left those email addresses :": "Users who voted 'No' for this option have left those email addresses:",
"People who have answered 'No' to this option have not left any email addresses.": "Users who voted 'No' for this option have not left any email addresses.",
"People who have answered 'Yes' to this option have left those email addresses :": "Users who voted 'Yes' for this option have left those email addresses:",
"People who have answered 'Yes' to this option have not left any email addresses.": "Users who voted 'Yes' for this option have not left any email addresses."
},
"studs": {
"Adding the vote succeeded": "Voto guardado con exíto",
"Deletion date:": "Fecha de supresión:",
"If you want to vote in this poll, you have to give your name, choose the values that fit best for you and validate with the plus button at the end of the line.": "Para participar a esta encuesta, introduzca su nombre, elija las opciones que le parezcan más adecuadas, y valide con el botón MÁS al fin de fila.",
"If you want to vote in this poll, you have to give your name, choose the values that fit best for you and validate with the plus button at the end of the line.": "If you want to vote in this poll, you have to give your name, make your choice, and submit it by selecting the save button at the end of the line.",
"POLL_LOCKED_WARNING": "La persona a cargo de la administración bloqueó esta encuesta. Los votos y comentarios están bloqueados, ya no se permite participar.",
"The poll is expired, it will be deleted soon.": "La encuesta expiró, pronto desaparecerá.",
"Update vote succeeded": "Actualización exítosa de su voto",

View File

@ -31,8 +31,9 @@
"Back to administration": "Retour à l'administration",
"Change the poll": "Modifier le sondage",
"Confirm removal of the poll": "Confirmer la suppression du sondage",
"Deleted the poll": "Supprimer le sondage",
"Deleted the poll": "Sondage complètement supprimé",
"Email": "Courriel",
"Executed": "Exécutées",
"Expiration date": "Expiration",
"Fail": "Échec",
"Failed:": "Échec :",
@ -49,11 +50,13 @@
"Purged:": "Purgés :",
"See the poll": "Voir le sondage",
"Skipped:": "Passé :",
"Status": "Statut",
"Succeeded:": "Succès :",
"Success": "Réussite",
"Summary": "Résumé",
"Title": "Titre",
"Votes": "Votes",
"Waiting": "En attente",
"polls in the database at this time": "sondages dans la base actuellement"
},
"Check": {
@ -83,6 +86,7 @@
"Comments of polled people": "Commentaires de sondé·e·s",
"Remove the comment": "Supprimer le commentaire",
"Send the comment": "Envoyer le commentaire",
"Type your name and a comment to send it": "Entrez votre nom et commentaire avant de soumettre le formulaire",
"Your comment": "Votre commentaire",
"anonyme": "anonyme"
},
@ -150,22 +154,39 @@
"The name is invalid.": "Le nom n'est pas valide.",
"The name you've chosen already exist in this poll!": "Le nom que vous avez choisi existe déjà !",
"There is a problem with your choices": "Il y a un problème avec vos choix",
"This id is not allowed": "Cet id n'est pas autorisé",
"This poll doesn't exist !": "Ce sondage n'existe pas !",
"Update vote failed": "Échec de de la mise à jour du vote",
"You already voted": "Vous avez déjà voté",
"You can't create a poll with hidden results with the following edition option:": "Vous ne pouvez pas créer de sondage avec résulats cachés avec les options d'édition suivantes : ",
"You can't select more than %d dates": "Vous ne pouvez pas choisir plus de %d dates",
"You haven't filled the first section of the poll creation, or your session has expired.": "Vous n'avez pas renseigné la première page du sondage, ou bien votre session a expiré.",
"You haven't filled the first section of the poll creation.": "Vous n'avez pas renseigné la première page du sondage",
"Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry.": "Votre vote n'a pas été pris en compte, car quelqu'un a voté entre temps et cela entre en conflit avec vos choix et les conditions du sondage. Merci de réessayer."
},
"FindPolls": {
"Address": "Adresse",
"Created polls": "Sondages créés",
"Have a good day!": "Bonne journée !",
"Here is the list of the polls that you manage on %s:": "Voici la liste des sondages que vous administrez sur %s :",
"If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.": "Si jamais vous n'étiez pas à l'origine de cette action et que vous pensez qu'il s'agit d'un abus, vous pouvez nous le signaler à l'administrateur·rice sur %s.",
"Last access date": "Date de dernier accès",
"List of your polls": "Liste de vos sondages",
"Local Storage Help": "Pour vous aider à trouver vos sondages précédents, nous enregistrons des informations sur chaque sondage que vous effectuez ou auquel vous accédez dans votre navigateur. Ces données sont sauvegardées uniquement dans votre navigateur. Les données suivantes seront enregistrées:",
"Local Storage Help Delete": "Pour supprimer ces données, cliquez sur l'icône en forme de poubelle en face de chaque ligne ou cliquez sur le bouton « Supprimer l'index de mes sondages ». Cela ne supprimera pas vos sondages.",
"Local Storage Help Information Accessed": "La date à laquelle vous avez créé ou accédé en dernier le sondage",
"Local Storage Help Information Address": "Son adresse",
"Local Storage Help Information Title": "Le titre du sondage",
"PS: this email has been sent because you or someone else asked to get back the polls created with your email address.": "PS : ce mail a été envoyé parce que vous ou quelqu'un d'autre avez demandé la récupération des sondages créés à l'aide de votre adresse email.",
"Polls saved inside this browser": "Sondages stockés dans ce navigateur",
"Polls sent": "Sondages envoyés",
"Send me my polls": "Envoyer mes sondages"
"Remove all polls from this browser": "Supprimer tous mes sondages de l'index de ce navigateur",
"Remove poll from index": "Supprimer le sondage de l'index",
"Send me my polls": "Envoyer mes sondages",
"Send my polls by email": "Envoyer mes sondages par courriel",
"There are no polls saved inside your browser yet": "Il n'y a pas encore de sondages sauvegardés dans votre navigateur",
"Title": "Titre",
"Visited polls": "Sondages accédés"
},
"Generic": {
"(in the format name@mail.com)": "(au format nom@mail.com)",
@ -188,7 +209,7 @@
"Ifneedbe": "Si nécessaire",
"Legend:": "Légende :",
"Link": "Lien",
"Make your polls": "Organiser des rendez-vous simplement, librement.",
"Make your polls": "Créez vos propres sondages",
"Markdown": "Markdown",
"Next": "Continuer",
"No": "Non",
@ -220,8 +241,11 @@
"AppName": "Nom de l'application",
"CleanUrl": "URL propres",
"Database": "Base de données",
"DbConnectionString": "Chaîne de connexion",
"DbDriver": "Pilote de la base de données",
"DbHost": "Nom d'hôte",
"DbName": "Nom de la base de données",
"DbPassword": "Mot de passe",
"DbPort": "Port de la base de données",
"DbPrefix": "Préfixe",
"DbUser": "Utilisateur·rice",
"DefaultLanguage": "Langue par défaut",
@ -266,7 +290,9 @@
"You have to provide a password to access the poll.": "Vous devez donner le mot de passe pour avoir accès à ce sondage."
},
"Poll results": {
"%s option": "%s option",
"Addition": "Somme",
"Anyone will be able to access your email address after your vote": "Tout le monde pourra accéder à votre courriel après que vous ayez voté",
"Best choice": "Meilleur choix",
"Best choices": "Meilleurs choix",
"Chart": "Graphique",
@ -284,6 +310,7 @@
"Vote no for": "Voter « non » pour",
"Vote yes for": "Voter « oui » pour",
"Votes of the poll": "Votes du sondage",
"Warning : anyone can access to your email address after voting": "Attention : Tout le monde pourra accéder à votre courriel après que vous ayez voté",
"polled user": "votant·e",
"polled users": "votant·e·s"
},
@ -295,6 +322,8 @@
"Cancel the name edit": "Annuler le changement d'auteur·rice",
"Cancel the rules edit": "Annuler le changement de permissions",
"Cancel the title edit": "Annuler le changement de titre",
"Collect of the polled users email addresses": "Collecter les courriels des votants",
"Collecting the polled users emails": "Recueil des adresses internet des sondés en cours",
"Edit the description": "Modifier la description",
"Edit the email adress": "Modifier le courriel",
"Edit the expiration date": "Modifier la date d'expiration",
@ -305,6 +334,7 @@
"Expiration date": "Date d'expiration",
"Export to CSV": "Export Tableur (CSV)",
"Initiator of the poll": "Auteur·rice du sondage",
"No collect of the polled users email addresses": "Pas de collection des courriels des votants",
"No password": "Pas de mot de passe",
"Only votes are protected": "Seul les votes sont protégés",
"Password protected": "Protégé par mot de passe",
@ -326,12 +356,23 @@
"Save the new title": "Enregistrer le nouveau titre",
"Simple editor": "Editeur simple",
"Title": "Titre du sondage",
"Voters email adresses are collected": "Les courriels des votants sont collectés",
"Voters email adresses are collected and required": "Les courriels des votants sont collectés et requis",
"Voters email adresses are collected, required and verified": "Les courriels des votants sont collectés, requis et vérifiés",
"Voters email adresses are not collected": "Les courriels des votants ne sont pas collectés",
"Votes and comments are locked": "Il n'est plus possible de voter",
"Votes protected by password": "Votes protégés par mot de passe"
},
"Step 1": {
"All voters can modify any vote": "Tou·te·s les sondé·e·s peuvent modifier tous les votes",
"Collect the polled users email addresses": "Collecte les courriels des votants",
"Collect users email": "Collecte les courriels des utilisateurs",
"Collect voters email": "Collecte les courriels des utilisateurs",
"Customize the URL": "Personnaliser le lien",
"Email addresses are collected but not required": "Les courriels sont collectés mais pas requis",
"Email addresses are not collected": "Les courriels ne sont pas collectés",
"Email addresses are required": "Les courriels sont requis",
"Email addresses are required and verified": "Les courriels sont requis et vérifiés",
"Go to step 2": "Aller à l'étape 2",
"Limit the amount of voters per option": "Limiter le nombre de votant·e·s par option",
"More informations here:": "Plus d'informations ici :",
@ -342,7 +383,7 @@
"Permissions": "Permissions",
"Poll creation (1 on 3)": "Création de sondage (1 sur 3)",
"Poll id": "Lien du sondage",
"Poll id rules": "(peut contenir des lettres, des chiffres et des tirets)",
"Poll id rules": "(peut contenir des lettres, des chiffres et des tirets \"-\")",
"Poll id warning": "La modification du lien du sondage peut faciliter l'accès à ce sondage pour des personnes non désirées. Il est recommandé de le protéger par mot de passe.",
"Poll password": "Mot de passe",
"Poll title": "Titre du sondage",
@ -353,9 +394,11 @@
"To receive an email for each new vote": "Recevoir un courriel à chaque participation",
"Use a password to restrict access": "Restreindre l'accès au sondage par mot de passe",
"Value Max": "Valeur Maximale",
"ValueMax instructions": "Votants maximum par option",
"ValueMax instructions": "votes par choix",
"Voters can modify their vote themselves": "Chaque sondé·e peut modifier son propre vote",
"Votes cannot be modified": "Aucun vote ne peut être modifié",
"Warning : anyone can access to the polled users's email addresses.": "Attention : Tout le monde pourra accéder aux courriels des votants",
"Warning: anyone can access the polled users email addresses since all voters can modify any vote. You should restrict permission rules.": "Attention : tout le monde pourra accéder aux courriels des votants car tout le monde peut éditer chaque vote. Vous devriez restreindre les règles de permission.",
"You are in the poll creation section.": "Vous avez choisi de créer un nouveau sondage.",
"You can enable or disable the editor at will.": "Vous pouvez activer ou désactiver l'éditeur à votre guise."
},
@ -412,6 +455,8 @@
"As poll administrator, you can change all the lines of this poll with this button": "En tant qu'administrateur·rice, vous pouvez modifier toutes les lignes de ce sondage avec ce bouton",
"Back to the poll": "Retour au sondage",
"Choice added": "Choix ajouté",
"Collect the emails of the polled users for the choice": "Collecter les courriels des utilisateurs pour ce choix",
"Collect the emails of the polled users for this column": "Collecter les courriels des utilisateurs pour ce choix",
"Column removed": "Colonne supprimée",
"Column's adding": "Ajout de colonne",
"Comment deleted": "Commentaire supprimé",
@ -419,7 +464,7 @@
"Confirm removal of all votes of the poll": "Confirmer la suppression de tous les votes de ce sondage",
"Confirm removal of the column.": "Confirmer la supression de cette colonne.",
"Confirm removal of the poll": "Confirmer la suppression du sondage",
"Delete the poll": "Je supprime le sondage",
"Delete the poll": "Supprimer le sondage",
"Finally, you can change the informations of this poll like the title, the comments or your email address.": "Vous pouvez enfin également modifier les informations relatives à ce sondage comme le titre, les commentaires ou encore votre courriel.",
"If you just want to add a new hour to an existant date, put the same date and choose a new hour.": "Si vous voulez juste ajouter un horaire à une date existante, mettez la même date et choisissez un autre horaire. Il sera intégré normalement au sondage existant.",
"Keep comments": "Garder les commentaires",
@ -433,7 +478,7 @@
"Remove the column": "Effacer la colonne",
"Remove the comments": "Supprimer les commentaires",
"Remove the votes": "Supprimer les votes",
"The poll is created.": "The poll was created.",
"The poll is created.": "Le sondage a été créé",
"Vote added": "Vote ajouté",
"Vote deleted": "Vote supprimé",
"Vote updated": "Vote mis à jour",
@ -442,6 +487,14 @@
"and add a new column with": "et si vous avez oublié de saisir un choix, vous pouvez rajouter une colonne en cliquant sur",
"remove a column or a line with": "effacer une colonne ou une ligne avec"
},
"display_mails": {
"People who have answered 'If need be' to this option have left those email addresses :": "Les personnes ayant ont voté « Si nécessaire » ont laissé les courriels suivants :",
"People who have answered 'If need be' to this option have not left any email addresses.": "Les personnes ayant voté « Si nécessaire » pour cette option n'ont pas laissé de courriels.",
"People who have answered 'No' to this option have left those email addresses :": "Les personnes ayant ont voté « Non » ont laissé les courriels suivants :",
"People who have answered 'No' to this option have not left any email addresses.": "Les personnes ayant voté « Non » pour cette option n'ont pas laissé de courriels.",
"People who have answered 'Yes' to this option have left those email addresses :": "Les personnes ayant ont voté « Oui » ont laissé les courriels suivants :",
"People who have answered 'Yes' to this option have not left any email addresses.": "Les personnes ayant voté « Oui » pour cette option n'ont pas laissé de courriels."
},
"studs": {
"Adding the vote succeeded": "Ajout du vote réussi",
"Deletion date:": "Date de suppression :",

View File

@ -33,6 +33,7 @@
"Confirm removal of the poll": "Confirmer la suppression du sondage",
"Deleted the poll": "Supprimer le sondage",
"Email": "Courriel",
"Executed": "Exécutées",
"Expiration date": "Expiration",
"Fail": "Échec",
"Failed:": "Échec :",
@ -49,11 +50,13 @@
"Purged:": "Purgés :",
"See the poll": "Voir le sondage",
"Skipped:": "Passé :",
"Status": "Statut",
"Succeeded:": "Succès :",
"Success": "Réussite",
"Summary": "Résumé",
"Title": "Titre",
"Votes": "Votes",
"Waiting": "En attente",
"polls in the database at this time": "sondages dans la base actuellement"
},
"Check": {
@ -83,6 +86,7 @@
"Comments of polled people": "Commentaires de sondé·e·s",
"Remove the comment": "Supprimer le commentaire",
"Send the comment": "Envoyer le commentaire",
"Type your name and a comment to send it": "Entrez votre nom et commentaire avant de soumettre le formulaire",
"Your comment": "Votre commentaire",
"anonyme": "anonyme"
},
@ -104,7 +108,7 @@
"EditLink": {
"Edit link for poll \"%s\"": "Lien d'édition du sondage \"%s\"",
"Here is the link for editing your vote:": "Voici le lien pour éditer votre vote :",
"If you don't want to lose your personalized link, we can send it to your email.": "Afin de ne pas perdre ce lien d'édition de vote, nous pouvons vous l'envoyer par courriel.",
"If you don't want to lose your personalized link, we can send it to your email.": "Si vous ne voulez pas oublier votre lien personnalisé, nous pouvons vous l'envoyer par email.",
"Please wait %d seconds before we can send an email to you then try again.": "Veuillez patienter encore %d secondes avant que nous puissions vous envoyer un email, puis réessayez.",
"REMINDER": "RAPPEL",
"Send": "Envoyer",
@ -122,7 +126,7 @@
"Enter a name and a comment!": "Merci de remplir les deux champs !",
"Enter a title": "Il faut saisir un titre !",
"Enter an email address": "Il faut saisir une adresse électronique !",
"Error on amount of voters limitation : value must be an integer greater than 0": "Error on amount of voters limitation: Value must be an integer greater than 0",
"Error on amount of voters limitation : value must be an integer greater than 0": "Erreur : le nombre de votants doit être une nombre supérieur à 0",
"Error!": "Erreur !",
"Failed to delete all comments": "Impossible de supprimer tous les commentaires",
"Failed to delete all votes": "Impossible de supprimer tous les votes",
@ -143,29 +147,46 @@
"Poll id already used": "L'identifiant est déjà utilisé",
"Something is going wrong...": "Quelque chose ne va pas...",
"Something is wrong with the format": "Quelque chose ne va pas avec le format",
"Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Something is wrong with the format: Customized URLs should only consist of alphanumeric characters and hyphens.",
"Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Format incorrect : seuls les caractères alphabétiques, nombres et tirets sont acceptés dans les URLs personnalisées.",
"Something is wrong with the format: name shouldn't have any spaces before or after": "Quelque chose ne va pas avec le format : le nom ne devrait pas contenir d'espaces avant ou après",
"The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.": "L'adresse saisie n'est pas correcte ! Il faut une adresse électronique valide (par exemple r.stallman@outlock.com) pour recevoir le lien vers le sondage.",
"The column already exists": "La colonne existe déjà",
"The name is invalid.": "Le nom n'est pas valide.",
"The name you've chosen already exist in this poll!": "Le nom que vous avez choisi existe déjà !",
"There is a problem with your choices": "Il y a un problème avec vos choix",
"This id is not allowed": "This identifier is not allowed",
"This poll doesn't exist !": "Ce sondage n'existe pas !",
"Update vote failed": "Échec de de la mise à jour du vote",
"You already voted": "Vous avez déjà voté",
"You can't create a poll with hidden results with the following edition option:": "Vous ne pouvez pas créer de sondage avec résulats cachés avec les options d'édition suivantes : ",
"You can't select more than %d dates": "Vous ne pouvez pas choisir plus de %d dates",
"You haven't filled the first section of the poll creation, or your session has expired.": "Vous n'avez pas renseigné la première page du sondage, ou bien votre session a expiré.",
"You haven't filled the first section of the poll creation.": "Vous n'avez pas renseigné la première page du sondage",
"Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry.": "Votre vote n'a pas été pris en compte, car quelqu'un a voté entre temps et cela entre en conflit avec vos choix et les conditions du sondage. Merci de réessayer."
},
"FindPolls": {
"Address": "Adresse",
"Created polls": "Sondages créés",
"Have a good day!": "Bonne journée !",
"Here is the list of the polls that you manage on %s:": "Voici la liste des sondages que vous administrez sur %s :",
"If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.": "Si jamais vous n'étiez pas à l'origine de cette action et que vous pensez qu'il s'agit d'un abus, vous pouvez nous le signaler à l'administrateur·rice sur %s.",
"Last access date": "Date de dernier accès",
"List of your polls": "Liste de vos sondages",
"Local Storage Help": "Pour vous aider à trouver vos sondages précédents, nous enregistrons des informations sur chaque sondage que vous effectuez ou auquel vous accédez dans votre navigateur. Ces données sont sauvegardées uniquement dans votre navigateur. Les données suivantes seront enregistrées:",
"Local Storage Help Delete": "Pour supprimer ces données, cliquez sur l'icône en forme de poubelle en face de chaque ligne ou cliquez sur le bouton « Supprimer l'index de mes sondages ». Cela ne supprimera pas vos sondages.",
"Local Storage Help Information Accessed": "La date à laquelle vous avez créé ou accédé en dernier le sondage",
"Local Storage Help Information Address": "Son adresse",
"Local Storage Help Information Title": "Le titre du sondage",
"PS: this email has been sent because you or someone else asked to get back the polls created with your email address.": "PS : ce mail a été envoyé parce que vous ou quelqu'un d'autre avez demandé la récupération des sondages créés à l'aide de votre adresse email.",
"Polls saved inside this browser": "Sondages stockés dans ce navigateur",
"Polls sent": "Sondages envoyés",
"Send me my polls": "Envoyer mes sondages"
"Remove all polls from this browser": "Supprimer tous mes sondages de l'index de ce navigateur",
"Remove poll from index": "Supprimer le sondage de l'index",
"Send me my polls": "Envoyer mes sondages",
"Send my polls by email": "Envoyer mes sondages par courriel",
"There are no polls saved inside your browser yet": "Il n'y a pas encore de sondages sauvegardés dans votre navigateur",
"Title": "Titre",
"Visited polls": "Sondages accédés"
},
"Generic": {
"(in the format name@mail.com)": "(au format nom@mail.com)",
@ -188,7 +209,7 @@
"Ifneedbe": "Si nécessaire",
"Legend:": "Légende :",
"Link": "Lien",
"Make your polls": "Organiser des rendez-vous simplement, librement.",
"Make your polls": "Créez vos propres sondages",
"Markdown": "Markdown",
"Next": "Continuer",
"No": "Non",
@ -220,8 +241,11 @@
"AppName": "Nom de l'application",
"CleanUrl": "URL propres",
"Database": "Base de données",
"DbConnectionString": "Chaîne de connexion",
"DbDriver": "Pilote de la base de données",
"DbHost": "Nom d'hôte",
"DbName": "Nom de la base de données",
"DbPassword": "Mot de passe",
"DbPort": "Port de la base de données",
"DbPrefix": "Préfixe",
"DbUser": "Utilisateur·rice",
"DefaultLanguage": "Langue par défaut",
@ -266,24 +290,27 @@
"You have to provide a password to access the poll.": "Vous devez donner le mot de passe pour avoir accès à ce sondage."
},
"Poll results": {
"%s option": "%s option",
"Addition": "Somme",
"Anyone will be able to access your email address after your vote": "Tout le monde pourra accéder à votre courriel après que vous ayez voté",
"Best choice": "Meilleur choix",
"Best choices": "Meilleurs choix",
"Chart": "Graphique",
"Display the chart of the results": "Afficher le graphique des résultats",
"Edit the line: %s": "Modifier la ligne : %s",
"Link to edit this particular line": "Lien pour éditer cette ligne",
"Link to edit this particular line has been copied inside the clipboard!": "The link to edit this particular line has been copied to the clipboard!",
"Link to edit this particular line has been copied inside the clipboard!": "Le lien pour l'édition de cette ligne a été copié dans le presse-papier !",
"Remove the line:": "Supprimer la ligne :",
"Save the choices": "Enregistrer les choix",
"Scroll to the left": "Faire défiler à gauche",
"Scroll to the right": "Faire défiler à droite",
"The best choice at this time is:": "Pour l'instant, le choix ayant reçu le plus grand nombre de votes est :",
"The bests choices at this time are:": "Pour l'instant, les choix ayant reçu le plus grand nombre de votes sont :",
"Vote ifneedbe for": "Vote under reserve for",
"Vote ifneedbe for": "Si nécessaire",
"Vote no for": "Voter « non » pour",
"Vote yes for": "Voter « oui » pour",
"Votes of the poll": "Votes du sondage",
"Warning : anyone can access to your email address after voting": "Warning: Anyone can see your email address after voting",
"polled user": "votant·e",
"polled users": "votant·e·s"
},
@ -295,6 +322,8 @@
"Cancel the name edit": "Annuler le changement d'auteur·rice",
"Cancel the rules edit": "Annuler le changement de permissions",
"Cancel the title edit": "Annuler le changement de titre",
"Collect of the polled users email addresses": "Collec the polled users' email addresses",
"Collecting the polled users emails": "Collecting the polled users email addresses",
"Edit the description": "Modifier la description",
"Edit the email adress": "Modifier le courriel",
"Edit the expiration date": "Modifier la date d'expiration",
@ -305,6 +334,7 @@
"Expiration date": "Date d'expiration",
"Export to CSV": "Export Tableur (CSV)",
"Initiator of the poll": "Auteur·rice du sondage",
"No collect of the polled users email addresses": "The polled users' email addresses are not collected",
"No password": "Pas de mot de passe",
"Only votes are protected": "Seul les votes sont protégés",
"Password protected": "Protégé par mot de passe",
@ -326,12 +356,23 @@
"Save the new title": "Enregistrer le nouveau titre",
"Simple editor": "Editeur simple",
"Title": "Titre du sondage",
"Voters email adresses are collected": "Voters' email adresses are collected",
"Voters email adresses are collected and required": "Voters' email adresses are collected and required",
"Voters email adresses are collected, required and verified": "Voters' email adresses are collected, required and verified",
"Voters email adresses are not collected": "Voters' email adresses are not collected",
"Votes and comments are locked": "Il n'est plus possible de voter",
"Votes protected by password": "Votes protégés par mot de passe"
},
"Step 1": {
"All voters can modify any vote": "Tou·te·s les sondé·e·s peuvent modifier tous les votes",
"Collect the polled users email addresses": "Collecting the polled users' email addresses",
"Collect users email": "Récolter les courriels des utilisateurs",
"Collect voters email": "Collect voters' email addresses",
"Customize the URL": "Personnaliser le lien",
"Email addresses are collected but not required": "Email addresses are collected but not required",
"Email addresses are not collected": "Email addresses are not collected",
"Email addresses are required": "Email addresses are required",
"Email addresses are required and verified": "Email addresses are required and verified",
"Go to step 2": "Aller à l'étape 2",
"Limit the amount of voters per option": "Limiter le nombre de votant·e·s par option",
"More informations here:": "Plus d'informations ici :",
@ -342,7 +383,7 @@
"Permissions": "Permissions",
"Poll creation (1 on 3)": "Création de sondage (1 sur 3)",
"Poll id": "Lien du sondage",
"Poll id rules": "(peut contenir des lettres, des chiffres et des tirets)",
"Poll id rules": "(peut contenir des lettres, des chiffres et des tirets \"-\")",
"Poll id warning": "La modification du lien du sondage peut faciliter l'accès à ce sondage pour des personnes non désirées. Il est recommandé de le protéger par mot de passe.",
"Poll password": "Mot de passe",
"Poll title": "Titre du sondage",
@ -353,9 +394,11 @@
"To receive an email for each new vote": "Recevoir un courriel à chaque participation",
"Use a password to restrict access": "Restreindre l'accès au sondage par mot de passe",
"Value Max": "Valeur Maximale",
"ValueMax instructions": "Votants maximum par option",
"ValueMax instructions": "votes par choix",
"Voters can modify their vote themselves": "Chaque sondé·e peut modifier son propre vote",
"Votes cannot be modified": "Aucun vote ne peut être modifié",
"Warning : anyone can access to the polled users's email addresses.": "Warning: Anyone can see the polled users' email addresses.",
"Warning: anyone can access the polled users email addresses since all voters can modify any vote. You should restrict permission rules.": "Warning: Anyone can see the polled users' email addresses since all voters can modify any vote. You should restrict permission rules.",
"You are in the poll creation section.": "Vous avez choisi de créer un nouveau sondage.",
"You can enable or disable the editor at will.": "Vous pouvez activer ou désactiver l'éditeur à votre guise."
},
@ -412,6 +455,8 @@
"As poll administrator, you can change all the lines of this poll with this button": "En tant qu'administrateur·rice, vous pouvez modifier toutes les lignes de ce sondage avec ce bouton",
"Back to the poll": "Retour au sondage",
"Choice added": "Choix ajouté",
"Collect the emails of the polled users for the choice": "Collecte les courriels des utilisateurs pour ce choix",
"Collect the emails of the polled users for this column": "Collect the email addresses of the polled users for this column",
"Column removed": "Colonne supprimée",
"Column's adding": "Ajout de colonne",
"Comment deleted": "Commentaire supprimé",
@ -433,7 +478,7 @@
"Remove the column": "Effacer la colonne",
"Remove the comments": "Supprimer les commentaires",
"Remove the votes": "Supprimer les votes",
"The poll is created.": "The poll was created.",
"The poll is created.": "Le sondage a été créé",
"Vote added": "Vote ajouté",
"Vote deleted": "Vote supprimé",
"Vote updated": "Vote mis à jour",
@ -442,6 +487,14 @@
"and add a new column with": "et si vous avez oublié de saisir un choix, vous pouvez rajouter une colonne en cliquant sur",
"remove a column or a line with": "effacer une colonne ou une ligne avec"
},
"display_mails": {
"People who have answered 'If need be' to this option have left those email addresses :": "Users who voted 'If need be' for this option have left those email addresses:",
"People who have answered 'If need be' to this option have not left any email addresses.": "Users who voted 'If need be' for this option have not left any email addresses:",
"People who have answered 'No' to this option have left those email addresses :": "Users who voted 'No' for this option have left those email addresses:",
"People who have answered 'No' to this option have not left any email addresses.": "Users who voted 'No' for this option have not left any email addresses.",
"People who have answered 'Yes' to this option have left those email addresses :": "Users who voted 'Yes' for this option have left those email addresses:",
"People who have answered 'Yes' to this option have not left any email addresses.": "Users who voted 'Yes' for this option have not left any email addresses."
},
"studs": {
"Adding the vote succeeded": "Ajout du vote réussi",
"Deletion date:": "Date de suppression :",

507
locale/hu.json Normal file
View File

@ -0,0 +1,507 @@
{
"1st section": {
"Define dates or subjects to choose": "Választható időpontok vagy témák megadása",
"Discuss and make a decision": "Megbeszélés és döntéshozás",
"Do you want to": "Szeretnél",
"Framadate is an online service for planning an appointment or make a decision quickly and easily. No registration is required.": "A Framadate egy online szolgáltatás találkozók egyeztetésére vagy döntések gyors és egyszerű meghozására. Regisztráció nem szükséges.",
"Here is how it works:": "Így működik:",
"Make a poll": "Szavazás létrehozása",
"Send the poll link to your friends or colleagues": "Szavazás elküldése ismerősöknek vagy kollégáknak",
"What is that?": "Mi a Framadate?",
"view an example?": "látni egy példát?"
},
"2nd section": {
"CeCILL-B license": "CeCILL-B licenc",
"Framadate was initially based on ": "A Framadate eredetileg a Strasbourgi Egyetem által fejlesztett ",
"It is governed by the": "A Framadate licence: ",
"The software": "A szoftver",
"This software needs javascript and cookies enabled. It is compatible with the following web browsers:": "A szoftver futtatásához JavaScript és a sütik engedélyezése szükséges. A következő webböngészőkkel kompatibilis:",
"a software developed by the University of Strasbourg. Today, it is devevoped by the association Framasoft.": "szoftveren alapult, de most már a Framasoft fejleszti."
},
"3rd section": {
"Cultivate your garden": "Neveld a sajátod",
"If you want to install the software for your own use and thus increase your independence, we help you on:": "Ha szeretnéd magadnak telepíteni a szoftvert saját használatra, ezzel is növelve a függetlenségedet, akkor a következő oldalon kaphatsz ehhez segítséget:",
"To participate in the software development, suggest improvements or simply download it, please visit ": "Ahhoz, hogy részt vegyél a fejlesztésben, fejlesztéseket javasolj vagy egyszerűen csak letöltsd a szoftvert, látogass el a",
"the development site": "fejlesztési oldalra"
},
"Admin": {
"Actions": " Műveletek",
"Administration": "Adminisztráció",
"Author": "Szerző",
"Back to administration": "Vissza az adminisztrációhoz",
"Change the poll": "Szavazás módosítása",
"Confirm removal of the poll": "A szavazás eltávolításának megerősítése",
"Deleted the poll": "Szavazás törölve",
"Email": "E-mail",
"Executed": "Végrehajtva",
"Expiration date": "Lejárati idő",
"Fail": "Sikertelen",
"Failed:": "Sikertelen:",
"Format": "Formátum",
"Installation": "Telepítés",
"Logs": "Naplók",
"Migration": "Áttelepítés",
"Nothing": "Semmi",
"Pages:": "Oldalak:",
"Poll ID": "Szavazásazonosító",
"Polls": "Szavazások",
"Purge": "Törlés",
"Purge the polls": "Szavazások törlése",
"Purged:": "Törölve:",
"See the poll": "Szavazás megtekintése",
"Skipped:": "Kihagyva:",
"Status": "Állapot",
"Succeeded:": "Sikeres:",
"Success": "Sikeres",
"Summary": "Összegzés",
"Title": "Cím",
"Votes": "Szavazatok",
"Waiting": "Várakozás",
"polls in the database at this time": "szavazás van most az adatbázisban"
},
"Check": {
"Check again": "Ellenőrizd újra",
"Consider enabling the PHP extension OpenSSL for increased security.": "Fontold meg az OpenSSL PHP kiterjesztés engedélyezését a növelt biztonság érdekében.",
"Consider setting the date.timezone in php.ini.": "Fontold meg a data.timezone megadását a php.ini fájlban.",
"Consider setting « session.cookie_httponly = 1 » inside your php.ini or add « php_value session.cookie_httponly 1 » to your .htaccess so that cookies can't be accessed through Javascript.": "Fontold meg a „session.cookie_httponly = 1” beállítását a php.ini fájlban, vagy add hozzá a „php_value session.cookie_httponly 1” szöveget a .htaccess fájlhoz, hogy a sütiket ne lehessen Javascripten keresztül elérni.",
"Continue the installation": "Telepítés folytatása",
"Cookies are served from HTTP only.": "A sütik csak HTTP felől kerülnek kiszolgálásra",
"Installation checking": "Telepítés ellenőrzése",
"OpenSSL extension loaded.": "OpenSSL kiterjesztés betöltve.",
"PHP Intl extension is enabled.": "PHP Intl kiterjesztés engedélyezve.",
"PHP version %s is enough (needed at least PHP %s).": "A PHP %s elégséges (legalább PHP %s szükséges).",
"The config file directory (%s) is not writable and the config file (%s) does not exists.": "A konfigurációs fájl könyvtára (%s) nem írható, és a konfigurációs fájl (%s) nem létezik.",
"The config file directory (%s) is writable.": "A konfigurációs fájl könyvtára (%s) írható.",
"The config file exists.": "A konfigurációs fájl létezik.",
"The template compile directory (%s) doesn't exist in \"%s\". Retry the installation process.": "A sablonok fordítási könyvtára (%s) nem létezik itt: „%s”. Kezdd újra a telepítési folyamatot.",
"The template compile directory (%s) is not writable.": "A sablonok fordítási könyvtára (%s) nem írható.",
"The template compile directory (%s) is writable.": "A sablonok fordítási könyvtára (%s) írható.",
"You need to enable the PHP Intl extension.": "Engedélyezned kell a PHP Intl kiterjesztést.",
"Your PHP version (%s) is too old. This application needs at least PHP %s.": "A PHP %s túl régi. Az alkalmazáshoz legalább PHP %s szükséges.",
"date.timezone is set.": "date.timezone beállítva."
},
"Comments": {
"Add a comment to the poll": "Hozzászólás hozzáadása a szavazáshoz.",
"Comment added": "Hozzászólás mentve",
"Comments of polled people": "Hozzászólások",
"Remove the comment": "Hozzászólás eltávolítása",
"Send the comment": "Hozzászólás beküldése",
"Type your name and a comment to send it": "Az űrlap elküldése előtt add meg neved és a hozzászólásod",
"Your comment": "Hozzászólás",
"anonyme": "névtelen"
},
"Date": {
"Add range dates": "Időintervallum hozzáadása",
"DATE": "%Y.%m.%d.",
"DATETIME": "%Y.%m.%d. %H:%M",
"DAY": "%e., %a",
"End date": "Záró dátum",
"FULL": "%Y. %B %e., %A",
"MONTH_YEAR": "%Y %B",
"Max dates count": "Legfeljebb 4 hónapot válaszhatsz",
"SHORT": "%Y. %B %e., %A",
"Start date": "Kezdő dátum",
"datepicker": "yyyy.mm.dd.",
"datetime_parseformat": "Y.m.d.",
"dd/mm/yyyy": "yyyy.mm.dd."
},
"EditLink": {
"Edit link for poll \"%s\"": "A(z) „%s” szavazás hivatkozásának szerkesztése",
"Here is the link for editing your vote:": "A szavazatod szerkesztéséhez szükséges hivatkozás:",
"If you don't want to lose your personalized link, we can send it to your email.": "Ha szeretnéd, elküldhetjük e-mailben a személyre szabott hivatkozásodat. ",
"Please wait %d seconds before we can send an email to you then try again.": "Várj %d másodpercet mielőtt elküldjük neked az e-mailt, aztán próbáld újra.",
"REMINDER": "EMLÉKEZTETŐ",
"Send": "Elküldés",
"The email address is not correct.": "Az e-mail cím helytelen.",
"Your reminder has been successfully sent!": "Az emlékeztető sikeresen elküldve!"
},
"Error": {
"Adding vote failed": "Szavazat hozzáadása sikertelen",
"CANT_CONNECT_TO_DATABASE": "Nem sikerült csatlakozni az adatbázishoz",
"Can't create an empty column.": "Üres oszlop nem hozható létre.",
"Can't create the config.php file in '%s'.": "Nem hozató létre a config.php fájl itt: „%s”.",
"Comment failed": "Hozzászólás sikertelen",
"Cookies are disabled on your browser. Theirs activation is required to create a poll.": "A sütik le vannak tiltva a böngésződben. Engedélyezni kell őket a szavazás létrehozásához.",
"Enter a name": "Adj meg egy nevet",
"Enter a name and a comment!": "Adj meg egy nevet és a hozzászólásod.",
"Enter a title": "Adj meg egy címet",
"Enter an email address": "Adj meg egy e-mail címet",
"Error on amount of voters limitation : value must be an integer greater than 0": "Hiba a szavazatszám korlátozásában: az érték 0-nál nagyobb egész szám kell legyen",
"Error!": "Hiba!",
"Failed to delete all comments": "Az összes hozzászólás törlése sikertelen",
"Failed to delete all votes": "Az összes szavazat törlése sikertelen",
"Failed to delete column": "Oszlop törlése sikertelen",
"Failed to delete the comment": "Hozzászólás törlése sikertelen",
"Failed to delete the poll": "Szavazás törlése sikertelen",
"Failed to delete the vote!": "Szavazat törlése sikertelen.",
"Failed to insert the comment!": "Hozzászólás beszúrása sikertelen.",
"Failed to save poll": "A szavazás mentése sikertelen",
"Forbidden!": "Tiltott.",
"Framadate is not properly installed, please check the \"INSTALL\" to setup the database before continuing.": "A Framadate nincs helyesen telepítve, a folytatás előtt az adatbázis beállítási utasításokért nézd meg az „INSTALL” fájlt.",
"Javascript is disabled on your browser. Its activation is required to create a poll.": "A JavaScript le van tiltva a böngésződben. Engedélyezni kell a szavazás létrehozásához.",
"MISSING_VALUES": "Hiányzó értékek",
"No polls found": "A szavazás nem található",
"Password is empty": "A jelszó üres.",
"Passwords do not match": "A jelszavak nem egyeznek.",
"Poll has been updated before you vote": "A szavazás frissítve lett mielőtt szavaztál",
"Poll id already used": "Az azonosító már használatban van",
"Something is going wrong...": "Valami hiba történt…",
"Something is wrong with the format": "Valami baj van a formátummal",
"Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Valami baj van a formátummal: a személyre szabott URL csak alfanumerikus karaktereket és kötőjeleket tartalmazhat",
"Something is wrong with the format: name shouldn't have any spaces before or after": "Valami baj van a formátummal: a név elején és végén nem lehetnek szóközök",
"The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.": "A cím nem megfelelő. Érvényes e-mail címet kell megadj (pl. r.stallman@outlock.com), hogy el tudjuk küldeni a szavazáshoz tartozó hivatkozást.",
"The column already exists": "Az oszlop már létezik",
"The name is invalid.": "A név érvénytelen.",
"The name you've chosen already exist in this poll!": "A választott név már szerepel ebben a szavazásban.",
"There is a problem with your choices": "Probléma van a választásaiddal",
"This id is not allowed": "Az azonosító nem engedélyezett",
"This poll doesn't exist !": "Ez a szavazás nem létezik.",
"Update vote failed": "Szavazat frissítése sikertelen",
"You already voted": "Már szavaztál",
"You can't create a poll with hidden results with the following edition option:": "Nem hozhatsz létre rejtett eredményű szavazást a következő beállítással:",
"You can't select more than %d dates": "Nem választhatsz ki többet %d dátumnál",
"You haven't filled the first section of the poll creation, or your session has expired.": "Nem töltötted ki a szavazás létrehozás első szakaszát, vagy lejárt a munkameneted.",
"You haven't filled the first section of the poll creation.": "Nem töltötted ki a szavazás első szakaszát.",
"Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry.": "A szavazatod nem lett beleszámítva, mert valaki időközben szavazott, és ez ütközik a választásaiddal és a szavazás feltételeivel. Próbáld újra."
},
"FindPolls": {
"Address": "Cím",
"Created polls": "Létrehozott szavazások",
"Have a good day!": "Legyen szép napod!",
"Here is the list of the polls that you manage on %s:": "Ez a szavazások listája, amit a %s alkalmazásban kezelsz:",
"If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.": "Ha nem te voltál, és úgy gondolod hogy ez visszaélés, akkor értesítsd az adminisztrátort a(z) %s e-email címen.",
"Last access date": "Legutóbbi elérés ideje",
"List of your polls": "Szavazásaid listája",
"Local Storage Help": "Hogy segítsünk megtalálni az előző szavazásaidat, minden szavazást elmentünk a böngésződben. Ez az adat csak a böngészőben kerül mentése. A következő adatokról van szó:",
"Local Storage Help Delete": "Az adatok törléséhez kattintson a kuka ikonra a megfelelő sorban, vagy kattints a „szavazások indexének törlése” lehetőségre. Ez nem törli a szavazásaidat.",
"Local Storage Help Information Accessed": "Az időpont, amikor létrehoztad vagy legutóbb elérted a szavazást",
"Local Storage Help Information Address": "A címe",
"Local Storage Help Information Title": "A szavazás címe",
"PS: this email has been sent because you or someone else asked to get back the polls created with your email address.": "UI: ez az e-mail azért lett elküldve, mert Te vagy valaki más kérte az erről az e-email címről létrehozott szavazások listáját. ",
"Polls saved inside this browser": "Az ebben a böngészőben mentett szavazások",
"Polls sent": "Szavazások listája elküldve",
"Remove all polls from this browser": "Az összes szavazás eltávolítása a böngésző indexéből",
"Remove poll from index": "Szavazás eltávolítása az indexből",
"Send me my polls": "Szavazások elküldése",
"Send my polls by email": "Szavazások elküldése e-mailben",
"There are no polls saved inside your browser yet": "Még nincsenek szavazások mentve a böngésződben",
"Title": "Cím",
"Visited polls": "Meglátogatott szavazások"
},
"Generic": {
"(in the format name@mail.com)": "(name@mail.com formátumban)",
"ASTERISK": "*",
"Add": "Hozzáadás",
"Back": "Vissza",
"Back to the homepage of": "Vissza a következő weboldalra:",
"Cancel": "Mégse",
"Caption": "Információ",
"Choice": "Választás",
"Classic": "Klasszikus",
"Close": "Bezárás",
"Creation date:": "Létrehozási idő:",
"Date": "Dátum",
"Day": "Nap",
"Description": "Leírás",
"Edit": "Szerkesztés",
"Framadate is an online service for planning an appointment or make a decision quickly and easily.": "A Framadate egy online szolgáltatás találkozók egyeztetésére vagy döntések gyors és egyszerű meghozására.",
"Home": "Kezdőlap",
"Ifneedbe": "Feltételes",
"Legend:": "Jelmagyarázat:",
"Link": "Hivatkozás",
"Make your polls": "Hozd létre a saját szavazásaid",
"Markdown": "Markdown",
"Next": "Következő",
"No": "Nem",
"Page generated in": "Az oldal előállítva:",
"Poll": "Szavazás",
"Remove": "Eltávolítás",
"Save": "Mentés",
"Search": "Keresés",
"Time": "Idő",
"Validate": "Érvényesítés",
"Yes": "Igen",
"Your email address": "Az e-mail címed",
"Your name": "Neved",
"days": "nap",
"for": "ennél:",
"months": "hónap",
"seconds": "másodperc",
"vote": "szavazat alapján",
"votes": "szavazat alapján",
"with": ""
},
"Homepage": {
"Make a classic poll": "Szokásos szavazás létrehozása",
"Schedule an event": "Esemény ütemezése",
"Where are my polls": "Hol vannak a szavazásaim?"
},
"Installation": {
"AppMail": "Adminisztrátor e-mail címe",
"AppName": "Alkalmazás neve",
"CleanUrl": "Tiszta URL",
"Database": "Adatbázis neve",
"DbDriver": "Adatbázis-meghajtó",
"DbHost": "Adatbázis gépneve",
"DbName": "Adatbázis neve",
"DbPassword": "Jelszó",
"DbPort": "Adatbázis portja",
"DbPrefix": "Előtag",
"DbUser": "Felhasználó",
"DefaultLanguage": "Alapértelmezett nyelv",
"General": "Általános",
"Install": "Telepítés",
"MigrationTable": "Áttelepítési tábla",
"ResponseMail": "Válasz e-mail cím"
},
"Language selector": {
"Change the language": "Nyelv módosítása",
"Select the language": "Válassz nyelvet"
},
"Mail": {
"Author's message": "Üzenet a szerzőnek",
"FOOTER": "„Az út hosszú, de út tiszta…”<br/>A Framasoft csak az adományaitokból él.<br/>Előre is köszönjük a támogatásodat itt: https://soutenir.framasoft.org",
"For sending to the polled users": "Résztvevői hivatkozás",
"Notification of poll: %s": "Szavazás értesítése: %s",
"Poll's participation: %s": "Részvétel a szavazásban: %s",
"Someone just change your poll available at the following link %s.": "Valaki épp módosította a szavazásodat a <a href=\"%1$s\">%1$s</a> hivatkozáson.",
"Someone just delete your poll %s.": "Valaki letörölte a(z) „%s” szavazásod.",
"Thanks for filling the poll at the link above": "Köszönjük, hogy részt vettél az alábbi hivatkozás mentén elérhető szavazásban",
"Thanks for your trust.": "Köszönjük a bizalmat.",
"This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.": "Ez a résztvevőknek küldendő üzenet.",
"This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above": "Ezt az e-mailt NE továbbítsd a szavazás résztvevőinek, hanem tartsd titokban. <br/><br/>A következő hivatkozást követve módosíthatod a szavazást",
"You have changed the settings of your poll. \nYou can modify this poll with this link": "Megváltoztattad a szavazásod beállításait. <br/> A következő hivatkozást felkeresve módosíthatod a szavazás beállításait",
"[ADMINISTRATOR] New settings for your poll": "[ADMINISZTRÁTOR] Új beállítások a szavazásodhoz",
"filled a vote.\nYou can find your poll at the link": "szavazott.<br/>A következő hivatkozással keresheted fel a szavazást",
"hast just created a poll called": "létrehozott egy szavazást",
"updated a vote.\nYou can find your poll at the link": "frissített egy szavazatot.<br/>A következő hivatkozással keresheted fel a szavazást",
"wrote a comment.\nYou can find your poll at the link": "írt egy hozzászólást.<br/>A következő hivatkozással keresheted fel a szavazást"
},
"Maintenance": {
"Thank you for your understanding.": "Köszönjük a megértést.",
"The application": "Az alkalmazás",
"is currently under maintenance.": "jelenleg karbantartás alatt van."
},
"Password": {
"Password": "Jelszó",
"Submit access": "Hozzáférés beküldése",
"Wrong password": "Hibás jelszó",
"You have to provide a password so you can participate to the poll.": "A szavazásban való részvételhez meg kell adj egy jelszót.",
"You have to provide a password to access the poll.": "A szavazáshoz való hozzáféréshez meg kell adj egy jelszót."
},
"Poll results": {
"%s option": "%s lehetőség",
"Addition": "Összesen",
"Anyone will be able to access your email address after your vote": "Ha szavazol, akkor az e-mail címed bárki megtekintheti",
"Best choice": "Legjobb választás",
"Best choices": "Legjobb választások",
"Chart": "Grafikon",
"Display the chart of the results": "Eredmény grafikus ábrázolása",
"Edit the line: %s": "Sor szerkesztése: %s",
"Link to edit this particular line": "Hivatkozás ennek a sornak a szerkesztéséhez",
"Link to edit this particular line has been copied inside the clipboard!": "Az adott sor szerkesztéséhez szükséges hivatkozás a vágólapra lett másolva.",
"Remove the line:": "Sor eltávolítása:",
"Save the choices": "Szavazatok mentése",
"Scroll to the left": "Görgetés balra",
"Scroll to the right": "Görgetés jobbra",
"The best choice at this time is:": "Jelenlegi legjobb lehetőség:",
"The bests choices at this time are:": "Jelenlegi legjobb lehetőségek:",
"Vote ifneedbe for": "Feltételes szavazatok ennél:",
"Vote no for": "„Nem” szavazat a következőre: ",
"Vote yes for": "„Igen” szavazat a következőre:",
"Votes of the poll": "Szavazatok",
"Warning : anyone can access to your email address after voting": "Figyelmeztetés: szavazás után bárki hozzáférhet az e-mail címedhez",
"polled user": "szavazó",
"polled users": "szavazó"
},
"PollInfo": {
"Admin link of the poll": "Adminisztrációs hivatkozás a szavazáshoz",
"Cancel the description edit": "Leírás szerkesztésének elvetése",
"Cancel the email address edit": "E-mail cím szerkesztésének elvetése",
"Cancel the expiration date edit": "Lejárati idő szerkesztésének visszavonása",
"Cancel the name edit": "Név szerkesztésének elvetése",
"Cancel the rules edit": "Szabály szerkesztésének elvetése",
"Cancel the title edit": "Cím szerkesztésének elvetése",
"Collect of the polled users email addresses": "A megkérdezett felhasználók e-mail címének gyűjtése",
"Collecting the polled users emails": "A megkérdezett felhasználók e-mail címének gyűjtése",
"Edit the description": "Leírás szerkesztése",
"Edit the email adress": "E-mail cím szerkesztése",
"Edit the expiration date": "Lejárati idő szerkesztése",
"Edit the name": "Név szerkesztése",
"Edit the poll rules": "Szabály szerkesztése",
"Edit the title": "Cím szerkesztése",
"Email": "E-mail",
"Expiration date": "Lejárati idő",
"Export to CSV": "Exportálás CSV fájlba",
"Initiator of the poll": "Szavazás létrehozója",
"No collect of the polled users email addresses": "A megkérdezett felhasználók e-mail címe nem lesz gyűjtve",
"No password": "Nincs jelszó",
"Only votes are protected": "Csak a szavazatok védettek",
"Password protected": "Jelszóval védett",
"Poll rules": "Szavazási szabályok",
"Print": "Nyomtatás",
"Public link of the poll": "Nyilvános hivatkozás a szavazáshoz",
"Remove all the comments": "Összes hozzászólás törlése",
"Remove all the votes": "Összes szavazat törlése",
"Remove password": "Jelszó törlése",
"Remove the poll": "Szavazás törlése",
"Results are hidden": "A szavazatok rejtettek",
"Results are visible": "A szavazatok nyilvánosak",
"Rich editor": "Részletes szerkesztő",
"Save the description": "Leírás mentése",
"Save the email address": "E-mail cím mentése",
"Save the new expiration date": "Új lejárati idő mentése",
"Save the new name": "Új név mentése",
"Save the new rules": "Új szabályok mentése",
"Save the new title": "Új cím mentése",
"Simple editor": "Egyszerű szerkesztő",
"Title": "A szavazás címe",
"Voters email adresses are collected": "A szavazók e-mail címe gyűjtve lesz",
"Voters email adresses are collected and required": "A szavazók e-mail címe kötelező jelleggel gyűjtve lesz",
"Voters email adresses are collected, required and verified": "A szavazók e-mail címe kötelező jelleggel gyűjtve lesz, és megerősítés is szükséges",
"Voters email adresses are not collected": "A szavazók e-mail címe nem lesz gyűjtve",
"Votes and comments are locked": "Szavazás és hozzászólások lezárása",
"Votes protected by password": "A szavazatok jelszóval védettek"
},
"Step 1": {
"All voters can modify any vote": "Minden szavazó bármelyik szavazatot módosíthatja",
"Collect the polled users email addresses": "Szavazók e-mail címének gyűjtése",
"Collect users email": "Felhasználók e-mail címének gyűjtése",
"Collect voters email": "Szavazók e-mail címének gyűjtése",
"Customize the URL": "URL személyre szabása",
"Email addresses are collected but not required": "Az e-mail cím nem kötelező jelleggel lesz gyűjtve",
"Email addresses are not collected": "Az e-mail cím nem lesz gyűjtve",
"Email addresses are required": "Az e-mail cím megadása kötelező",
"Email addresses are required and verified": "Az e-mail cím megadása kötelező, és megerősítés is szükséges",
"Go to step 2": "Tovább a 2. lépéshez",
"Limit the amount of voters per option": "Szavazatok lehetőségenkénti számának korlátozása",
"More informations here:": "További információk itt:",
"Only the poll maker can see the poll's results": "Csak a szavazás készítője láthatja az eredményt",
"Optional parameters": "Nem kötelező paraméterek",
"Password choice": "Megadás",
"Password confirmation": "Megerősítés",
"Permissions": "Engedélyek",
"Poll creation (1 on 3)": "Szavazás létrehozása (1/3)",
"Poll id": "Hivatkozás a szavazáshoz",
"Poll id rules": "Az azonosító betűket, számokat és kötőjeleket („-”) tartalmazhat.",
"Poll id warning": "Az azonosító megadásával a nemkívánatos személyek is könnyebben hozzáférhetnek a szavazáshoz. Javasolt jelszóval védeni.",
"Poll password": "Jelszó",
"Poll title": "Szavazás címe",
"Required fields cannot be left blank.": "A kötelező mezők nem maradhatnak üresen.",
"The results are publicly visible": "Az eredmények nyilvánosan láthatóak",
"To make the description more attractive, you can use the Markdown format.": "Markdown formátumot is használhatsz a leírás vonzóbbá tételéhez. ",
"To receive an email for each new comment": "E-mail értesítés küldése minden egyes hozzászóláskor",
"To receive an email for each new vote": "E-mail értesítés küldése minden egyes szavazatkor",
"Use a password to restrict access": "Hozzáférés korlátozása jelszóval",
"Value Max": "Érték maximuma",
"ValueMax instructions": "lehetőségenkénti szavazatok száma",
"Voters can modify their vote themselves": "A szavazók módosíthatják a saját szavazataikat",
"Votes cannot be modified": "A szavazatokat nem lehet módosítani",
"Warning : anyone can access to the polled users's email addresses.": "Figyelmeztetés: bárki hozzáférhet a szavazók e-mail címeihez.",
"Warning: anyone can access the polled users email addresses since all voters can modify any vote. You should restrict permission rules.": "Figyelmeztetés: Bárki láthatja a szavazók e-mail címeit, mert bármely szavazó bármelyik szavazatot módosíthatja. Célszerű korlátozni a jogosultsági szabályokat.",
"You are in the poll creation section.": "A szavazás létrehozási szakaszban vagy.",
"You can enable or disable the editor at will.": "Kedvedre ki- vagy bekapcsolhatod a szerkesztőt."
},
"Step 2": {
"Back to step 1": "Vissza az 1. lépéshez",
"Go to step 3": "Tovább a 3. lépéshez"
},
"Step 2 classic": {
"Add a choice": "Lehetőség hozzáadása",
"Add a link or an image": "Hivatkozás vagy kép hozzáadása",
"Alternative text": "Alternatív szöveg",
"It's possible to propose links or images by using": "Hivatkozásokat és képeket a következő módon lehet beágyazni:",
"Poll subjects (2 on 3)": "Szavazási beállítások (2/3)",
"Remove a choice": "Lehetőség eltávolítása",
"These fields are optional. You can add a link, an image or both.": "Ezek nem kötelező mezők. Itt megadhatsz egy hivatkozást, egy képet vagy mindkettőt.",
"To make a generic poll you need to propose at least two choices between differents subjects.": "Egy szavazás létrehozásához legalább két lehetőséget kell megadni.",
"URL of the image": "A kép URL-e",
"You can add or remove additional choices with the buttons": "A gombokkal adhatsz hozzá és vehetsz el lehetőségeket",
"the Markdown syntax": "Markdown szintaxis"
},
"Step 2 date": {
"Add a day": "Nap hozzáadása",
"Add an hour": "Idősáv hozzáadása",
"Choose the dates of your poll": "Válassz dátumokat a szavazáshoz",
"Copy hours of the first day": "Idősávok átmásolása az első napból",
"For each selected day, you can choose, or not, meeting hours (e.g.: \"8h\", \"8:30\", \"8h-10h\", \"evening\", etc.)": "Minden egyes napnál szabadon adhatsz meg találkozási időket (például „8h”, „8:30”, „8h-10h”, „este” stb.)",
"Poll dates (2 on 3)": "Szavazási dátumok (2/3)",
"Remove a day": "Nap eltávolítása",
"Remove all days": "Összes nap eltávolítása",
"Remove all hours": "Összes idősáv eltávolítása",
"Remove an hour": "Idősáv eltávolítása",
"Remove this day": "Nap eltávolítása",
"To schedule an event you need to propose at least two choices (two hours for one day or two days).": "Egy esemény ütemezéséhez legalább két lehetőséget kell megadni (azaz két idősávot egy nap, vagy két napot).",
"You can add or remove additionnal days and hours with the buttons": "A gombokkal további napokat és idősávokat adhatsz hozzá."
},
"Step 3": {
"Archiving date:": "Lejárati idő:",
"Back to step 2": "Vissza a 2. lépéshez",
"Confirm the creation of your poll": "A szavazás létrehozásának megerősítése",
"Create the poll": "Szavazás létrehozása",
"List of your choices": "Lehetőségek listája",
"Once you have confirmed the creation of your poll, you will be automatically redirected on the administration page of your poll.": "Ha megerősíted a szavazás létrehozását, automatikusan át leszel irányítva a szavazás adminisztrációs oldalára.",
"Removal date and confirmation (3 on 3)": "Eltávolítási idő és megerősítés (3/3)",
"Then, you will receive quickly two emails: one contening the link of your poll for sending it to the voters, the other contening the link to the administration page of your poll.": "Aztán két e-mailt fogsz kapni: egyet ami a résztvevőknek elküldendő hivatkozást tartalmazza, és egy másikat, amely a szavazás adminisztrációs oldalának hivatkozását tartalmazza.",
"You can set a closer archiving date for it.": "Lejárati időt adhatsz meg a szavazáshoz.",
"Your poll will automatically be archived": "A szavazásod automatikusan archiválva lesz",
"Your poll will be automatically archived in %d days.": "A szavazásod %d nap után automatikusan archiválva lesz.",
"after the last date of your poll.": "a szavazás utolsó dátuma után."
},
"adminstuds": {
"Add a column": "Oszlop hozzáadása",
"All comments deleted": "Összes hozzászólás törölve",
"All votes deleted": "Összes szavazat törölve",
"As poll administrator, you can change all the lines of this poll with this button": "A szavazás adminisztrátoraként ezzel a gombbal módosíthatod a szavazás sorait",
"Back to the poll": "Vissza a szavazáshoz",
"Choice added": "Lehetőség hozzáadva",
"Collect the emails of the polled users for the choice": "Az erre szavazó felhasználók e-mail címének begyűjtése",
"Collect the emails of the polled users for this column": "Az erre az oszlopra szavazó felhasználók e-mail címének begyűjtése",
"Column removed": "Oszlop törölve",
"Column's adding": "Oszlop hozzáadása",
"Comment deleted": "Hozzászólás törölve",
"Confirm removal of all comments of the poll": "Az összes hozzászólás eltávolításának megerősítése",
"Confirm removal of all votes of the poll": "Az összes szavazat eltávolításának megerősítése",
"Confirm removal of the column.": "Az oszlop eltávolításának megerősítése.",
"Confirm removal of the poll": "A szavazás eltávolításának megerősítése",
"Delete the poll": "Szavazás törlése",
"Finally, you can change the informations of this poll like the title, the comments or your email address.": "Végül, módosíthatod a szavazás tulajdonságait, mint a címet, hozzászólásokat vagy az e-mail címedet.",
"If you just want to add a new hour to an existant date, put the same date and choose a new hour.": "Ha csak egy idősávot akarsz hozzáadni egy meglévő dátumhoz, akkor add itt hozzá a dátumot, és válassz egy új idősávot.",
"Keep comments": "Hozzászólások megtartása",
"Keep the comments": "A hozzászólások megtartása",
"Keep the poll": "Szavazás megtartása",
"Keep the votes": "Szavazatok megtartása",
"Keep this poll": "A szavazás megtartása",
"Keep votes": "Szavazatok megtartása",
"Poll fully deleted": "Szavazás teljesen törölve",
"Poll saved": "Szavazás mentve",
"Remove the column": "Oszlop eltávolítása",
"Remove the comments": "Hozzászólások eltávolítása",
"Remove the votes": "Szavazatok eltávolítása",
"The poll is created.": "A szavazás létrehozva.",
"Vote added": "Szavazat hozzáadva",
"Vote deleted": "Szavazat törölve",
"Vote updated": "Szavazat frissítve",
"You can add a new scheduling date to your poll.": "Új ütemezési dátumot adhatsz hozzá a szavazáshoz.",
"Your poll has been removed!": "A szavazásod eltávolítva.",
"and add a new column with": "és új oszlop hozzáadása ezzel:",
"remove a column or a line with": "oszlop vagy sor törlése ezzel:"
},
"display_mails": {
"People who have answered 'If need be' to this option have left those email addresses :": "Azok akik a „Ha szükséges” lehetőséget választották, a következő e-mail címeket adták meg:",
"People who have answered 'If need be' to this option have not left any email addresses.": "Azok akik a „Ha szükséges” lehetőséget választották, nem adtak meg e-mail címet.",
"People who have answered 'No' to this option have left those email addresses :": "Azok akik a „Nem” lehetőséget választották, a következő e-mail címeket adták meg:",
"People who have answered 'No' to this option have not left any email addresses.": "Azok akik a „Nem” lehetőséget választották, nem adtak meg e-mail címet.",
"People who have answered 'Yes' to this option have left those email addresses :": "Azok akik az „Igen” lehetőséget választották, a következő e-mail címeket adták meg:",
"People who have answered 'Yes' to this option have not left any email addresses.": "Azok akik az „Igen” lehetőséget választották, nem adtak meg e-mail címet."
},
"studs": {
"Adding the vote succeeded": "Szavazat hozzáadva",
"Deletion date:": "Törlési idő:",
"If you want to vote in this poll, you have to give your name, choose the values that fit best for you and validate with the plus button at the end of the line.": "Ha szeretnél részt venni ebben a szavazásban, meg kell adnod a nevet, a válaszaidat, és a sor végén lévő mentés gombra kattintva be kell küldened. ",
"POLL_LOCKED_WARNING": "Az adminisztrátor lezárta ezt a szavazást. A szavazatok és hozzászólások be lettek fagyasztva.",
"The poll is expired, it will be deleted soon.": "A szavazás lejárt. Hamarosan törölve lesz.",
"Update vote succeeded": "Szavazat frissítve",
"Your vote has been registered successfully, but be careful: regarding this poll options, you need to keep this personal link to edit your own vote:": "A szavazatod el lett mentve, de ne felejtsd el megőrizni a személyre szabott hivatkozásodat, hogy a szavazatodat később módosítani tudd."
}
}

View File

@ -31,8 +31,9 @@
"Back to administration": "Ritorna all'amministrazione",
"Change the poll": "Modificare il sondaggio",
"Confirm removal of the poll": "Confermare l'eliminazione del sondaggio ",
"Deleted the poll": "Cancellare il sondaggio",
"Deleted the poll": "Poll deleted",
"Email": "Email",
"Executed": "Eseguito",
"Expiration date": "Scadenza",
"Fail": "Fallimento",
"Failed:": "Fallito:",
@ -49,11 +50,13 @@
"Purged:": "Depurati:",
"See the poll": "Vedere il sondaggio",
"Skipped:": "Saltato:",
"Status": "Status",
"Succeeded:": "Successo:",
"Success": "Successo",
"Summary": "Sommario",
"Title": "Titolo",
"Votes": "Voti",
"Waiting": "Attendi",
"polls in the database at this time": "sondaggi presenti nel database attualmente"
},
"Check": {
@ -83,6 +86,7 @@
"Comments of polled people": "Commenti dei partecipanti",
"Remove the comment": "Eliminare il commento",
"Send the comment": "Inviare il commento",
"Type your name and a comment to send it": "Inserisci il tuo nome e un commento prima di inviare il form",
"Your comment": "Il vostro commento",
"anonyme": "anonimo"
},
@ -104,8 +108,8 @@
"EditLink": {
"Edit link for poll \"%s\"": "Modifica il link del sondaggio \"%s\"",
"Here is the link for editing your vote:": "Ecco il link per modificare il vostro voto :",
"If you don't want to lose your personalized link, we can send it to your email.": "Per non perdere il vostro link personalizzato, possiamo inviarvelo con un'e-mail.",
"Please wait %d seconds before we can send an email to you then try again.": "Prego attendere %d secondi prima che possiamo inviarvi l'e-mail, poi riprovate.",
"If you don't want to lose your personalized link, we can send it to your email.": "Se non vuoi perdere i tuoi link personalizzati, possiamo inviarlo con un'e-mail",
"Please wait %d seconds before we can send an email to you then try again.": "Prego attendi %d secondi prima che possiamo inviarvi l'e-mail, poi riprovate.",
"REMINDER": "Promemoria",
"Send": "Invio",
"The email address is not correct.": "Indirizzo e-mail non corretto.",
@ -117,12 +121,12 @@
"Can't create an empty column.": "Impossibile creare una colonna vuota.",
"Can't create the config.php file in '%s'.": "Impossibile creare il file config.php in '%s'.",
"Comment failed": "Commento fallito",
"Cookies are disabled on your browser. Theirs activation is required to create a poll.": "I cookies non sono permessi sul vostro browser. E' necessario permetterli per creare un sondaggio.",
"Cookies are disabled on your browser. Theirs activation is required to create a poll.": "I cookies non sono permessi sul vostro browser. È necessario permetterli per creare un sondaggio.",
"Enter a name": "Non avete inserito il nome !",
"Enter a name and a comment!": "Inserire un nome e un commento!",
"Enter a title": "È necessario inserire un titolo !",
"Enter an email address": "È necessario inserire un indirizzo e-mail!",
"Error on amount of voters limitation : value must be an integer greater than 0": "Error on amount of voters limitation: Value must be an integer greater than 0",
"Error on amount of voters limitation : value must be an integer greater than 0": "Errore sulla limitazione di quantità di voti: il valore deve essere un numero intero maggiore di 0",
"Error!": "Errore!",
"Failed to delete all comments": "Impossibile eliminare tutti i commenti",
"Failed to delete all votes": "Impossibile eliminare tutti i voti",
@ -143,29 +147,46 @@
"Poll id already used": "L'identificativo del sondaggio è già in uso",
"Something is going wrong...": "Qualcosa non è corretto...",
"Something is wrong with the format": "Qualche errore nel formato",
"Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Something is wrong with the format: Customized URLs should only consist of alphanumeric characters and hyphens.",
"Something is wrong with the format: name shouldn't have any spaces before or after": "Something is wrong with the format: name shouldn't have any spaces before or after",
"Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "C'è un errore nel formato: l'URL personalizzato deve contenere solo caratteri alfanumerici e trattini.",
"Something is wrong with the format: name shouldn't have any spaces before or after": "C'è un errore nel formato: il nome non può avere spazi prima o dopo",
"The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.": "L'indirizzo inserito non è corretto ! È necessario un indirizzo e-mail valido (per esempio r.stallman@outlock.com) per ricevere il link del sondaggio.",
"The column already exists": "La colonna esiste già",
"The name is invalid.": "Nome non valido.",
"The name you've chosen already exist in this poll!": "Il nome che avete scelto esiste già !",
"There is a problem with your choices": "C'è un problema con la vostra scelta",
"This id is not allowed": "This identifier is not allowed",
"This poll doesn't exist !": "Questo sondaggio non esiste più !",
"Update vote failed": "Aggiornamento del voto fallito",
"You already voted": "Hai già votato",
"You can't create a poll with hidden results with the following edition option:": "Non potete creare un sondaggio con i risultati nascosti con queste opzioni: ",
"You can't select more than %d dates": "Non puoi scegliere più di %d date",
"You haven't filled the first section of the poll creation.": "Non avete completato la prima pagina del sondaggio",
"You haven't filled the first section of the poll creation, or your session has expired.": "Non hai completato la prima sezione del sondaggio o la tua sessione è scaduta.",
"You haven't filled the first section of the poll creation.": "Non hai completato la prima pagina del sondaggio",
"Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry.": "IT_Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry."
},
"FindPolls": {
"Address": "Indirizzo",
"Created polls": "Sondaggio creato",
"Have a good day!": "Buona giornata!",
"Here is the list of the polls that you manage on %s:": "Ecco la lista dei sondaggi che gestite su %s :",
"If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.": "Se non foste voi ad averlo richiesto o se pensiate che si tratti di un abuso, potreste segnalarlo all'amministratore su %s.",
"List of your polls": "Lista dei vostri sondaggi",
"PS: this email has been sent because you or someone else asked to get back the polls created with your email address.": "PS : questa e-mail vi è stato inviato perché voi o qualcun altro ha richiesto il recupero dei sondaggi creati tramite il vostro indirizzo e-mail.",
"Here is the list of the polls that you manage on %s:": "Ecco la lista dei sondaggi che gestisci su %s :",
"If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.": "Se non hai richiesto tu questa azione o se pensi si tratti di un abuso, puoi segnalarlo all'amministratore a %s.",
"Last access date": "Ultimo accesso",
"List of your polls": "Lista dei tuoi sondaggi",
"Local Storage Help": "Per aiutarti a trovare i tuoi precedenti sondaggi abbiamo salvato ogni sondaggio che hai creato o a cui hai avuto accesso nel tuo browser. Queste informazioni sono salvate solo nel browser. Le seguenti informazioni verranno salvate:",
"Local Storage Help Delete": "To delete this data click the trashcan on the according line or click the « delete my polls index » option. This won't delete your polls.",
"Local Storage Help Information Accessed": "La data di creazione o di ultimo accesso al sondaggio",
"Local Storage Help Information Address": "Questo è l'indirizzo",
"Local Storage Help Information Title": "Il titolo del sondaggio",
"PS: this email has been sent because you or someone else asked to get back the polls created with your email address.": "PS : questa e-mail è stata inviata perché tu o qualcun altro ha richiesto il recupero dei sondaggi creati tramite il tuo indirizzo e-mail.",
"Polls saved inside this browser": "Sondaggio salvato nel browser",
"Polls sent": "Sondaggi inviati",
"Send me my polls": "Inviare i miei sondaggi"
"Remove all polls from this browser": "Rimuovi tutti i sondaggi dalla memoria del browser",
"Remove poll from index": "Rimuovi il sondaggio dalla memoria",
"Send me my polls": "Invia i miei sondaggi",
"Send my polls by email": "Invia i mi ei sondaggi per e-mail",
"There are no polls saved inside your browser yet": "Non ci sono ancora sondaggi salvati nel tuo browser",
"Title": "Titolo",
"Visited polls": "Sondaggi visitati"
},
"Generic": {
"(in the format name@mail.com)": "(nel formato nome@mail.com)",
@ -173,8 +194,8 @@
"Add": "Aggiungere",
"Back": "Precedente",
"Back to the homepage of": "Ritornare all'home page",
"Cancel": "Annullare",
"Caption": "Titolo",
"Cancel": "Annulla",
"Caption": "Informazioni",
"Choice": "Scelta",
"Classic": "Classico",
"Close": "Chiudere",
@ -188,20 +209,20 @@
"Ifneedbe": "Se necessario",
"Legend:": "Legenda:",
"Link": "Link",
"Make your polls": "Organizzare degli appuntamenti semplicemente,liberamente.",
"Make your polls": "Crea il tuo sondaggio",
"Markdown": "Markdown",
"Next": "Continua",
"No": "No",
"Page generated in": "Pagina generata in",
"Poll": "Sondaggio",
"Remove": "Cancellare",
"Save": "Salvare",
"Search": "Cercare",
"Remove": "Cancella",
"Save": "Salva",
"Search": "Cerca",
"Time": "Orario",
"Validate": "Confermare",
"Validate": "Conferma",
"Yes": "Sì",
"Your email address": "Il vostro indirizzo e-mail",
"Your name": "Il vostro nome",
"Your email address": "Il tuo indirizzo e-mail",
"Your name": "Il tuo nome",
"days": "giorni",
"for": "per",
"months": "mesi",
@ -218,10 +239,13 @@
"Installation": {
"AppMail": "Indirizzo e-mail dell'applicazione",
"AppName": "Nome dell'applicazione",
"CleanUrl": "Clean URL",
"Database": "Database name",
"DbConnectionString": "Stringa di connessione",
"CleanUrl": "Cancella URL",
"Database": "Nome del database",
"DbDriver": "Database driver",
"DbHost": "Hostname del database",
"DbName": "Nome del database",
"DbPassword": "Password",
"DbPort": "Database port",
"DbPrefix": "Prefisso",
"DbUser": "Utente",
"DefaultLanguage": "Lingua predefinita",
@ -235,23 +259,23 @@
"Select the language": "Scegliere la lingua"
},
"Mail": {
"Author's message": "Riservato all'autore",
"Author's message": "Messaggio per l'autore",
"FOOTER": "« La strada è lunga, ma la via è libera… »<br/> Framasoft vive solo grazie alle vostre donazioni.<br/> Grazie in anticipo per il vostro sostegno https://soutenir.framasoft.org.",
"For sending to the polled users": "Per diffondere ai partecipanti al sondaggio",
"Notification of poll: %s": "Notifica di sondaggio: %s",
"Poll's participation: %s": "Partecipazione al sondaggio: %s",
"Someone just change your poll available at the following link %s.": "Qualcuno ha appena cambiato il vostro sondaggio disponibile al seguente link <a href=\"%1$s\">%1$s</a>.",
"Someone just delete your poll %s.": "Qualcuno ha appena cancellato il vostro sondaggio \"%s\".",
"Thanks for filling the poll at the link above": "Vi chiediamo di partecipare al sondaggio all'indirizzo seguente",
"Thanks for filling the poll at the link above": "Grazie per la tua partecipazione al sondaggio al seguente link",
"Thanks for your trust.": "Grazie per la vostra fiducia.",
"This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.": "Questo è il messaggio che deve essere inviato ai partecipanti. \nPotete ora inviare questo messaggio a tutte le persone a cui volete chiedere il voto.",
"This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above": "Questo messaggio NON deve essere diffuso ai partecipanti. È riservato all'autore del sondaggio.\n\nPotete modificare questo sondaggio all'indirizzo seguente ",
"You have changed the settings of your poll. \nYou can modify this poll with this link": "Avete modificato la configurazione del vostro sondaggio. \nPotete modificare questo sondaggio con le Link seguente",
"This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above": "Questo messaggio NON deve essere inviato ai partecipanti. Si dovrebbe tenere privato.<br/><br/>Puoi modificare il tuo sondaggio al seguente link",
"You have changed the settings of your poll. \nYou can modify this poll with this link": "Avete modificato la configurazione del vostro sondaggio.<br/>\nPotete modificare questo sondaggio dal seguente Link",
"[ADMINISTRATOR] New settings for your poll": "[AMMINISTRATORE] Modifica di configurazione del sondaggio",
"filled a vote.\nYou can find your poll at the link": "ha appena votato.\nPotete trovare il vostro sondaggio con il link seguente",
"filled a vote.\nYou can find your poll at the link": "Voto aggiunto.<br/>\nPuoi visualizzare il sondaggio con il link seguente",
"hast just created a poll called": "È stato creato un sondaggio intitolato ",
"updated a vote.\nYou can find your poll at the link": "ha appena aggiornato un voto.\nPotete trovare il vostro sondaggio con il link seguente",
"wrote a comment.\nYou can find your poll at the link": "ha appena inserito un commento.\nPotete trovare il vostro sondaggio con il link seguente"
"updated a vote.\nYou can find your poll at the link": "hai appena aggiornato un voto.<br/>\nPuoi trovare il tuo sondaggio con il link seguente",
"wrote a comment.\nYou can find your poll at the link": "hai appena inserito un commento.<br/>\nPuoi trovare il tuo sondaggio con al link seguente"
},
"Maintenance": {
"Thank you for your understanding.": "Grazie per la vostra comprensione.",
@ -262,28 +286,31 @@
"Password": "Password",
"Submit access": "Accesso",
"Wrong password": "Password sbagliata.",
"You have to provide a password so you can participate to the poll.": "Dovete inserire la password per poter partecipare a questo sondaggio.",
"You have to provide a password to access the poll.": "Dovete inserire la password per accedere a questo sondaggio."
"You have to provide a password so you can participate to the poll.": "Devi inserire la password per poter partecipare a questo sondaggio.",
"You have to provide a password to access the poll.": "Devi inserire la password per accedere a questo sondaggio."
},
"Poll results": {
"Addition": "Somma",
"%s option": "%s option",
"Addition": "Totale",
"Anyone will be able to access your email address after your vote": "Chiunque può vedere il tuo indirizzo mail dopo il tuo voto",
"Best choice": "Scelta migliore",
"Best choices": "Scelte migliori",
"Chart": "Grafico",
"Display the chart of the results": "Mostra il grafico dei risultati",
"Edit the line: %s": "Modificare la riga : %s",
"Link to edit this particular line": "Link to edit this particular line",
"Link to edit this particular line has been copied inside the clipboard!": "The link to edit this particular line has been copied to the clipboard!",
"Link to edit this particular line": "Link per modificare questa linea",
"Link to edit this particular line has been copied inside the clipboard!": "Il link per modificare questa linea è stato copiato negli appunti!",
"Remove the line:": "Eliminare la riga :",
"Save the choices": "Salvare le scelte",
"Scroll to the left": "Spostare a sinistra",
"Scroll to the right": "Spostare a destra",
"The best choice at this time is:": "La migliore scelta per ora è:",
"The bests choices at this time are:": "Le migliori scelte per ora sono:",
"Vote ifneedbe for": "Vote under reserve for",
"Vote ifneedbe for": "Voti sotto riserva per",
"Vote no for": "Scegliere \"no\" per",
"Vote yes for": "Scegliere \"sì\" per",
"Votes of the poll": "Voti del sondaggio ",
"Warning : anyone can access to your email address after voting": "Warning: Anyone can see your email address after voting",
"polled user": "Votante",
"polled users": "Votanti"
},
@ -295,6 +322,8 @@
"Cancel the name edit": "Annulla il cambio di nome",
"Cancel the rules edit": "Annullare le modifica dei permessi",
"Cancel the title edit": "Annullare la modifica del titolo",
"Collect of the polled users email addresses": "Collec the polled users' email addresses",
"Collecting the polled users emails": "Memorizza gli indirizzi mail dei votanti",
"Edit the description": "Modificare la descrizione",
"Edit the email adress": "Modificare l'email",
"Edit the expiration date": "Cambiare la data di scadenza",
@ -305,8 +334,9 @@
"Expiration date": "Data di scadenza",
"Export to CSV": "Esportare in CSV",
"Initiator of the poll": "Autore del sondaggio",
"No collect of the polled users email addresses": "The polled users' email addresses are not collected",
"No password": "Nessuna password",
"Only votes are protected": "Solo voti sono protetti",
"Only votes are protected": "Solo i voti sono protetti",
"Password protected": "Protetto da una password",
"Poll rules": "Permessi del sondaggio",
"Print": "Stampare",
@ -317,25 +347,36 @@
"Remove the poll": "Eliminare il sondaggio",
"Results are hidden": "I risultati sono nascosti",
"Results are visible": "I risultati sono visibili",
"Rich editor": "IT_Editeur avancé",
"Rich editor": "Editor avanzato",
"Save the description": "Salvare la descrizione",
"Save the email address": "Salvare l'email",
"Save the new expiration date": "Salvare la data di scadenza",
"Save the new name": "Salvare il nuovo nome",
"Save the new rules": "Salvare i nuovi permessi",
"Save the new title": "Salvare il nuovo titolo",
"Simple editor": "IT_Editeur simple",
"Title": "Titolo",
"Simple editor": "Editor semplice",
"Title": "Titolo del sondaggio",
"Voters email adresses are collected": "Voters' email adresses are collected",
"Voters email adresses are collected and required": "Voters' email adresses are collected and required",
"Voters email adresses are collected, required and verified": "Voters' email adresses are collected, required and verified",
"Voters email adresses are not collected": "Voters' email adresses are not collected",
"Votes and comments are locked": "I voti e i commenti sono bloccati",
"Votes protected by password": "Voti protetti da una password"
},
"Step 1": {
"All voters can modify any vote": "Tutti i votanti possono cambiare tutti i voti",
"Collect the polled users email addresses": "Memorizza gli indirizzi mail dei votanti",
"Collect users email": "Memorizza gli indirizzi mail degli utenti",
"Collect voters email": "Collect voters' email addresses",
"Customize the URL": "Personalizzare il link",
"Email addresses are collected but not required": "Email addresses are collected but not required",
"Email addresses are not collected": "Email addresses are not collected",
"Email addresses are required": "Email addresses are required",
"Email addresses are required and verified": "Email addresses are required and verified",
"Go to step 2": "Andare al punto 2",
"Limit the amount of voters per option": "Limitate la quantità di votanti per opzione",
"More informations here:": "IT_Plus d'informations ici :",
"Only the poll maker can see the poll's results": "Solo il creatore sondaggio possono vedere i risultati",
"More informations here:": "Maggiori informazioni qui:",
"Only the poll maker can see the poll's results": "Solo il creatore sondaggio p vedere i risultati",
"Optional parameters": "Parametri opzionali",
"Password choice": "Scelta della password",
"Password confirmation": "Conferma della password",
@ -348,16 +389,18 @@
"Poll title": "Titolo del sondaggio",
"Required fields cannot be left blank.": "Riempire i campi obbligatori, segnati con *.",
"The results are publicly visible": "I risultati sono visibili senza password",
"To make the description more attractive, you can use the Markdown format.": "IT_Afin de rendre le descriptif de ce sondage plus attractif, vous pouvez utiliser le formatage Markdown.",
"To make the description more attractive, you can use the Markdown format.": "Per rendere la descrizione più gradevole, puoi usare la sintassi Markdown.",
"To receive an email for each new comment": "Per ricevere una e-mail per ogni nuovo commento",
"To receive an email for each new vote": "Per ricevere un'email per ogni nuovo voto",
"Use a password to restrict access": "Utilizzare una passwor per limitare l'accesso al sondaggio",
"Value Max": "Value Max",
"ValueMax instructions": "elettori per opzione",
"Use a password to restrict access": "Utilizza una password per limitare l'accesso al sondaggio",
"Value Max": "Valore massimos",
"ValueMax instructions": "Limitare la quantità di votanti per opzione",
"Voters can modify their vote themselves": "I partecipanti possono modificare il loro voto in autonomia",
"Votes cannot be modified": "Nessun voto può essere modificato",
"You are in the poll creation section.": "Avete scelto di creare un nuovo sondaggio.",
"You can enable or disable the editor at will.": "IT_Vous pouvez activer ou désactiver l'éditeur à votre guise."
"Warning : anyone can access to the polled users's email addresses.": "Warning: Anyone can see the polled users' email addresses.",
"Warning: anyone can access the polled users email addresses since all voters can modify any vote. You should restrict permission rules.": "Attenzione: chiunque può vedere gli indirizzi mail degli utenti fino a quando i votanti possono modificare la propria scelta. Si devono impostare delle regole di accesso.",
"You are in the poll creation section.": "Hai scelto di creare un nuovo sondaggio.",
"You can enable or disable the editor at will.": "Puoi abilitare o disabilitare l'editor"
},
"Step 2": {
"Back to step 1": "Torna al punto 1",
@ -368,20 +411,20 @@
"Add a link or an image": "Aggiungi un collegamento o di un'immagine",
"Alternative text": "Testo alternativo",
"It's possible to propose links or images by using": "E 'possibile inserire link o immagini utilizzando",
"Poll subjects (2 on 3)": "Scelta dei soggetti (2 di 3)",
"Poll subjects (2 on 3)": "Scelta delle opzioni (2 di 3)",
"Remove a choice": "Eliminare l'ultima scelta",
"These fields are optional. You can add a link, an image or both.": "Questi campi sono facoltativi. Potete aggiungere un link, un'immagine o entrambi.",
"To make a generic poll you need to propose at least two choices between differents subjects.": "Per creare un rilevamento convenzionale, è necessario fornire almeno due scelte diverse.",
"These fields are optional. You can add a link, an image or both.": "Questi campi sono facoltativi. Puoi aggiungere un link, un'immagine o entrambi.",
"To make a generic poll you need to propose at least two choices between differents subjects.": "Per creare un sondaggio convenzionale, è necessario fornire almeno due scelte diverse.",
"URL of the image": "URL dell'immagine",
"You can add or remove additional choices with the buttons": "Potete aggiungere o eliminare delle scelte ulteriori con i pulsanti",
"the Markdown syntax": "la sintassi Markdown"
"You can add or remove additional choices with the buttons": "Puoi aggiungere o eliminare delle scelte ulteriori con i pulsanti",
"the Markdown syntax": "Sintassi Markdown"
},
"Step 2 date": {
"Add a day": "Aggiungere un giorno",
"Add an hour": "Aggiungere un orario",
"Choose the dates of your poll": "Scegliete le date del vostro sondaggio",
"Copy hours of the first day": "Copiare gli orari del primo giorno",
"For each selected day, you can choose, or not, meeting hours (e.g.: \"8h\", \"8:30\", \"8h-10h\", \"evening\", etc.)": "Per ogni giorno selezionato, avete la possibilità di scegliere o meno, le ore dell'incontro (per esempio : \"8h\", \"8:30\", \"8h-10h\", \"sera\", etc.)",
"Choose the dates of your poll": "Scegli le date del tuo sondaggio",
"Copy hours of the first day": "Copia gli orari del primo giorno",
"For each selected day, you can choose, or not, meeting hours (e.g.: \"8h\", \"8:30\", \"8h-10h\", \"evening\", etc.)": "Per ogni giorno selezionato, hai la possibilità di scegliere o meno, le ore dell'incontro (per esempio : \"8h\", \"8:30\", \"8h-10h\", \"sera\", etc.)",
"Poll dates (2 on 3)": "Scelta delle date (2 di 3)",
"Remove a day": "Eliminare l'ultimo giorno",
"Remove all days": "Cancellare tutti i giorni",
@ -389,66 +432,76 @@
"Remove an hour": "Eliminare l'ultimo orario",
"Remove this day": "Eliminare questo giorno",
"To schedule an event you need to propose at least two choices (two hours for one day or two days).": "Per creare un evento, è meglio proporre almeno 2 scelte (2 orari per lo stesso giorno o 2 giorni).",
"You can add or remove additionnal days and hours with the buttons": "Potete aggiungere o eliminare dei giorni et orari ulteriori con i pulsanti"
"You can add or remove additionnal days and hours with the buttons": "Puoi aggiungere o eliminare dei giorni et orari ulteriori con i pulsanti"
},
"Step 3": {
"Archiving date:": "Archivio Data:",
"Back to step 2": "Torna al punto 2",
"Confirm the creation of your poll": "Confermate la creazione del vostro sondaggio",
"Create the poll": "Creare il sondaggio",
"List of your choices": "Liste delle vostre scelte",
"Once you have confirmed the creation of your poll, you will be automatically redirected on the administration page of your poll.": "Un volta che avrete confermato la creazione del sondaggio, sarete rediretti automaticamente sulla pagina di amministrazione del vostro sondaggio.",
"Confirm the creation of your poll": "Conferma la creazione del tuo sondaggio",
"Create the poll": "Crea il sondaggio",
"List of your choices": "Liste delle tue scelte",
"Once you have confirmed the creation of your poll, you will be automatically redirected on the administration page of your poll.": "Un volta che hai confermato la creazione del sondaggio, sarai reindirizzati automaticamente sulla pagina di amministrazione del tuo sondaggio.",
"Removal date and confirmation (3 on 3)": "Data di scadenza e conferma (3 di 3)",
"Then, you will receive quickly two emails: one contening the link of your poll for sending it to the voters, the other contening the link to the administration page of your poll.": "Nello stesso momento, riceverete 2 email : una con il Link verso il vostro sondaggio da inoltrare ai partecipanti, l'altra con il Link verso la pagina di amministrazione del sondaggio.",
"Then, you will receive quickly two emails: one contening the link of your poll for sending it to the voters, the other contening the link to the administration page of your poll.": "Nello stesso momento, riceverai 2 email : una con il Link verso il tuo sondaggio da inoltrare ai partecipanti, l'altra con il Link verso la pagina di amministrazione del sondaggio.",
"You can set a closer archiving date for it.": "Si può decidere su una data più vicina di archiviazione.",
"Your poll will automatically be archived": "Il vostro sondaggio sarà archiviato automaticamente",
"Your poll will be automatically archived in %d days.": "Il vostro sondaggio verrà archiviata automaticamente in %d giorni.",
"after the last date of your poll.": "dopo l'ultimo giorno del vostro sondaggi"
"Your poll will automatically be archived": "Il tuo sondaggio sarà archiviato automaticamente",
"Your poll will be automatically archived in %d days.": "Il tuo sondaggio verrà archiviata automaticamente in %d giorni.",
"after the last date of your poll.": "dopo l'ultimo giorno del tuo sondaggio"
},
"adminstuds": {
"Add a column": "Aggiungere una colonna",
"All comments deleted": "Tutti i commenti sono stati cancellati",
"All votes deleted": "Tutti i voti sono stati rimossi",
"As poll administrator, you can change all the lines of this poll with this button": "Essendo l'amministratore, potete modificare tutte le righe di questo sondaggio con questo pulsante",
"As poll administrator, you can change all the lines of this poll with this button": "Essendo l'amministratore, puoi modificare tutte le righe di questo sondaggio con questo pulsante",
"Back to the poll": "Torna al sondaggio",
"Choice added": "Scelta aggiunto",
"Choice added": "Scelta aggiunta",
"Collect the emails of the polled users for the choice": "Raccogli le mail degli utenti che hanno scelto questa opzione",
"Collect the emails of the polled users for this column": "Collect the email addresses of the polled users for this column",
"Column removed": "Colonna rimossa",
"Column's adding": "Aggiunta di una colonna",
"Comment deleted": "Commento rimosso",
"Confirm removal of all comments of the poll": "Confermare l'eliminazione di tutti i commenti da questo sondaggio",
"Confirm removal of all comments of the poll": "Confermare l'eliminazione di tutti i commenti di questo sondaggio",
"Confirm removal of all votes of the poll": "Confermare l'eliminazione di tutti i voti del sondaggio",
"Confirm removal of the column.": "Confermare l'eliminazione della colonna.",
"Confirm removal of the poll": "Confermare l'eliminazione del sondaggio ",
"Delete the poll": "Elimino il sondaggio",
"Delete the poll": "Delete poll",
"Finally, you can change the informations of this poll like the title, the comments or your email address.": "Potete infine modificare le informazioni relative a questo sondaggio come il titolo, i commenti o la vostra email.",
"If you just want to add a new hour to an existant date, put the same date and choose a new hour.": "Se voleste aggiungere solo un orario a una data già presente, potreste inserire la stessa data et scegliere un altro orario. Sarà aggiunto al sondaggio esistente.",
"Keep comments": "Tenere commenti",
"Keep the comments": "Tenere commenti",
"Keep the poll": "Tenere il sondaggio",
"Keep the votes": "Tenere voti",
"Keep this poll": "Mantengo questo sondaggio !",
"Keep this poll": "Mantengo questo sondaggio",
"Keep votes": "Tenere voti",
"Poll fully deleted": "Sondaggio completamente rimosso",
"Poll saved": "Sondaggio protetta",
"Poll saved": "Sondaggio salvato",
"Remove the column": "Cancellare la colonna",
"Remove the comments": "Eliminare i commenti",
"Remove the votes": "Rimuovere voti",
"The poll is created.": "The poll was created.",
"Remove the votes": "Rimuovere i voti",
"The poll is created.": "Il sondaggio è stato creato.",
"Vote added": "Voto aggiunto",
"Vote deleted": "Voto cancellato",
"Vote updated": "Voto aggiornato",
"You can add a new scheduling date to your poll.": "Potete aggiungere una data al vostro sondaggio.",
"Your poll has been removed!": "Il vostro sondaggio è stato eliminato !",
"You can add a new scheduling date to your poll.": "Puoi aggiungere una data al tuo sondaggio.",
"Your poll has been removed!": "Il tuo sondaggio è stato eliminato!",
"and add a new column with": "e se vi foste dimenticati di inserire una scelta, potreste aggiungere una colonna cliccando su",
"remove a column or a line with": " cancellare una colonna o una riga con "
},
"display_mails": {
"People who have answered 'If need be' to this option have left those email addresses :": "Users who voted 'If need be' for this option have left those email addresses:",
"People who have answered 'If need be' to this option have not left any email addresses.": "Users who voted 'If need be' for this option have not left any email addresses:",
"People who have answered 'No' to this option have left those email addresses :": "Users who voted 'No' for this option have left those email addresses:",
"People who have answered 'No' to this option have not left any email addresses.": "Users who voted 'No' for this option have not left any email addresses.",
"People who have answered 'Yes' to this option have left those email addresses :": "Users who voted 'Yes' for this option have left those email addresses:",
"People who have answered 'Yes' to this option have not left any email addresses.": "Users who voted 'Yes' for this option have not left any email addresses."
},
"studs": {
"Adding the vote succeeded": "L'aggiunta del voto ha avuto successo",
"Deletion date:": "Data di cancellazione:",
"If you want to vote in this poll, you have to give your name, choose the values that fit best for you and validate with the plus button at the end of the line.": "Per partecipare a questo sondaggio, è necessario inserire vostro nome, scegliere tutti i parametri che preferite e confermare la vostra scelta con il pulsante alla fine della riga.",
"POLL_LOCKED_WARNING": "L'amministratore ha bloccato questa indagine. Voti e commenti sono congelati, non è più possibile partecipare",
"The poll is expired, it will be deleted soon.": "Il sondaggio è scaduto, sarà presto rimosso.",
"Update vote succeeded": "Aggiornamento del voto di successo",
"Update vote succeeded": "Aggiornamento del voto effettuato",
"Your vote has been registered successfully, but be careful: regarding this poll options, you need to keep this personal link to edit your own vote:": "Il tuo voto è stato preso in considerazione, ma attenzione: questa indagine consente la modifica del voto solo con il seguente link personalizzato; tenerlo al sicuro!"
}
}

View File

@ -31,13 +31,14 @@
"Back to administration": "Terug naar beheerpagina",
"Change the poll": "Bewerk poll",
"Confirm removal of the poll": "Bevestig het verwijderen van de poll",
"Deleted the poll": "Verwijder poll",
"Deleted the poll": "Poll deleted",
"Email": "Email",
"Executed": "Uitgevoerd",
"Expiration date": "Vervaldatum",
"Fail": "Gefaald",
"Failed:": "Gefaald:",
"Format": "Formaat",
"Installation": "NL_Installation",
"Installation": "Installatie",
"Logs": "Logs",
"Migration": "Migratie",
"Nothing": "Niets",
@ -49,11 +50,13 @@
"Purged:": "Leeggemaakt:",
"See the poll": "Ga naar poll",
"Skipped:": "Overgeslagen:",
"Status": "Status",
"Succeeded:": "Gelukt:",
"Success": "Gelukt",
"Summary": "Samenvatting",
"Title": "Titel van de poll",
"Votes": "stemmen",
"Title": "Titel",
"Votes": "Stemmen",
"Waiting": "Aan het wachten",
"polls in the database at this time": "polls in de database op dit moment"
},
"Check": {
@ -83,6 +86,7 @@
"Comments of polled people": "Opmerkingen",
"Remove the comment": "Verwijder opmerking",
"Send the comment": "Opmerking opslaan",
"Type your name and a comment to send it": "Vul je naam en een opmerking in voor het formulier in te dienen",
"Your comment": "Jouw opmerking",
"anonyme": "anoniem"
},
@ -122,13 +126,13 @@
"Enter a name and a comment!": "Vul een naam en een opmerking in!",
"Enter a title": "Voer een titel in",
"Enter an email address": "Voer een emailadres in",
"Error on amount of voters limitation : value must be an integer greater than 0": "Error on amount of voters limitation: Value must be an integer greater than 0",
"Error on amount of voters limitation : value must be an integer greater than 0": "Fout over de hoeveelheid stemmen: waarde moet een getal groter dan 0 zijn.",
"Error!": "Fout!",
"Failed to delete all comments": "Failed to delete all comments",
"Failed to delete all votes": "Failed to delete all votes",
"Failed to delete all comments": "Het is niet gelukt om alle opmerkingen te verwijderen",
"Failed to delete all votes": "Het is niet gelukt om alle stemmen te verwijderen",
"Failed to delete column": "Kolom verwijderen mislukt",
"Failed to delete the comment": "Failed to delete the comment",
"Failed to delete the poll": "Failed to delete the poll",
"Failed to delete the comment": "Het is niet gelukt om de opmerking te verwijderen",
"Failed to delete the poll": "Het is niet gelukt om de poll te verwijderen",
"Failed to delete the vote!": "Het is niet gelukt de stem te verwijderen!",
"Failed to insert the comment!": "Het is niet gelukt om de opmerking in te voegen!",
"Failed to save poll": "Opslaan van de poll gefaald",
@ -143,29 +147,46 @@
"Poll id already used": "Deze ID is reeds gebruikt",
"Something is going wrong...": "Er is iets foutgegaan...",
"Something is wrong with the format": "Er is iets foutgegaan met het formaat",
"Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Something is wrong with the format: Customized URLs should only consist of alphanumeric characters and hyphens.",
"Something is wrong with the format: name shouldn't have any spaces before or after": "Something is wrong with the format: name shouldn't have any spaces before or after",
"Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Er is iets fout gegaan met het formaat: persoonlijke URLs mogen enkel alfanumerieke tekens en streepjes bevatten.",
"Something is wrong with the format: name shouldn't have any spaces before or after": "Er is iets fout gegaan met het formaat: de naam mag vooraan of achteraan geen spaties bevatten",
"The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.": "Het adres is niet juist! Je moet een geldig emailadres invoeren (zoals r.stallman@outlock.com) zodat je de link naar je poll kan ontvangen.",
"The column already exists": "De kolom bestaat reeds",
"The name is invalid.": "De naam is niet geldig.",
"The name you've chosen already exist in this poll!": "De naam die je hebt gekozen, bestaat al in deze poll!",
"There is a problem with your choices": "Er is een probleem met je keuzes",
"This id is not allowed": "This identifier is not allowed",
"This poll doesn't exist !": "Deze poll bestaat niet!",
"Update vote failed": "Wijzigen stem gefaald",
"You already voted": "Je hebt al gestemd",
"You can't create a poll with hidden results with the following edition option:": "Je kan geen poll met verborgen resultaten maken met de volgende optie: ",
"You can't select more than %d dates": "Je kan niet meer dan %d dagen kiezen",
"You haven't filled the first section of the poll creation, or your session has expired.": "Je hebt het eerste deel van de poll niet ingevuld, of je sessie is verlopen.",
"You haven't filled the first section of the poll creation.": "Je hebt het eerste gedeelte van de poll niet ingevuld.",
"Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry.": "Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry."
},
"FindPolls": {
"Address": "Adres",
"Created polls": "Aangemaakte polls",
"Have a good day!": "Tot ziens!",
"Here is the list of the polls that you manage on %s:": "Dit is de lijst van polls die je beheert op %s:",
"If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.": "Indien je dat niet gevraagd hebt en je vermoedt misbruik van de dienst, dan kan je dat melden aan de beheerder op %s.",
"Last access date": "Laatst bezocht",
"List of your polls": "Lijst van jouw polls",
"Local Storage Help": "Om je vorige polls makkelijk terug te vinden, bewaren we elke poll die je aanmaakt of bezoekt in je browser. Deze informatie wordt enkel in deze browser opgeslagen. De volgende informatie zal worden bewaard:",
"Local Storage Help Delete": "Om deze informatie te verwijderen klik je op het vuilbakje op de overeenkomstige lijn of klik je op de « verwijder mijn polls uit het geheugen » optie. Je polls zelf worden hierdoor niet verwijderd.",
"Local Storage Help Information Accessed": "De datum waarop de poll aangemaakt of laatst bezocht is",
"Local Storage Help Information Address": "Het adres",
"Local Storage Help Information Title": "De titel van de poll",
"PS: this email has been sent because you or someone else asked to get back the polls created with your email address.": "PS: deze email werd verstuurd omdat jij of iemand anders gevraagd hebt om een lijst van polls te ontvangen die gemaakt werden om jouw emailadres.",
"Polls saved inside this browser": "Polls bewaard in deze browser",
"Polls sent": "Polls verstuurd",
"Send me my polls": "Stuur me mijn polls"
"Remove all polls from this browser": "Verwijder al mijn polls uit het geheugen van deze browser",
"Remove poll from index": "Verwijder de poll uit het geheugen",
"Send me my polls": "Stuur me mijn polls",
"Send my polls by email": "Verzend mijn polls via email",
"There are no polls saved inside your browser yet": "Er zijn nog geen polls bewaard in je browser",
"Title": "Titel",
"Visited polls": "Bezochte polls"
},
"Generic": {
"(in the format name@mail.com)": "(in het formaat naam@mail.com)",
@ -174,7 +195,7 @@
"Back": "Vorige",
"Back to the homepage of": "Terug naar de homepage van",
"Cancel": "Annuleren",
"Caption": "Legende",
"Caption": "Informatie",
"Choice": "Keuze",
"Classic": "Klassiek",
"Close": "Sluiten",
@ -188,7 +209,7 @@
"Ifneedbe": "Indien nodig",
"Legend:": "Legenda:",
"Link": "Link",
"Make your polls": "Maak je polls en datumprikkers",
"Make your polls": "Maak je eigen polls aan",
"Markdown": "Markdown",
"Next": "Volgende",
"No": "Nee",
@ -219,9 +240,12 @@
"AppMail": "Mailadres van de applicatie",
"AppName": "Naam van de applicatie",
"CleanUrl": "Schone URL",
"Database": "Gegevensbank",
"DbConnectionString": "Verbindingstekenreeks",
"Database": "Database naam",
"DbDriver": "Database driver",
"DbHost": "Database hostname",
"DbName": "Database naam",
"DbPassword": "Paswoord",
"DbPort": "Database port",
"DbPrefix": "Prefix",
"DbUser": "Gebruiker",
"DefaultLanguage": "Standaardtaal",
@ -235,17 +259,17 @@
"Select the language": "Selecteer taal"
},
"Mail": {
"Author's message": "Bericht van de auteur",
"FOOTER": "\"The road is long, but the way is clear…\"<br/>Framasoft lives only by your donations.<br/>Thank you in advance for your support https://soutenir.framasoft.org",
"Author's message": "Bericht voor de autheur",
"FOOTER": "\"Het is een lange weg, maar de doel is duidelijk...\"<br/>Framasoft overleeft enkel door jouw donaties.<br/>Alvast bedankt voor je ondersteuning https://soutenir.framasoft.org",
"For sending to the polled users": "Link voor deelnemers",
"Notification of poll: %s": "Bericht van poll: %s",
"Poll's participation: %s": "Poll deelname: %s",
"Someone just change your poll available at the following link %s.": "Iemand heeft je poll aangepast op de volgende link <a href=\"%1$s\">%1$s</a>.",
"Someone just delete your poll %s.": "Iemand heeft zojuist je poll verwijderd \"%s\".",
"Thanks for filling the poll at the link above": "Vul de poll in via bovenstaande link",
"Thanks for filling the poll at the link above": "Bedankt om deel te nemen aan de poll op de volgende link",
"Thanks for your trust.": "Bedankt voor je vertrouwen.",
"This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.": "Dit is het bericht dat je kunt doorsturen aan de deelnemers van je poll.",
"This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above": "Dit bericht moet je NIET doorsturen aan de deelnemers. Hou dit voor jezelf. <br/><br/>Je kan de poll aanpassen met bovenstaande link.",
"This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above": "Verzend dit bericht NIET naar de poll deelnemers. Je houdt het best privé.<br/><br/>Je kan je poll aanpassen op de volgende link",
"You have changed the settings of your poll. \nYou can modify this poll with this link": "Je hebt de instellingen van je poll aangepast.<br/>Je kan de poll aanpassen via deze link ",
"[ADMINISTRATOR] New settings for your poll": "[ADMINISTRATOR] Nieuwe instellingen voor je poll",
"filled a vote.\nYou can find your poll at the link": "heeft een stem toegevoegd.<br/>Je kan je poll bezoeken op",
@ -266,24 +290,27 @@
"You have to provide a password to access the poll.": "Je moet een wachtwoord opgeven om toegang te krijgen tot deze poll."
},
"Poll results": {
"%s option": "%s option",
"Addition": "Totaal",
"Anyone will be able to access your email address after your vote": "Iedereen zal je e-mailadres kunnen zien nadat je gestemd hebt",
"Best choice": "Beste keuze",
"Best choices": "Beste keuzes",
"Chart": "Grafiek",
"Display the chart of the results": "Toon de grafiek met resultaten",
"Edit the line: %s": "Bewerk regel: %s",
"Link to edit this particular line": "Link to edit this particular line",
"Link to edit this particular line has been copied inside the clipboard!": "The link to edit this particular line has been copied to the clipboard!",
"Link to edit this particular line": "Link om deze lijn aan te passen",
"Link to edit this particular line has been copied inside the clipboard!": "De link om deze lijn aan te passen is gekopieerd naar het klembord!",
"Remove the line:": "Verwijder regel:",
"Save the choices": "Keuzes opslaan",
"Scroll to the left": "Scroll naar links",
"Scroll to the right": "Scroll naar rechts",
"The best choice at this time is:": "De beste keuze is op dit moment:",
"The bests choices at this time are:": "De beste keuzes zijn op dit moment:",
"Vote ifneedbe for": "Vote under reserve for",
"Vote ifneedbe for": "Stem als nodig voor",
"Vote no for": "Stem nee voor",
"Vote yes for": "Stem ja voor",
"Votes of the poll": "Stemmen",
"Warning : anyone can access to your email address after voting": "Warning: Anyone can see your email address after voting",
"polled user": "ondervraagde gebruiker",
"polled users": "ondervraagde gebruikers"
},
@ -295,6 +322,8 @@
"Cancel the name edit": "Naam bewerken annuleren",
"Cancel the rules edit": "Regels bewerken annuleren",
"Cancel the title edit": "Titel bewerken annuleren",
"Collect of the polled users email addresses": "Collec the polled users' email addresses",
"Collecting the polled users emails": "E-mailadressen van de gepolde gebruikers aan het verzamelen",
"Edit the description": "Bewerk de beschrijving",
"Edit the email adress": "Bewerk emailadres",
"Edit the expiration date": "Bewerk de vervaldatum",
@ -305,6 +334,7 @@
"Expiration date": "Vervaldatum",
"Export to CSV": "Exporteer naar CSV",
"Initiator of the poll": "Initiatiefnemer van deze poll",
"No collect of the polled users email addresses": "The polled users' email addresses are not collected",
"No password": "Geen wachtwoord",
"Only votes are protected": "Only votes are protected",
"Password protected": "Beveiligd met een wachtwoord",
@ -317,24 +347,35 @@
"Remove the poll": "Verwijder de poll",
"Results are hidden": "Resultaten zijn verborgen.",
"Results are visible": "Resultaten zijn zichtbaar.",
"Rich editor": "Rich editor",
"Rich editor": "Geavanceerde editor",
"Save the description": "Beschrijving opslaan",
"Save the email address": "Emailadres opslaan",
"Save the new expiration date": "Nieuwe vervaldatum opslaan",
"Save the new name": "Nieuwe naam opslaan",
"Save the new rules": "Nieuwe regels opslaan",
"Save the new title": "Nieuwe titel opslaan",
"Simple editor": "Simple editor",
"Simple editor": "Simpele editor",
"Title": "Titel van de poll",
"Voters email adresses are collected": "Voters' email adresses are collected",
"Voters email adresses are collected and required": "Voters' email adresses are collected and required",
"Voters email adresses are collected, required and verified": "Voters' email adresses are collected, required and verified",
"Voters email adresses are not collected": "Voters' email adresses are not collected",
"Votes and comments are locked": "Stemmen en opmerkingen zijn uitgeschakeld",
"Votes protected by password": "Stemmen beveiligd met een wachtwoord"
},
"Step 1": {
"All voters can modify any vote": "Alle stemmers kunnen elke stem aanpassen",
"Collect the polled users email addresses": "E-mailadressen van de gepolde gebruikers aan het verzamelen",
"Collect users email": "Verzamel de e-mailadressen van gebruikers",
"Collect voters email": "Collect voters' email addresses",
"Customize the URL": "Link verpersoonlijken",
"Email addresses are collected but not required": "Email addresses are collected but not required",
"Email addresses are not collected": "Email addresses are not collected",
"Email addresses are required": "Email addresses are required",
"Email addresses are required and verified": "Email addresses are required and verified",
"Go to step 2": "Ga naar stap 2",
"Limit the amount of voters per option": "Limit the amount of voters per option",
"More informations here:": "More informations here:",
"Limit the amount of voters per option": "Limiteer het aantal stemmen per optie",
"More informations here:": "Meer informatie is hier te vinden:",
"Only the poll maker can see the poll's results": "Alleen degene die de poll aangemaakt heeft kan de resultaten zien",
"Optional parameters": "Optionele parameters",
"Password choice": "Keuze",
@ -348,16 +389,18 @@
"Poll title": "Poll titel",
"Required fields cannot be left blank.": "Verplichte velden kunnen niet leeg blijven.",
"The results are publicly visible": "De resultaten zijn zichtbaar zonder wachtwoord",
"To make the description more attractive, you can use the Markdown format.": "To make the description more attractive, you can use the Markdown format.",
"To make the description more attractive, you can use the Markdown format.": "Om je beschrijving aantrekkelijker te maken, kun je het Markdown formaat gebruiken.",
"To receive an email for each new comment": "Ontvang een email bij elke nieuwe opmerking",
"To receive an email for each new vote": "Ontvang een email bij elke nieuwe stem",
"Use a password to restrict access": "Toegang tot poll beperken met een paswoord",
"Value Max": "Value Max",
"ValueMax instructions": "voters per options ",
"Value Max": "Maximum waarde",
"ValueMax instructions": "stemmen per optie",
"Voters can modify their vote themselves": "Stemmers kunnen hun eigen stem aanpassen",
"Votes cannot be modified": "Stemmen kunnen niet worden aangepast",
"Warning : anyone can access to the polled users's email addresses.": "Warning: Anyone can see the polled users' email addresses.",
"Warning: anyone can access the polled users email addresses since all voters can modify any vote. You should restrict permission rules.": "Waarschuwing: Iedereen kan de e-mailadressen van alle stemmers zien, aangezien iedereen alle stemmen kan aanpassen. Je kan best de toegangsregels beperken.",
"You are in the poll creation section.": "Je bent in het onderdeel poll aanmaken.",
"You can enable or disable the editor at will.": "You can enable or disable the editor at will."
"You can enable or disable the editor at will.": "Je kan de editor aan of afzetten wanneer je dat wilt."
},
"Step 2": {
"Back to step 1": "Terug naar stap 1",
@ -374,7 +417,7 @@
"To make a generic poll you need to propose at least two choices between differents subjects.": "Om een poll te maken, moet je tenminste twee keuzes geven.",
"URL of the image": "URL van het plaatje",
"You can add or remove additional choices with the buttons": "Je kan keuzes verwijderen of toevoegen met deze knoppen",
"the Markdown syntax": "Markdown syntax"
"the Markdown syntax": "de Markdown syntax"
},
"Step 2 date": {
"Add a day": "Voeg een dag toe",
@ -412,6 +455,8 @@
"As poll administrator, you can change all the lines of this poll with this button": "Als pollbeheerder kan je alle regels van de poll wijzigen met deze knop",
"Back to the poll": "Terug naar de poll",
"Choice added": "Keuze toegevoegd",
"Collect the emails of the polled users for the choice": "Verzamel de e-mailadressen van de ondervraagde gebruikers voor de optie",
"Collect the emails of the polled users for this column": "Collect the email addresses of the polled users for this column",
"Column removed": "Kolom verwijderd",
"Column's adding": "Een kolom toevoegen",
"Comment deleted": "Opmerking verwijderd",
@ -419,7 +464,7 @@
"Confirm removal of all votes of the poll": "Bevestig het verwijderen van alle stemmen",
"Confirm removal of the column.": "Bevestig de verwijdering van deze kolom.",
"Confirm removal of the poll": "Bevestig het verwijderen van de poll",
"Delete the poll": "Verwijder de poll",
"Delete the poll": "Delete poll",
"Finally, you can change the informations of this poll like the title, the comments or your email address.": "Tenslotte kan je de eigenschappen van deze poll wijzigen, zoals titel, opmerkingen of je emailadres.",
"If you just want to add a new hour to an existant date, put the same date and choose a new hour.": "Als je alleen een nieuwe tijd wil toevoegen aan een bestaande datum, voeg deze datum dan hier toe en kies een nieuwe tijd.",
"Keep comments": "Behoud de opmerkingen",
@ -433,7 +478,7 @@
"Remove the column": "Kolom verwijderen",
"Remove the comments": "Verwijder de opmerkingen",
"Remove the votes": "Verwijder de stemmen",
"The poll is created.": "The poll was created.",
"The poll is created.": "De poll is aangemaakt.",
"Vote added": "Stem toegevoegd",
"Vote deleted": "Stem verwijderd",
"Vote updated": "Stem aangepast",
@ -442,10 +487,18 @@
"and add a new column with": "en voeg een nieuwe kokom toe met",
"remove a column or a line with": "verwijder een kolom of regel met"
},
"display_mails": {
"People who have answered 'If need be' to this option have left those email addresses :": "Users who voted 'If need be' for this option have left those email addresses:",
"People who have answered 'If need be' to this option have not left any email addresses.": "Users who voted 'If need be' for this option have not left any email addresses:",
"People who have answered 'No' to this option have left those email addresses :": "Users who voted 'No' for this option have left those email addresses:",
"People who have answered 'No' to this option have not left any email addresses.": "Users who voted 'No' for this option have not left any email addresses.",
"People who have answered 'Yes' to this option have left those email addresses :": "Users who voted 'Yes' for this option have left those email addresses:",
"People who have answered 'Yes' to this option have not left any email addresses.": "Users who voted 'Yes' for this option have not left any email addresses."
},
"studs": {
"Adding the vote succeeded": "Stem toegevoegd",
"Deletion date:": "Verwijderdatum:",
"If you want to vote in this poll, you have to give your name, choose the values that fit best for you and validate with the plus button at the end of the line.": "Als je wil stemmen in deze poll, moet je je naam opgeven, je keuze maken, en deze opslaan met de plus-knop aan het eind van de regel.",
"If you want to vote in this poll, you have to give your name, choose the values that fit best for you and validate with the plus button at the end of the line.": "Als je wilt stemmen in deze poll, moet je je naam ingeven, een keuze maken en indienen door op de bewaar-knop op het einde van de lijn te klikken.",
"POLL_LOCKED_WARNING": "De beheerder heeft deze poll gesloten. Stemmen en opmerkingen zijn bevroren, je kunt niet meer deelnemen.",
"The poll is expired, it will be deleted soon.": "De poll is verlopen, hij wordt binnenkort verwijderd.",
"Update vote succeeded": "Stem gewijzigd",

View File

@ -15,7 +15,7 @@
"Framadate was initially based on ": "Framadate es inicialament basat sus ",
"It is governed by the": "Es regit per la",
"The software": "Lo logicial",
"This software needs javascript and cookies enabled. It is compatible with the following web browsers:": "Aqueste logicial requerís lactivacion del javascript e dels cookies. Es compatible amb los navigadors web seguents:",
"This software needs javascript and cookies enabled. It is compatible with the following web browsers:": "Aqueste logicial requerís lactivacion del javascript e dels cookies. Es compatible amb los navegadors web seguents:",
"a software developed by the University of Strasbourg. Today, it is devevoped by the association Framasoft.": "un logicial desvolopat per lUniversitat dEstrasborg. Uèi son desvolopament es fach per lassociacion Framasoft."
},
"3rd section": {
@ -31,8 +31,9 @@
"Back to administration": "Tornar a ladministracion",
"Change the poll": "Modificar lo sondatge",
"Confirm removal of the poll": "Confirmar la supression del sondatge",
"Deleted the poll": "Suprimir lo sondatge",
"Deleted the poll": "Poll deleted",
"Email": "Corrièl",
"Executed": "Executadas",
"Expiration date": "Expiracion",
"Fail": "Fracàs",
"Failed:": "Fracassat:",
@ -49,11 +50,13 @@
"Purged:": "Purgats:",
"See the poll": "Veire lo sondatge",
"Skipped:": "Passat:",
"Status": "Estatuts",
"Succeeded:": "Capitat:",
"Success": "Capitada",
"Summary": "Resumit",
"Title": "Títol",
"Votes": "Vòtes",
"Waiting": "En espèra",
"polls in the database at this time": "sondatges dins la banca de donadas actualament"
},
"Check": {
@ -83,6 +86,7 @@
"Comments of polled people": "Comentaris dels sondats",
"Remove the comment": "Suprimir lo comentari",
"Send the comment": "Mandar lo comentari",
"Type your name and a comment to send it": "Picatz vòstre nom e comentari den primièr per mandar lo formulari",
"Your comment": "Vòstre comentari",
"anonyme": "anonim"
},
@ -104,7 +108,7 @@
"EditLink": {
"Edit link for poll \"%s\"": "Ligam de modificacion del sondatge \"%s\"",
"Here is the link for editing your vote:": "Vaquí lo ligam per modificar vòstre vòte:",
"If you don't want to lose your personalized link, we can send it to your email.": "A fin de pèrdre pas lo ligam de modificacion, podèm vos lo mandar per corrièl.",
"If you don't want to lose your personalized link, we can send it to your email.": "Se volètz pas perdre vòstre ligam personalizat, podètz vos lo enviar per corrièl",
"Please wait %d seconds before we can send an email to you then try again.": "Mercés desperar encara %d segondas abans que poscam vos mandar lo corrièl, puèi tornatz ensajar.",
"REMINDER": "RECÒRD",
"Send": "Mandar",
@ -117,12 +121,12 @@
"Can't create an empty column.": "Impossible de crear una colomna voida.",
"Can't create the config.php file in '%s'.": "Impossible de crear lo fichièr config.php dins '%s'.",
"Comment failed": "Fracàs del comentari",
"Cookies are disabled on your browser. Theirs activation is required to create a poll.": "Los cookies son desactivats sus vòstre navigador. Lor activacion es requesida per la creacion dun sondatge.",
"Cookies are disabled on your browser. Theirs activation is required to create a poll.": "Los cookies son desactivats sus vòstre navegador. Lor activacion es requesida per la creacion dun sondatge.",
"Enter a name": "Avètz pas picat cap de nom!",
"Enter a name and a comment!": "Mercé de garnir los dos camps!",
"Enter a title": "Cal picar un títol!",
"Enter an email address": "Cal picar una adreça de messatjariá!",
"Error on amount of voters limitation : value must be an integer greater than 0": "Error on amount of voters limitation: Value must be an integer greater than 0",
"Error on amount of voters limitation : value must be an integer greater than 0": "Error pel limit de vòtes: la valor deu èsser un entièr màger que 0",
"Error!": "Error!",
"Failed to delete all comments": "Fracàs de la supression de totes los comentaris",
"Failed to delete all votes": "Fracàs de la supression de totes los vòtes",
@ -131,10 +135,10 @@
"Failed to delete the poll": "Fracàs de la supression del sondatge",
"Failed to delete the vote!": "Fracàs de la supression del vòte!",
"Failed to insert the comment!": "Fracàs de lapondon del comentari!",
"Failed to save poll": "Fracàs del salvament del sondatge",
"Failed to save poll": "Fracàs denregistrament del sondatge",
"Forbidden!": "Defendut!",
"Framadate is not properly installed, please check the \"INSTALL\" to setup the database before continuing.": "Framadate es pas installat coma cal, legissètz lo fichièr per configurar la banca de donadas abans de contunhar.",
"Javascript is disabled on your browser. Its activation is required to create a poll.": "Javascript es desactivat sus vòstre navigador. Son activacion es requesida per la creacion dun sondatge.",
"Javascript is disabled on your browser. Its activation is required to create a poll.": "Javascript es desactivat sus vòstre navegador. Son activacion es requesida per la creacion dun sondatge.",
"MISSING_VALUES": "Mancan de valors",
"No polls found": "Cap de sondatge pas trobat",
"Password is empty": "Lo senhal es void.",
@ -143,29 +147,46 @@
"Poll id already used": "Lidentificant es ja utilizat",
"Something is going wrong...": "I a quicòm que truca...",
"Something is wrong with the format": "I a quicòm que truca amb lo format.",
"Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Something is wrong with the format: Customized URLs should only consist of alphanumeric characters and hyphens.",
"Something is wrong with the format: name shouldn't have any spaces before or after": "Something is wrong with the format: name shouldn't have any spaces before or after",
"Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.": "Quicòm a trucat amb lo format: las URL personalizadas devon èsser compausadas de caractèrs alfanumerics e de jonhents longs.",
"Something is wrong with the format: name shouldn't have any spaces before or after": "Quicòm a trucat amb lo format: lo nom deu pas conténer despacis avant nimai aprèp",
"The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.": "Ladreça picada es pas corrècta!Cal una adreça valida (per exemple r.stallman@outlock.com) per recebre lo ligam cap al sondatge.",
"The column already exists": "La colomna existís ja",
"The name is invalid.": "Lo nom es pas valid.",
"The name you've chosen already exist in this poll!": "Lo nom quavètz causit existís ja!",
"There is a problem with your choices": "I a un problèma amb vòstras causidas",
"This id is not allowed": "This identifier is not allowed",
"This poll doesn't exist !": "Aqueste sondatge existís pas!",
"Update vote failed": "La mesa a jorn del vòte a fracassat",
"You already voted": "Avètz ja votat",
"You can't create a poll with hidden results with the following edition option:": "Podètz pas crear de sondatges amb de resultats amagats amb las opcions dedicion seguentas:",
"You can't select more than %d dates": "Podètz pas causir mai de %d datas",
"You haven't filled the first section of the poll creation, or your session has expired.": "Avètz pas garnit la primièra seccion de la creacion del sondatge, o vòstra session a expirat.",
"You haven't filled the first section of the poll creation.": "Avètz pas garnit la primièra pagina del sondatge",
"Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry.": "Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry."
},
"FindPolls": {
"Address": "Adreça",
"Created polls": "Sondatges creats",
"Have a good day!": "Bona jornada!",
"Here is the list of the polls that you manage on %s:": "Vaquí la lista dels sondatges que gerissètz sus %s:",
"If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.": "Se sètz pas a lorigina daquesta accion e que pensatz que sagís dun abús, podètz o senhalar a ladministrator sus %s.",
"If you weren't the source of this action and if you think this is an abuse of the service, please notify the administrator on %s.": "Se sètz pas a lorigina daquesta accion e se pensatz ques un abús, mercés de contactar ladministrator a %s.",
"Last access date": "Data de darrièr accès",
"List of your polls": "Lista de vòstres sondatges",
"Local Storage Help": "Per vos ajudar a retrapar vòstres sondatges precedents, salvagardam cada sondatge que creatz o quaccedissètz dins vòstre navegador. Aquestas donadas son enregistradas pas que dins aqueste navigador. Las donadas seguentas seràn salvagardadas:",
"Local Storage Help Delete": "Per suprimir aquesta donada clicatz lescobilhièr de la linha correspondenta o clicatz lopcion «suprimir mon ensenhador de sondatge». Aquò suprimirà pas vòstres sondatges.",
"Local Storage Help Information Accessed": "La data quavètz creat o accedit al sondatge",
"Local Storage Help Information Address": "It's address",
"Local Storage Help Information Title": "Lo títol del sondatge",
"PS: this email has been sent because you or someone else asked to get back the polls created with your email address.": "PS:aqueste corrièl es estat mandat perque avètz o qualquun mai a demandat la recuperacion dels sondatges creats amb aquesta adreça de corrièl.",
"Polls saved inside this browser": "Sondatges enregistrats dins aqueste navegador",
"Polls sent": "Sondatges mandats",
"Send me my polls": "Mandar mos sondatges"
"Remove all polls from this browser": "Levar totes mos sondatges de lensenhador del navegador",
"Remove poll from index": "Levar lo sondatge de lensenhador",
"Send me my polls": "Mandar mos sondatges",
"Send my polls by email": "Enviar mos sondatges per corrièl",
"There are no polls saved inside your browser yet": "Vòstre navegador a pas cap de sondatges enregistrats",
"Title": "Títol",
"Visited polls": "Sondatges consultats"
},
"Generic": {
"(in the format name@mail.com)": "(al format nom@mail.com)",
@ -174,7 +195,7 @@
"Back": "Tornar",
"Back to the homepage of": "Tornar a la pagina dacuèlh de",
"Cancel": "Anullar",
"Caption": "Legenda",
"Caption": "Informacions",
"Choice": "Causida",
"Classic": "Classic",
"Close": "Tampar",
@ -185,10 +206,10 @@
"Edit": "Modificar",
"Framadate is an online service for planning an appointment or make a decision quickly and easily.": "Framadate es un servici en linha que permet dorganizar un rendètz-vos o de prene de decisions rapidament e simplament.",
"Home": "Acuèlh",
"Ifneedbe": "Se cal",
"Ifneedbe": "Amb resèrva",
"Legend:": "Legenda:",
"Link": "Ligam",
"Make your polls": "Organizar de rencontres simplament, liurament",
"Make your polls": "Creatz vòstres sondatges",
"Markdown": "Markdown",
"Next": "Contunhar",
"No": "Non",
@ -219,9 +240,12 @@
"AppMail": "Adreça de corrièl de laplicacion",
"AppName": "Nom de laplicacion",
"CleanUrl": "URL clars",
"Database": "Banca de donadas",
"DbConnectionString": "Cadena de connexion",
"Database": "Nom de la basa de donadas",
"DbDriver": "Pilòt de la basa de donadas",
"DbHost": "Nom dòst de la basa de donadas",
"DbName": "Nom de la basa de donadas",
"DbPassword": "Senhal",
"DbPort": "Pòrt de la basa de donadas",
"DbPrefix": "Prefixe",
"DbUser": "Utilizaire",
"DefaultLanguage": "Lenga per defaut",
@ -235,17 +259,17 @@
"Select the language": "Seleccionar la lenga"
},
"Mail": {
"Author's message": "Reservat a lautor",
"Author's message": "Messatge per lautor",
"FOOTER": "« La rota es longa, mai lo camin es liure… »<br/>Framasoft viu solament amb vòstres dons (quòm pòt tirar de vòstres impòstes).<br/> Mercé davança pel vòstre sosten https://soutenir.framasoft.org.",
"For sending to the polled users": "Per difusion als sondats",
"Notification of poll: %s": "Notificacion dun sondatge:%s",
"Poll's participation: %s": "Participacion al sondatge:%s",
"Someone just change your poll available at the following link %s.": "Qualquun ven de modificar vòstre sondatge accessible amb lo ligam seguent <a href=\"%1$s\">%1$s</a>.",
"Someone just delete your poll %s.": "Qualquun ven de suprimir vòstre sondatge \"%s\".",
"Thanks for filling the poll at the link above": "Mercé de ben voler participar al sondatge a ladreça seguenta",
"Thanks for filling the poll at the link above": "Mercés de vòstra participacion al sondatge al ligam seguent",
"Thanks for your trust.": "Mercé per vòstra fisança.",
"This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.": "Aquò es lo messatge que serà mandat als sondats.<br/>Podètz ara transmetre aqueste messatge a totas las personas susceptiblas de participar al vòte.",
"This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above": "Aqueste messatge deu PAS èsser difusat als sondats. Es reservat a lautor del sondatge.<br/><br/>Podètz modificar aqueste sondatge amb lo ligam seguent ",
"This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above": "Aqueste messatge deu PAS èsser mandat als participants. Vos cal lo gardar privat.<br/><br/>Podètz modificar lo sondatge amb lo ligam seguent",
"You have changed the settings of your poll. \nYou can modify this poll with this link": "Avètz modificat la configuracion del sondatge.<br/>Podètz modificar aqueste sondatge amb lo ligam seguent",
"[ADMINISTRATOR] New settings for your poll": "[ADMINISTRATOR] Cambi de configuracion del sondatge",
"filled a vote.\nYou can find your poll at the link": "ven de votar.<br/>Podètz tornar a vòstre sondatge amb lo ligam seguent",
@ -266,24 +290,27 @@
"You have to provide a password to access the poll.": "Vos cal donar lo senhal per aver accès a aqueste sondatge."
},
"Poll results": {
"%s option": "%s option",
"Addition": "Soma",
"Anyone will be able to access your email address after your vote": "Tot lo monde poirà veire vòstra adreça de corrièl aprèp vòstre vòte",
"Best choice": "Milhora causida",
"Best choices": "Milhoras causidas",
"Chart": "Grafic",
"Display the chart of the results": "Afichar lo grafic dels resultats",
"Edit the line: %s": "Modificar la linha:%s",
"Link to edit this particular line": "Link to edit this particular line",
"Link to edit this particular line has been copied inside the clipboard!": "The link to edit this particular line has been copied to the clipboard!",
"Link to edit this particular line": "Ligam per modificar aquesta linha en particular",
"Link to edit this particular line has been copied inside the clipboard!": "Lo ligam per modificar aquesta linha en particular es estada copiada al quichapapièrs!",
"Remove the line:": "Suprimir la linha:",
"Save the choices": "Enregistrar las causidas",
"Scroll to the left": "Far desfilar a man esquèrra",
"Scroll to the right": "Far desfilar a man drecha",
"The best choice at this time is:": "Pel moment, la causida amb lo mai de vòtes es:",
"The bests choices at this time are:": "Pel moment, las causidas amb lo mai de vòtes son:",
"Vote ifneedbe for": "Vote under reserve for",
"Vote ifneedbe for": "Vòtes amb resèrva per",
"Vote no for": "Votar « non » per",
"Vote yes for": "Votar « òc » per",
"Votes of the poll": "Vòtes del sondatge",
"Warning : anyone can access to your email address after voting": "Warning: Anyone can see your email address after voting",
"polled user": "votant",
"polled users": "votants"
},
@ -295,6 +322,8 @@
"Cancel the name edit": "Anullar lo cambiament dautor",
"Cancel the rules edit": "Anullar lo cambiament de permissions",
"Cancel the title edit": "Anullar lo cambiament de títol",
"Collect of the polled users email addresses": "Collec the polled users' email addresses",
"Collecting the polled users emails": "Collècta de las adreças dels votants",
"Edit the description": "Modificar la descripcion",
"Edit the email adress": "Modificar ladreça",
"Edit the expiration date": "Modificar la data dexpiracion",
@ -305,6 +334,7 @@
"Expiration date": "Data dexpiracion",
"Export to CSV": "Exportar en CSV",
"Initiator of the poll": "Autor del sondatge",
"No collect of the polled users email addresses": "The polled users' email addresses are not collected",
"No password": "Pas cap de senhal",
"Only votes are protected": "Only votes are protected",
"Password protected": "Protegit per senhal",
@ -326,12 +356,23 @@
"Save the new title": "Enregistrar lo novèl títol",
"Simple editor": "Editor simple",
"Title": "Títol del sondatge",
"Voters email adresses are collected": "Voters' email adresses are collected",
"Voters email adresses are collected and required": "Voters' email adresses are collected and required",
"Voters email adresses are collected, required and verified": "Voters' email adresses are collected, required and verified",
"Voters email adresses are not collected": "Voters' email adresses are not collected",
"Votes and comments are locked": "Los vòtes e comentaris son clavats",
"Votes protected by password": "Vòtes protegits per senhal"
},
"Step 1": {
"All voters can modify any vote": "Totes los votants pòdon modificar sos vòtes",
"Collect the polled users email addresses": "Collecting the polled users' email addresses",
"Collect users email": "Collectar las adreças dels utilizaires",
"Collect voters email": "Collect voters' email addresses",
"Customize the URL": "Personalizar lo ligam",
"Email addresses are collected but not required": "Email addresses are collected but not required",
"Email addresses are not collected": "Email addresses are not collected",
"Email addresses are required": "Email addresses are required",
"Email addresses are required and verified": "Email addresses are required and verified",
"Go to step 2": "Anar a letapa 2",
"Limit the amount of voters per option": "Limitar lo nombre de votants per opcion",
"More informations here:": "Mai dinformacion aquí :",
@ -353,9 +394,11 @@
"To receive an email for each new vote": "Recebre un messatge per cada participacion",
"Use a password to restrict access": "Emplegar un senhal per restrénher laccès al sondatge",
"Value Max": "Valor maximala",
"ValueMax instructions": "votants per opcions",
"ValueMax instructions": "votacion per opcion",
"Voters can modify their vote themselves": "Cadun pòt modificar son pròpri vòte",
"Votes cannot be modified": "Cap de vòte pòt pas èsser modificat",
"Warning : anyone can access to the polled users's email addresses.": "Warning: Anyone can see the polled users' email addresses.",
"Warning: anyone can access the polled users email addresses since all voters can modify any vote. You should restrict permission rules.": "Avertiment: qual que siá pòt veire las adreças dels votants del moment que totes los votants pòdon modificar quin que siá vòte. Vos caldriá restrénher las permissions.",
"You are in the poll creation section.": "Avètz causit de crear un sondatge novèl.",
"You can enable or disable the editor at will.": "Podètz activar o desactivar leditor coma volgatz."
},
@ -412,6 +455,8 @@
"As poll administrator, you can change all the lines of this poll with this button": "En qualitat dadministrator podètz modificar totas las linhas daqueste sondatge amb aqueste boton",
"Back to the poll": "Tornar al sondatge",
"Choice added": "Causida aponduda",
"Collect the emails of the polled users for the choice": "Collècta de las adreças dels votants per la causida",
"Collect the emails of the polled users for this column": "Collect the email addresses of the polled users for this column",
"Column removed": "Colomna suprimida",
"Column's adding": "Apondon de colomna",
"Comment deleted": "Comentari suprimit",
@ -419,7 +464,7 @@
"Confirm removal of all votes of the poll": "Confirmar la supression de totes los vòtes daqueste sondatge",
"Confirm removal of the column.": "Confirmar la supression daquesta colomna.",
"Confirm removal of the poll": "Confirmar la supression del sondatge",
"Delete the poll": "Suprimir lo sondatge",
"Delete the poll": "Delete poll",
"Finally, you can change the informations of this poll like the title, the comments or your email address.": "Per acabar podètz tanben modificar las informacions a prepaus daqueste sondatge coma lo títol, los comentaris o vòstre corrièl.",
"If you just want to add a new hour to an existant date, put the same date and choose a new hour.": "Se volètz apondre un orari a una data existenta, botatz la meteissa data e causissètz un orari mai. Serà normalament integrat al sondatge existent.",
"Keep comments": "Gardar los comentaris",
@ -429,11 +474,11 @@
"Keep this poll": "Gardar aqueste sondatge",
"Keep votes": "Gardar los vòtes",
"Poll fully deleted": "Sondatge totalament suprimit",
"Poll saved": "Sondatge salvagardat",
"Poll saved": "Sondatge enregistrat",
"Remove the column": "Suprimir la colomna",
"Remove the comments": "Suprimir los comentaris",
"Remove the votes": "Suprimir los vòtes",
"The poll is created.": "The poll was created.",
"The poll is created.": "Lo sondatge es estada creat.",
"Vote added": "Vòte apondut",
"Vote deleted": "Vòte suprimit",
"Vote updated": "Vòte mes a jorn",
@ -442,10 +487,18 @@
"and add a new column with": "E se avètz oblidat de picar una causida, podètz tornar apondre una colomna en clicant sus",
"remove a column or a line with": "escafar una colomna o una linha amb"
},
"display_mails": {
"People who have answered 'If need be' to this option have left those email addresses :": "Users who voted 'If need be' for this option have left those email addresses:",
"People who have answered 'If need be' to this option have not left any email addresses.": "Users who voted 'If need be' for this option have not left any email addresses:",
"People who have answered 'No' to this option have left those email addresses :": "Users who voted 'No' for this option have left those email addresses:",
"People who have answered 'No' to this option have not left any email addresses.": "Users who voted 'No' for this option have not left any email addresses.",
"People who have answered 'Yes' to this option have left those email addresses :": "Users who voted 'Yes' for this option have left those email addresses:",
"People who have answered 'Yes' to this option have not left any email addresses.": "Users who voted 'Yes' for this option have not left any email addresses."
},
"studs": {
"Adding the vote succeeded": "Apondon del vòte capitat",
"Deletion date:": "Data de supression:",
"If you want to vote in this poll, you have to give your name, choose the values that fit best for you and validate with the plus button at the end of the line.": "Per participar a aqueste sondatge, picatz vòstre nom, triatz totas las valors que vos agradan e validatz amb lo boton al cap de linha.",
"If you want to vote in this poll, you have to give your name, choose the values that fit best for you and validate with the plus button at the end of the line.": "Se volètz votar per aqueste sondatge, avètz de donar vòstre nom, far una causida, e lenviar en seleccionar lo boton de salvagarda al cap de la linha.",
"POLL_LOCKED_WARNING": "Ladministrator a clavat aqueste sondatge. Los vòtes e comentaris son gelats, es pas mai possible de participar",
"The poll is expired, it will be deleted soon.": "Lo sondatge a expirat, serà lèu suprimit.",
"Update vote succeeded": "Mesa a jorn del vòte amb succès",

25
scripts/locale-add-key.pl Executable file
View File

@ -0,0 +1,25 @@
#!/usr/bin/perl
use strict;
use warnings;
use JSON;
my $json = JSON->new->utf8->space_before(0)->space_after(1)->indent(4)->canonical(1);
my $en_file = 'locale/en.json';
my $en;
{
open my $fh, '<', $en_file or die;
local $/ = undef;
$en = <$fh>;
close $fh;
}
$en = $json->decode($en);
my ($key, $trad) = $ARGV[0] =~ m#^([^:]*):(.*)$#;
$en->{$key}->{$trad} = $trad;
open my $fh, '>', $en_file or die;
print $fh $json->encode($en);
close $fh;

9
scripts/locales.sh Executable file
View File

@ -0,0 +1,9 @@
#!/bin/bash
python -m json.tool < locale/en.json
if [[ $? == 0 ]];
then
json2po -P -i locale/en.json -t locale/en.json -o po/framadate.pot
else
echo "Can't convert json files to po, the json file is incorrect"
exit 1
fi

View File

@ -1,202 +0,0 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Rapha?l DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est r?gi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Rapha?l DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
function d($thing) {
echo $thing . "\n";
}
function i($if, $thing, $copied = ' copied') {
if ($if) {
echo $thing . $copied . "\n";
} else {
echo '[fail] ' . $thing . "\n";
}
}
function rcopy($src, $dst) {
$dir = opendir($src);
@mkdir($dst);
$copied = true;
while (false !== ($file = readdir($dir))) {
if (($file !== '.') && ($file !== '..')) {
if (is_dir($src . '/' . $file)) {
$copied &= rcopy($src . '/' . $file, $dst . '/' . $file);
} else {
$copied &= copy($src . '/' . $file, $dst . '/' . $file);
}
}
}
closedir($dir);
return !!$copied;
}
function rrmdir($dir) {
$files = array_diff(scandir($dir), ['.', '..']);
foreach ($files as $file) {
(is_dir("$dir/$file")) ? rrmdir("$dir/$file") : unlink("$dir/$file");
}
return rmdir($dir);
}
function copyDependencyToBuild($dirname) {
return @mkdir(BUILD_VENDOR . $dirname, 755, true) && @rcopy(VENDOR . $dirname, BUILD_VENDOR . $dirname);
}
function copyFiles($files, &$result) {
foreach ($files as $key => $file) {
if (is_int($key)) {
$key = $file;
}
if (is_dir(ROOT . '/' . $key)) {
$result->$key = @rcopy(ROOT . '/' . $key, BUILD . '/' . $file);
} elseif (is_file(ROOT . '/' . $key)) {
$result->$key = @copy(ROOT . '/' . $key, BUILD . '/' . $file);
}
i($result->$key, $key);
}
}
function zip($source, $destination) {
if (extension_loaded('zip')) {
if (file_exists($source)) {
$zip = new ZipArchive();
if ($zip->open($destination, ZIPARCHIVE::CREATE)) {
$source = realpath($source);
if (is_dir($source)) {
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);
foreach ($files as $file) {
if (in_array(basename($file), ['.', '..'], true)) {
continue;
}
$file = realpath($file);
if ($file !== $source && is_dir($file)) {
$zip->addEmptyDir(str_replace($source . '\\', '', str_replace($source . '/', '', $file)));
} else if (is_file($file)) {
$zip->addFromString(str_replace($source . '\\', '', str_replace($source . '/', '', $file)), file_get_contents($file));
}
}
} else if (is_file($source)) {
$zip->addFromString(basename($source), file_get_contents($source));
}
}
return $zip->close();
}
}
return false;
}
ini_set('max_execution_time', 600);
ini_set('memory_limit', '1024M');
define('ROOT', realpath(__DIR__ . '/..'));
define('VENDOR', ROOT . '/vendor');
define('DIST', ROOT . '/dist');
define('BUILD', ROOT . '/build');
define('BUILD_VENDOR', BUILD . '/vendor');
include ROOT . '/app/inc/constants.php';
$result = new stdClass();
echo '<pre>';
// Delete old dist>build directories
if (file_exists(DIST)) {
$result->rmdirDist = rrmdir(DIST);
i($result->rmdirDist, 'Dist', ' deleted');
}
if (file_exists(BUILD)) {
$result->rmdirBuild = rrmdir(BUILD);
i($result->rmdirBuild, 'Build', ' deleted');
}
// Create dist>build directories
$result->mkdirDist = mkdir(DIST, 755);
i($result->mkdirDist, 'Dist', ' created');
$result->mkdirBuild = mkdir(BUILD, 755);
i($result->mkdirBuild, 'Build', ' created');
// Copy dependencies files
d('# Dependencies');
$result->composer = copyDependencyToBuild('/composer');
i($result->composer, 'composer');
$result->o80 = copyDependencyToBuild('/o80/i18n/src');
i($result->o80, 'o80-i18n');
$result->smarty = copyDependencyToBuild('/smarty/smarty/libs');
i($result->smarty, 'smarty');
$result->autoload = @copy(VENDOR . '/autoload.php', BUILD_VENDOR . '/autoload.php');
i($result->autoload, 'autoload');
// Copy assets
d('# Assets');
copyFiles(['css', 'fonts', 'images', 'js'], $result);
// Copy sources
d('# Source directories');
copyFiles(['admin', 'app', 'locale', 'tpl'], $result);
d('# Source files');
$files = [
'adminstuds.php',
'bandeaux.php',
'create_classic_poll.php',
'create_date_poll.php',
'create_poll.php',
'exportcsv.php',
'favicon.ico',
'htaccess.txt',
'index.php',
'INSTALL.md',
'LICENCE.fr.txt',
'LICENSE.en.txt',
'maintenance.php',
'php.ini',
'README.md',
'robots.txt',
'studs.php'
];
copyFiles($files, $result);
// Zip Dist
$output = DIST . '/framadate-' . VERSION . '-' . date('Ymd') . '.zip';
zip(BUILD, $output);
rrmdir(BUILD);
if (isset($_GET['verbose'])) {
var_dump($result);
}
d('--------');
d('Distribution file: ' . realpath($output));
$generatedIn = round((microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']), 4);
d('========');
d('Generated in: ' . $generatedIn . ' secondes');
echo '</pre>';

Some files were not shown because too many files have changed in this diff Show More