From c9b709ad43738c462bf54284fe1845bd3f2eab25 Mon Sep 17 00:00:00 2001 From: vittoboa Date: Thu, 25 Oct 2018 09:34:33 +0200 Subject: [PATCH 01/32] Add italian translation --- client/coral-framework/services/i18n.js | 5 + locales/it.yml | 574 ++++++++++++++++++++++++ 2 files changed, 579 insertions(+) create mode 100644 locales/it.yml diff --git a/client/coral-framework/services/i18n.js b/client/coral-framework/services/i18n.js index c4deca817..87d74b3f2 100644 --- a/client/coral-framework/services/i18n.js +++ b/client/coral-framework/services/i18n.js @@ -12,6 +12,7 @@ import 'moment/locale/da'; import 'moment/locale/de'; import 'moment/locale/es'; import 'moment/locale/fr'; +import 'moment/locale/it'; import 'moment/locale/nl'; import 'moment/locale/pt-br'; @@ -22,6 +23,7 @@ import daTA from 'timeago.js/locales/da'; import deTA from 'timeago.js/locales/de'; import esTA from 'timeago.js/locales/es'; import frTA from 'timeago.js/locales/fr'; +import itTA from 'timeago.js/locales/it'; import nlTA from 'timeago.js/locales/nl'; import pt_BRTA from 'timeago.js/locales/pt_BR'; import zh_CNTA from 'timeago.js/locales/zh_CN'; @@ -34,6 +36,7 @@ import da from '../../../locales/da.yml'; import de from '../../../locales/de.yml'; import es from '../../../locales/es.yml'; import fr from '../../../locales/fr.yml'; +import it from '../../../locales/it.yml'; import nl_NL from '../../../locales/nl_NL.yml'; import pt_BR from '../../../locales/pt_BR.yml'; import zh_CN from '../../../locales/zh_CN.yml'; @@ -61,6 +64,7 @@ export const translations = { ...de, ...es, ...fr, + ...it, ...nl_NL, ...pt_BR, ...zh_CN, @@ -106,6 +110,7 @@ export function setupTranslations() { ta.register('da', daTA); ta.register('de', deTA); ta.register('fr', frTA); + ta.register('it', itTA); ta.register('nl_NL', nlTA); ta.register('pt_BR', pt_BRTA); ta.register('zh_CN', zh_CNTA); diff --git a/locales/it.yml b/locales/it.yml new file mode 100644 index 000000000..fa38cce63 --- /dev/null +++ b/locales/it.yml @@ -0,0 +1,574 @@ +it: + admin_sidebar: + sort_comments: 'Ordina Commenti' + view_options: 'Visualizza Opzioni' + already_flagged_username: 'Hai già segnalato questo username.' + bandialog: + are_you_sure: 'Sei sicuro di voler bloccare {0}?' + ban_user: 'Blocca Utente' + banned_user: 'Utenti bloccati' + cancel: Annulla + email_message_ban: "Caro {0},\n\nQualcuno che ha accesso al tuo account ha violato le nostre linee guida per la community. Di conseguenza, il tuo account è stato bloccato. Non potrai più commentare, apprezzare o segnalare commenti. Se ritieni questo sia un errore, contatta i nostri moderatori." + note: 'Nota: {0}' + note_ban_user: 'Bloccare questo utente non gli permetterà di commentare, interagire, o segnalare commenti.' + note_reject_comment: 'Bloccare questo utente inserirà inoltre questo commento tra quelli rifiutati.' + notify_ban_description: 'Questo notificherà l''utente, tramite email, che è stato bloccato dalla comunità.' + notify_ban_headline: 'Notifica l''utente della interdizione' + send: Invia + write_a_message: 'Scrivi un messaggio' + yes_ban_user: 'Si, blocca utente' + bio_offensive: 'Questa descrizione è offensiva' + cancel: Annulla + characters_remaining: 'caratteri rimanenti' + comment: + anon: Anonimo + ban_user: 'Blocca Utente' + comment: 'Pubblica un commento' + edited: Modificato + flagged: segnalato + undo_reject: Annulla + view_context: 'Visualizza il contesto' + comment_box: + cancel: Annulla + characters_remaining: 'caratteri rimanenti' + comment: 'Pubblica un commento' + comment_post_banned_word: 'Il tuo commento contiene una o più parole non permesse, non sarà quindi pubblicato. Se ritieni questo sia un errore, contatta i nostri moderatori.' + comment_post_notif: 'Il tuo commento è stato pubblicato.' + comment_post_notif_premod: 'Grazie per il tuo contributo. Il nostro team di moderatori revisionerà presto il tuo commento.' + name: Nome + post: Invia + reply: Rispondi + comment_history_blank: + info: 'La cronologia dei tuoi commenti apparirà qui' + title: 'Non hai pubblicato nessun commento' + comment_offensive: 'Questo commento è offensivo' + comment_plural: Commenti + comment_post_banned_word: 'Il tuo commento contiene una o più parole non permesse, non sarà quindi pubblicato. Se ritieni questo sia un errore, contatta i nostri moderatori.' + comment_post_notif: 'Il tuo commento è stato pubblicato.' + comment_post_notif_premod: 'Grazie per il tuo contributo. Il nostro team di moderatori revisionerà presto il tuo commento.' + comment_singular: Commento + common: + copy: Copia + copied: 'Copiato' + notsupported: 'Non supportato' + error: 'Si è verificato un errore.' + reaction: reazione + reactions: reazioni + reply: 'rispondi' # noun, singular + replies: 'risposte' + story: 'Storia' + community: + account_creation_date: 'Data creazione account' + active: Attivo + admin: Amministratore + ads_marketing: 'Questo sembra essere un annuncio pubblicitario' + all: 'Tutti' + are_you_sure: 'Sei sicuro di voler bloccare {0}?' + ban_user: 'Blocca Utente?' + banned: Bloccato + banned_user: 'Utente bloccato' + cancel: Annulla + commenter: Utente + dont_like_username: 'Username non adatto' + filter_users: 'Filtra utenti' + filter_role: Ruolo + flaggedaccounts: 'Username segnalati' + flags: Segnalazioni + impersonating: 'Impersonare' + loading: 'Caricamento risultati' + moderator: Moderatore + newsroom_role: 'Ruolo della sala stampa' + no_flagged_accounts: 'Nessun utente segnalato per ora.' + no_results: 'Nessun utente con quell''username o indirizzo email trovato.' + offensive: Offensivo + other: Altro + people: Persone + role: 'Seleziona ruolo...' + select_status: 'Seleziona status...' + spam_ads: Spam/pubblicità + staff: Staff + status: Status + suspended: Sospeso + username_and_email: 'Username e Email' + yes_ban_user: 'Si, blocca utente' + configure: + access_message: 'Devi essere amministratore per accedere alle configurazioni. Perfavore contatta un amministratore e chiedi di promuoverti!' + apply: Applica + banned_word_text: 'Commenti che contengono queste parole o frasi, che siano in maiuscolo o minuscolo, saranno automaticamente rimossi. Inserisci una parola e premi Invio o Tab per aggiungerla. Oppure aggiungi una lista di parole separate da virgole.' + banned_words_title: 'Lista di parole vietate' + close: Chiudi + close_after: 'Chiudi commenti successivi' + close_stream: 'Chiudi il thread dei commenti' + close_stream_configuration: 'Questo thread dei commenti è attualmente chiuso. Aprirlo per visulizzare nuovi commenti' + closed_comments_desc: 'Scrivi un messaggio da visualizzare quando il tuo thread dei commenti viene chiuso senza accettarne nuovi.' + closed_comments_label: 'Scrivi un messaggio...' + closed_stream_settings: 'Thread dei messaggi chiusi' + comment_count_error: 'Inserisci un numero valido.' + comment_count_header: 'Limite lunghezza commento' + comment_count_text_post: caratteri + comment_count_text_pre: 'I commenti saranno limitati a' + comment_settings: Impostazioni + comment_stream: 'Thread dei commenti' + comment_stream_will_close: 'Il thread dei commenti sarà chiuso' + community: Comunità + configure: Configura + copy_and_paste: 'Copia e incolla il codice qui sotto nel tuo CMS per includere il box dei commenti nei tuoi articoli' + custom_css_url: 'URL per il CSS personalizzato' + custom_css_url_desc: 'URL del CSS che sostituirà lo stile predefinito del thread dei commenti. Può essere interno o esterno.' + days: Giorni + description: 'Modifica le impostazioni dei commenti in questa storia.' + disable_commenting_desc: 'Scrivi il messaggio che sarà visualizzato quando i commenti saranno disattivati.' + disable_commenting_title: 'Disattiva tutti i commenti del sito' + domain_list_text: 'Inserisci i domini che vuoi autorizzare per Talk. Per esempio i tuoi ambienti di sviluppo, test o produzione (ex. localhost:3000 staging.domain.com domain.com).' + domain_list_title: 'Domain permessi' + edit_comment_timeframe_heading: 'Periodo di tempo disponibile per modificare i commenti' + edit_comment_timeframe_text_post: 'secondi per modificare i commenti.' + edit_comment_timeframe_text_pre: 'Gli utenti avranno' + edit_info: 'Modifica informazioni' + embed_comment_stream: 'Integra il thread dei commenti' + enable_pre_moderation: 'Abilita pre-moderazione' + enable_pre_moderation_text: 'I moderatori dovranno approvare tutti i commenti prima che vengano pubblicati.' + enable_premod: 'Abilita pre-moderazione' + enable_premod_description: 'I moderatori dovranno approvare tutti i commenti prima che vengano pubblicati.' + enable_premod_links: 'Pre-Modera commenti contenenti link' + enable_premod_links_description: 'I moderatori devono approvare tutti i commenti contenenti link prima di essere pubblicati.' + enable_premod_links_text: 'I moderatori devono approvare tutti i commenti contenenti link prima di essere pubblicati.' + enable_questionbox: 'Domanda qualcosa ai lettori' + enable_questionbox_description: 'Questa domanda apparirà sopra al thread dei commenti. Chiedi ai lettori cosa ne pensano dell''articolo o poni domande per iniziare una conversazione etc.' + hours: Ore + include_comment_stream: 'Includi la descrizione del thread dei commenti' + include_comment_stream_desc: 'Scrivi un messaggio che sarà aggiunto sopra il thread dei commenti. Poni una domanda, includi le linee guida della comunità etc.' + include_question_here: 'Scrivi la tua domanda di seguito:' + include_text: 'Includi il testo qui.' + moderate: Modera + moderation_settings: 'Impostazioni di moderazione' + open: Apri + open_stream: 'Apri il thread' + open_stream_configuration: 'Questo thread dei commenti è attualmente aperto. Chiudendolo non saranno più accettati nuovi commenti, mentre tutti i commenti precedenti continueranno ad essere visibili.' + organization_contact_email: 'Indirizzo email dell''organizzazione' + organization_info_copy: 'Utilizziamo queste informazioni nelle email di notifica generate da Talk. Questo connette i messaggi alla tua organizzazione, permettendo agli utenti di contattarti se riscontrano problemi con il loro account.' + organization_info_copy_2: 'Raccomandiamo di creare un indirizzo email generico (eg. community@yournewsroom.com) per questo scopo. Così da poter rimanere consistente nel tempo, senza rivelare il proprio nome che gli utenti potrebbero prendere di mira nel caso il loro account venga bloccato.' + organization_information: 'Informazioni dell''organizzazione' + organization_name: 'Nome dell''organizzazione' + suspect_or_forbidden_words_placeholder: 'Parola o frase' + product_guide_link: 'Guida all''uso del prodotto' + report_bug_or_feedback: 'Segnala un bug o lascia un feedback' + require_email_verification: 'Richiede la verifica dell''email' + require_email_verification_text: 'I nuovi utenti devono verificare la loro email prima di poter commentare' + save: Salva + save_changes: 'Salva le modifiche' + save_changes_dialog: + cancel: Annulla + copy: 'Hai apportato una o più modifiche senza salvare. Vuoi salvare o scartare le modifiche?' + discard: Scarta + save_settings: 'Salva impostazioni' + unsaved_changes: 'Modifiche non salvate' + shortcuts: Scorciatoie + sign_out: Esci + stories: Storie + stream_settings: 'Impostazioni thread dei commenti' + suspect_word_text: 'Commenti che contengono queste parole o frasi, che siano in maiuscolo o minuscolo, saranno evidenziate nel thread dei commenti. Inserisci una parola e premi Invio o Tab per aggiungerla. Oppure aggiungi una lista di parole separate da virgole.' + suspect_word_title: 'Lista delle parole indiziate' + tech_settings: 'Impostazioni tecniche' + title: 'Configura il thread dei commenti' + view_last_version: 'Visualizza ultima versione' + weeks: Settimane + wordlist: 'Parole vietate' + confirm_email: + click_to_confirm: 'Premi qui sotto per confermare il tuo indirizzo email.' + confirm: Conferma + email_confirmation: 'Conferma Email' + continue: Continua + createdisplay: + check_the_form: 'Modulo non valido. Ricontrolla i campi' + continue: 'Continua con lo stesso username di Facebook' + error_create: 'Errore nel cambiamento dell''username' + fake_comment_body: 'Questo è un commento esempio. I lettori possono condividere i loro pensieri e opinioni con le redazioni nella sezione dei commenti.' + fake_comment_date: '1 minuto fa' + if_you_dont_change_your_name: 'Se non modifichi il tuo username in questo momento, il tuo nome Facebook comparirà accanto a tutti i tuoi commenti.' + required_field: 'Campo obbligatorio' + save: Salva + special_characters: 'Gli username possono contenere solo lettere numeri e _' + username: Username + write_your_username: 'Modifica il tuo username' + your_username: 'Il tuo username appare in tutti i commenti che pubblichi.' + done: Finito + edit_comment: + body_input_label: 'Modifica questo commento' + edit_window_expired: 'Non puoi più modificare questo commento. Il periodo di tempo disponibile per modificarlo è terminato. Perchè non ne pubblichi uno nuovo?' + edit_window_expired_close: Chiudi + edit_window_timer_prefix: 'Modifica periodo di tempo: ' + minute: minuto + minutes_plural: minuti + save_button: 'Salva modifiche' + second: secondo + seconds_plural: secondi + email: + banned: + body: 'In conformità con le linee guida della comunità The Coral Project, il tuo account è stato bloccato. Non ti è più permesso commentare, segnalare o interagire con la nostra comunità.' + subject: 'Il tuo account è stato bloccato' + confirm: + confirm_email: 'Conferma Email' + has_been_requested: 'Una email di conferma è stata richiesta per i seguenti account:' + if_you_did_not: 'Se non sei stato tu a richiederla puoi tranquillamente ignorare questa email.' + subject: 'Email di conferma' + to_confirm: 'Per confermare l''account visita il seguente link:' + password_change: + body: "La password del tuo account è stata modificata.\n\nSe non sei stato tu a richiedere questa modifica, contattaci a {0}." + subject: '{0} password modificata' + password_reset: + if_you_did: 'Se sei stato tu,' + please_click: 'premi qui per reimpostare la password' + subject: 'Reimposta Password' + we_received_a_request: 'Abbiamo ricevuto una richiesta di reimpostare la password. Se non sei stato tu a richiedere la modifica puoi ignorare questa email.' + suspended: + subject: 'Il tuo account è stato sospeso' + embed_comments_tab: Commenti + embedlink: + copy: 'Copiato negli appunti' + copied: 'Copiato' + error: + ALREADY_EXISTS: 'Risorsa già esistente' + AUTHENTICATION: 'Si è verificato un errore durante il tentativo di autenticazione del tuo account.' + CANNOT_IGNORE_STAFF: 'Non puoi ignorare membri dello stuff.' + COMMENT_PARENT_NOT_VISIBLE: 'Il commento al quale stai rispondendo è stato rimosso o non esiste.' + COMMENT_TOO_SHORT: 'I commenti devono avere più di un carattere, ricontrolla il tuo commento e riprova.' + COMMENT_TOO_LONG: 'Il testo eccede il limite permesso.' + COMMENTING_CLOSED: 'I commenti sono stati chiusi.' + COMMENTING_DISABLED: 'Attualmente non è possibile commentare in questo sito.' + confirm_password: 'Le password non coincidono. Perfavore riprova.' + DELETION_NOT_SCHEDULED: 'L''eliminazione non è stata pianificata.' + EDIT_USERNAME_NOT_AUTHORIZED: 'Non hai l''autorizzazione per modificare il tuo username.' + EDIT_WINDOW_ENDED: 'Non puoi più modificare questo commento. Il periodo di tempo disponibile per farlo è terminato.' + email: 'Inserisci un indirizzo email valido.' + EMAIL_ALREADY_VERIFIED: 'Indirizzo email già verificato.' + EMAIL_IN_USE: 'Indirizzo email già in uso.' + email_not_verified: 'L''indirizzo email {0} non è verificato.' + EMAIL_NOT_VERIFIED: 'Indirizzo email non verificato.' + email_password: 'Email e/o password errate/a.' + EMAIL_REQUIRED: 'È richiesto un indirizzo email' + EMAIL_VERIFICATION_TOKEN_INVALID: 'Il token di verifica dell''e-mail non è valido.' + INCORRECT_PASSWORD: 'Password errata' + INVALID_ASSET_URL: 'URL non valido' + LOGIN_MAXIMUM_EXCEEDED: 'Hai effettuato troppi tentativi falliti. Si prega di attendere.' + network_error: 'Errore durante la connessione con il server. Controlla la tua connessione internet e riprova.' + NO_SPECIAL_CHARACTERS: 'L''username può contenere solo lettere numeri o _' + NOT_AUTHORIZED: 'Non sei autorizzato a compiere questa azione.' + NOT_FOUND: 'Risorsa non trovata' + organization_contact_email: 'L''email dell''organizzazione è invalida.' + organization_name: 'Il nome dell''organizzazione può contenere solo lettere o numeri.' + password: 'La password deve avere almeno 8 caratteri' + PAGE_NOT_AVAILABLE_ROLE: 'Questa pagina può essere utilizzata solo dal team. Contatta l''amministratore se vuoi entrare a far parte di questo team.' + PASSWORD_INCORRECT: 'La password inserita non è corretta' + PASSWORD_LENGTH: 'La password è troppo corta' + PASSWORD_REQUIRED: 'Inserire una password' + PASSWORD_RESET_TOKEN_INVALID: 'Il link per reimpostare la tua password non è valido.' + PROFANITY_ERROR: 'Gli username non devono contenere volgarità. Contatta l''amministratore se ritieni ci sia stato un errore.' + RATE_LIMIT_EXCEEDED: 'Limite di tentativi superato' + required_field: 'Questo campo è obbligatorio' + SAME_USERNAME_PROVIDED: 'Devi inserire un username diverso.' + temporarily_suspended: 'Il tuo account è attualmente sospeso. Sarà riattivato {0}. Contattaci se hai qualche domanda.' + unexpected: 'Si è verificato un errore imprevisto. Ci scusiamo!' + username: 'L''username può contenere solo lettere numeri o _' + USERNAME_IN_USE: 'Username già in uso' + USERNAME_REQUIRED: 'Inserire un username' + flag_comment: 'Segnala commento' + flag_reason: 'Motivi segnalazione (Opzionale)' + flag_reasons: + username: + impersonating: 'Questo utente sta impersonando' + nolike: 'Non mi piace il suo username' + offensive: 'Username offensivo' + other: Altro + spam: 'Sembra si tratti di pubblicità/marketing' + flag_username: 'Segnala username' + flagged_usernames: + notify_approved: '{0} username approvato {1}' + notify_changed: 'utente {0} ha cambiato il suo username in {1}' + notify_flagged: '{0} ha segnalato l''username {1}' + notify_rejected: '{0} ha rifiutato l''username {1}' + flags: + reasons: + comment: + banned_word: 'Parola vietata' + comment_noagree: Disaccordo + comment_offensive: Offensivo + comment_other: Altro + comment_spam: Spam + links: Link + suspect_word: 'Parola sospetta' + trust: Karma + user: + username_impersonating: Impersonificazione + username_nolike: 'Non mi piace' + username_offensive: Offensivo + username_other: Altro + username_spam: Spam + framework: + banned_account_body: 'Significa che non potrai votare, segnalare o scrivere commenti.' + banned_account_header: 'Il tuo account è attualmente bloccato.' + changed_name: + msg: 'Il tuo nuovo username è sotto esame da parte del nostro team di moderatori.' + comment: commento + comment_is_deleted: 'Questo utente ha eliminato il suo account.' + comment_is_hidden: 'Questo commento non è disponibile.' + comment_is_ignored: 'Questo commento è nascosto perchè hai ignorato questo utente.' + comment_is_rejected: 'Hai rifiutato questo commento.' + comments: commenti + configure_stream: Configura + content_not_available: 'Questo contenuto non è disponibile' + edit_name: + button: Invia + error: 'L''username può contenere solo lettere numeri o _' + label: 'Nuovo username' + msg: 'Il tuo account è attualmente sospeso perchè il tuo username è considerato inappropriato. Per ripristinare il tuo account inserisci un nuovo username. Contattaci se hai qualche domanda.' + my_comments: 'I miei commenti' + my_profile: 'Il mio profilo' + new_count: 'Visualizza {0} e {1}' + profile: Profilo + show_all_comments: 'Visualizza tutti i commenti' + show_all_replies: 'Visualizza tutte le risposte' + show_more_replies: 'Visualizza più risposte' + success_bio_update: 'La tua descrizione è stata aggiornata' + success_name_update: 'Il tuo username è stato aggiornato' + success_update_settings: 'Le modifiche apportate sono state applicate al thread dei commenti in questo articolo' + view_more_comments: 'visualizza più commenti' + view_reply: 'visualizza risposta' + from_settings_page: 'Dalla pagina del profilo puoi vedere la tua cronologia dei commenti.' + install: + add_organization: + description: 'Inserisci il nome della tua organizzazione. Questa apparirà nelle email di invito ai nuovi membri.' + label: 'Nome dell''organizzazione' + save: Salva + create: + confirm_password: 'Conferma password' + email: 'Indirizzo email' + organization_contact_email: 'Indirizzo email dell''organizzazione' + password: Password + save: Salva + username: Username + final: + close: 'Chiudi l''installer' + description: 'Grazie per aver installato Talk! Ti abbiamo inviato una email per verificare il tuo indirizzo email. Mentre termini la configurazione del tuo account, puoi iniziare a interagire con i tuoi lettori.' + launch: 'Avvia Talk' + initial: + description: 'Configura la tua comunità Talk in pochi passi.' + submit: Inizia + permitted_domains: + description: 'Inserisci i domini che vuoi autorizzare per Talk. Per esempio i tuoi ambienti di sviluppo, test o produzione (ex. localhost:3000 staging.domain.com domain.com).' + submit: 'Termina installazione' + title: 'Domini autorizzati' + like: 'Mi piace' + loading_results: 'Caricamento risultati' + login: + email_address: 'Indirizzo email' + forgot_password: 'Hai dimenticato la tua password?' + go_back: Indietro + sign_in: Accedi + sign_in_button: Accedi + sign_in_message: 'Accedi per interagire con la comunità.' + password: Password + reset_password_send_button: 'Reimposta Password' + request_passowrd: 'Richiedi una nuova password.' + team_sign_in: 'Accesso Team' + marketing: 'Sembra si tratti di pubblicità/marketing' + moderate_all_streams: 'Modera i commenti in Tutte le storie' + moderate_this_stream: 'Modera questo thread dei commenti' + modqueue: + account: 'segnalazioni dell''account' + actions: Azioni + all: tutto + all_streams: 'Tutti i thread di commenti' + approve: Approva + approved: Approvato + ban_user: Bloccato + ban_user_actions: 'Blocca utente' + billion: M + close: Chiudi + empty_queue: 'Non ci sono più commenti da moderare.' + flagged: contrassegnato + jump_to_queue: 'Vai a una determinata coda' + less_detail: 'Meno dettagli' + likes: 'mi piace' + million: m + mod_faster: 'Modera più velocemente con le scorciatoie da tastiera' + moderate: 'Modera →' + more_detail: 'Più dettagli' + navigation: Navigazione + new: Nuovo + newest_first: 'Nuovo primo' + next_comment: 'Vai al prossimo commento' + next_queue: 'Cambia coda' + notify_accepted: '{0} ha accettato il commento "{1}"' + notify_edited: '{0} ha modificato il commento "{1}"' + notify_flagged: '{0} ha contrassegnato il commento "{1}"' + notify_rejected: '{0} ha rifiutato il commento "{1}"' + notify_reset: '{0} ha ripristinato lo stato del commento "{1}"' + oldest_first: 'Primo più vecchio' + premod: pre-moderazione + prev_comment: 'Vai al commento precedente' + reject: Rifiuta + rejected: Rifiutato + reply: Rispondi + reported: Segnalato + select_stream: 'Seleziona thread dei commenti' + shift_key: ⇧ + shortcuts: Scorciatoie + show_shortcuts: 'Visualizza scorciatoie' + singleview: 'Modalità zen' + sort: Ordina + suspend: 'Sospendi utente' + system_withheld: 'Sistema bloccato' + thismenu: 'Apri questo menu' + thousand: k + toggle_search: 'Apri ricerca' + try_these: 'Prova queste' + view_more_shortcuts: 'Visualizza più scorciatoie' + my_comment_history: 'La mia cronologia di commenti' + name: Nome + no_agree_comment: 'Non concordo con questo commento' + no_like_bio: 'Non apprezzo questa descrizione' + no_like_username: 'Non apprezzo questo username' + other: Altro + password_reset: + change_password: 'Cambia password' + change_password_help: 'Inserisci una nuova password per accedere' + confirm_new_password: 'Conferma la nuova password' + mail_sent: 'Se hai già un account ti è stata inviata una email con un link per reimpostare la password' + new_password: 'Nuova password' + new_password_help: 'La password deve avere almeno 8 caratteri' + set_new_password: 'Cambia la tua password' + permalink: Condividi + personal_info: 'Questo commento contiene dati personali' + post: Pubblica + profile: Profilo + profile_settings: Impostazioni + reject_username: + description_notify: 'La sospensione di questo utente disabiliterà temporaneamente il loro account.' + description_reject: 'Sei sicuro di volere bloccare temporaneamente questo utente perchè {0}? Accettando sospenderai temporaneamente questo utente finché non riscriveranno il loro {0}.' + email_message_reject: 'Un''altro membro della comunità ha recentemente segnalato il tuo username consigliando una revisione. A causa del suo contenuto, il tuo username è stato rifiutato. Significa che non potrai più commentare, apprezzare o segnalare contenuti fino a quando non modificherai il tuo username. Inviaci una email per qualsiasi domanda o dubbio.' + no_cancel: 'Non annullare' + send: Invia + suspend_user: 'Sospendi utente' + title_notify: 'Avvisa l''utente della sua temporanea sospensione' + title_reject: 'Abbiamo notato che hai rifiutato un nome utente' + username: username + write_message: 'Scrivi un messaggio' + yes_suspend: 'Si, sospendi' + reject_username_dialog: + cancel: Annulla + description: 'Aiutaci a capire' + message: 'Motivi per la segnalazione (Opzionale)' + reason: Ragione + reject_username: 'Rifiuta username' + title: 'Rifiuta username' + reply: Rispondi + report: Segnala + report_notif: 'Grazie per aver segnalato questo commento. Il nostro team di moderatori è stato avvisato e lo revisionerà presto.' + report_notif_remove: 'La tua segnalazione è stata rimossa.' + reported: Segnalato + settings: + from_settings_page: 'Dalla pagina del profilo puoi vedere la tua cronologia dei commenti.' + my_comment_history: 'La mia cronologia dei commenti' + profile: Profilo + profile_settings: 'Impostazioni profilo' + sign_in: Accedi + to_access: 'per accedere al profilo' + user_no_comment: 'Non hai ancora pubblicato un commento. Partecipa alla conversazione!' + step_1_header: 'Segnala un problema' + step_2_header: 'Aiutaci a capire' + step_3_header: 'Grazie per la tua partecipazione' + stream: + all_comments: 'Tutti i commenti' + comment_not_found: 'Questo commento è stato rimosso o non esiste.' + no_comments: 'Non ci sono ancora commenti. Perchè non ne pubblichi uno?' + no_comments_and_closed: 'Non c''era alcun commento in questo articolo.' + temporarily_suspended: 'In conformità con le linee guida della comunità {0}, il tuo account è stato temporaneamente sospeso. Torna a partecipare alla conversazione {1}.' + streams: + all: Tutti + article: Storia + closed: Chiuso + empty_result: 'Questa ricerca non ha ottenuto risultati. Prova ad amplicare la tua ricerca.' + filter_streams: 'Filtra i thread dei commenti' + most_recent_stories: 'Storie più recenti' + newest: Nuovi + no_results: 'Nessun risultato' + oldest: Vecchi + open: Apri + pubdate: 'Data di pubblicazione' + search: Cerca + search_results: 'Risultati della ricerca' + sort_by: 'Ordina per' + status: 'Status del thread dei commenti' + stream_status: 'Status del thread dei commenti' + suspenduser: + cancel: Annulla + day: '{0} giorno' + days: '{0} giorni' + description_notify: 'La sospensione di questo utente disabiliterà temporaneamente il loro account.' + description_suspend: 'Stai sospendendo {0}. Questo commento sarà inserito tra quelli rifiutati, e {0} non potrà apprezzare, segnalare, rispondere o pubblicare fino al termine del periodo di sospensione.' + email_message_suspend: "Caro {0},\n\nIn conformità con le linee guida della comunità, il tuo account è stato temporaneamente sospenso. Durante il periodo di sospension non potrai commentare, segnalare o interagire con la comunità. Puoi tornare a partecipare dal {2}." + hour: '{0} ora' + hours: '{0} ore' + notify_suspend_until: 'L''utente {0} è stato temporaneamente sospeso. Questa sospensione finirà automaticamente {1}.' + one_hour: '1 ora' + select_duration: 'Seleziona la durata della sospensione' + send: Invia + suspend_user: 'Sospendi utente' + title_notify: 'Avvisa l''utente della sua temporanea sospensione' + title_suspend: 'Sospendi utente' + write_message: 'Scrivi un messaggio' + thank_you: 'Apprezziamo il tuo feedback. Un moderatore revisionerà la tua segnalazione.' + user: + bio_flags: 'segnalazioni per questa descrizione' + user_bio: 'Descrizione utente' + username_flags: 'segnalazioni per questo utente' + user_detail: + all: Tutti + ban: 'Blocca utente' + banned: Bloccato + email: Email + id: ID + karma: Karma + karma_docs_link: 'https://docs.coralproject.net/talk/trust/#user-karma-score' + learn_more: 'Maggiori informazioni' + member_since: 'Membro dal' + reject_rate: 'Tasso di rifiuto' + reject_username: 'Username rifiutato' + rejected: Rifiutato + remove_ban: 'Ban rimosso' + remove_suspension: 'Sospensione rimossa' + suspend: 'Utente sospeso' + suspended: Sospeso + total_comments: 'Commenti totali' + unreliable: Inaffidabile + user_history: 'Cronologia utente' + user_karma_score: 'Punteggio Karma dell''utente' + username: Username + username_needs_approval: 'L''username necessita di approvazione' + username_rejected: 'Username rifiutato' + user_history: + action: Azione + ban_removed: 'Ban rimosso' + date: Data + suspended: 'Sospeso, {0}' + suspension_removed: 'Sospensione rimossa' + system: Sistema + taken_by: 'Preso da' + user_banned: 'Utente bloccato' + username_status: 'Username {0}' + user_impersonating: 'Questo utente sta impersonando' + user_no_comment: 'Non hai ancora pubblicato un commento. Partecipa alla discussione!' + username_offensive: 'Questo username è offensivo' + validators: + confirm_email: 'Le email non coincidono. Perfavore riprova.' + confirm_password: 'Le password non coincidono. Perfavore riprova.' + required: 'Questo campo è obbligatorio' + verify_email: 'Inserisci un email valida.' + verify_organization_name: 'Il nome dell''organizzazione può contenere solo lettere o numeri.' + verify_password: 'La password deve contenere almeno 8 caratteri' + verify_username: 'Gli username possono contenere solo lettere numeri e _' + view_conversation: 'Visualizza conversazione' + your_account_has_been_banned: 'Il tuo account è stato bloccato.' + your_account_has_been_suspended: 'Il tuo account è stato temporaneamente sospeso.' + your_username_has_been_rejected: 'Il tuo account è stato sospeso perchè il tuo username è ritenuto inappropriato. Per ripristinare il tuo account inserisci un nuovo username.' From 94ae029a4a897c3a8fc04d2a97df9a59cd551930 Mon Sep 17 00:00:00 2001 From: Heng Yeow Date: Fri, 26 Oct 2018 13:54:37 +0800 Subject: [PATCH 02/32] Create 02-03-cli-tools.md --- docs/source/02-03-cli-tools.md | 181 +++++++++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 docs/source/02-03-cli-tools.md diff --git a/docs/source/02-03-cli-tools.md b/docs/source/02-03-cli-tools.md new file mode 100644 index 000000000..5d5df0864 --- /dev/null +++ b/docs/source/02-03-cli-tools.md @@ -0,0 +1,181 @@ +--- +title: Configuration with CLI tools +permalink: /configuration-cli-tools/ +class: configuration +toc: true +--- + +Talk can be configured using CLI tools. The CLI tools are available through `./bin/cli`. Below is a list of commands available: +``` + Usage: cli [options] [command] + + Options: + + -h, --help output usage information + + Commands: + + serve serve the application + db run database commands + settings interact with the application settings + assets interact with assets + setup setup the application + jobs work with the job queues + token work with the access tokens + users work with the application auth + migration provides utilities for migrating the database + plugins provides utilities for interacting with the plugin system + help [cmd] display help for [cmd] +``` + +## Serving the application +To serve the application, run `./bin/cli serve`. Please check that you have installed the Talk before doing this step. Below is a list of additional options available for this command: +``` + Usage: cli-serve [options] + + Options: + + -j, --jobs enable job processing on this thread + --disabled-jobs disable jobs specified if the -j option is passed, specified as a comma separated list (default: ) + -w, --websockets enable the websocket (subscriptions) handler on this thread + -h, --help output usage information +``` + +## Database commands +You can also run database commands using `./bin/cli db`. Below is a list of additional options available for this command: +``` + Usage: cli-db [options] [command] + + Options: + + -h, --help output usage information + + Commands: + + createIndexes creates the database indexes and waits until they are created +``` + +## Application settings +You can also change application settings using `./bin/cli settings`. Below is a list of additional options available for this command: +``` + Usage: cli-settings [options] [command] + + Options: + + -h, --help output usage information + + Commands: + + change-org-name change the organization name +``` + +## Interaction with assets +You can also interact with your application's assets using `./bin/cli assets`. Below is a list of additional options available for this command: +``` +Usage: cli-assets [options] [command] + + Options: + + -h, --help output usage information + + Commands: + + list [options] list all the assets in the database + refresh [age] queues the assets that exceed the age requested + update-url update the URL of an asset + merge merges two assets together by moving comments from src to dst and deleting the src asset + rewrite [options] rewrites asset url's using the provided regex replacement pattern +``` + +## Setting up the application +You can also run a setup wizard to setup the wizard using `./bin/cli setup`. Below is a list of additional options available for this command: +``` + Usage: cli-setup [options] + + runs the setup wizard to setup the application + + Options: + + --defaults apply defaults for config instead of prompting + -h, --help output usage information +``` + +## Working with job queues +You can also work with job queues using `./bin/cli jobs`. Below is a list of additional options available for this command: +``` + Usage: cli-jobs [options] [command] + + Options: + + -h, --help output usage information + + Commands: + + process starts job processing + cleanup [options] cleans up inactive jobs +``` + +## Working with access tokens +You can also work with access tokens using `./bin/cli token`. Below is a list of additional options available for this command: +``` + Usage: cli-token [options] [command] + + Options: + + -h, --help output usage information + + Commands: + + list list tokens for a user + revoke revokes a token with a given id + create create a token for a user with a given name +``` + +## Working with your application's authentication +You can also work with your application's authentication using `./bin/cli users`. Below is a list of additional options available for this command: +``` +Usage: cli-users [options] [command] + + Options: + + -h, --help output usage information + + Commands: + + create creates a local user + delete delete a user + list searches for a user based on their stored username and email + set-role sets the role on a user + verify verifies the given user's email address +``` + +## Migrating your database +Talk provides utilities for migrating your database using `./bin/cli migration`. Below is a list of additional options available for this command: +``` + Usage: cli-migration [options] [command] + + Options: + + -h, --help output usage information + + Commands: + + create creates a new migration + run [options] runs all pending migrations +``` + +## Interacting with the plugin system +Talk provides utilities to interact with the plugin system using `./bin/cli plugins`. Below is a list of additional options available for this command: +``` + Usage: cli-plugins [options] [command] + + Options: + + -h, --help output usage information + + Commands: + + create creates a seed plugin + list + reconcile [options] reconciles dependencies by downloading external plugins +``` From c4de69218c445b2dac1438b7063896b4f8959be7 Mon Sep 17 00:00:00 2001 From: Heng Yeow Date: Fri, 26 Oct 2018 13:55:30 +0800 Subject: [PATCH 03/32] Update _config.yml --- docs/_config.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/_config.yml b/docs/_config.yml index 041054bda..3ad74d56b 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -98,6 +98,8 @@ sidebar: url: /configuration/ - title: Advanced Configuration url: /advanced-configuration/ + - title: Configuration with CLI tools + url: /configuration-cli-tools/ - title: Integrating children: - title: Authentication From 14c094568798bff6c1ae4724d1734e45a4595b49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo=20Here=C3=B1=C3=BA?= Date: Tue, 30 Oct 2018 11:01:23 -0300 Subject: [PATCH 04/32] Typo on #77 * plus some other typos found (and fixed) --- locales/es.yml | 54 +++++++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/locales/es.yml b/locales/es.yml index 4ef860859..4c0c7da0e 100644 --- a/locales/es.yml +++ b/locales/es.yml @@ -4,19 +4,19 @@ es: view_options: 'Ver opciones' already_flagged_username: 'Usted ya reportó a este usuario.' bandialog: - are_you_sure: '¿Estás segura que quieres suspender a {0}?' - ban_user: '¿Quieres suspender el Usuario?' + are_you_sure: '¿Estás seguro que quieres suspender a {0}?' + ban_user: '¿Quieres suspender al Usuario?' banned_user: 'Usuario Suspendido' cancel: Cancelar - email_message_ban: "Estimado/a {0},\n\nUsted o alguien con acceso a su cuenta a violado los lineamientos de nuestra comunidad. Como consecuencia de esto, su cuenta fue bloqueada. No podrá realizar ni reportar más comentarios. Si usted piensa que esto ha sido un error, por favor contáctese con nosotros." + email_message_ban: "Estimado/a {0},\n\nUsted o alguien con acceso a su cuenta ha violado los lineamientos de nuestra comunidad. Como consecuencia de esto, su cuenta fue bloqueada. No podrá realizar ni reportar más comentarios. Si usted piensa que esto ha sido un error, por favor contáctese con nosotros." note: 'Nota: {0}' note_ban_user: 'Suspender a este usuario no le va a permitir (al usuario) borrar ni editar ni comentar.' note_reject_comment: 'Suspender a este usuario también va a colocar este comentario en la cola de Rechazados.' - notify_ban_description: 'Esto notificará al usuario por email que fueron suspendidos de la comunidad' + notify_ban_description: 'Esto notificará al usuario por correo electrónico que fueron suspendidos de la comunidad' notify_ban_headline: 'Notificar al usuario de la suspensión' send: Enviar write_a_message: 'Escribe un mensaje' - yes_ban_user: 'Si, Suspender al usuario' + yes_ban_user: 'Si, suspender al usuario' bio_offensive: 'Esta biografia es ofensiva' cancel: Cancelar characters_remaining: 'caracteres restantes' @@ -30,9 +30,9 @@ es: view_context: 'Ver contexto' comment_box: cancel: Cancelar - characters_remaining: 'carácteres restantes' + characters_remaining: 'caracteres restantes' comment: 'Publicar un comentario' - comment_post_banned_word: 'Tu comentario contiene una o más palabras que no están permitidas en nuestro espacio, por lo que no será publicado. Si crees que es un error, por favor contacta a nuestro equipo de moderación.' + comment_post_banned_word: 'Tu comentario contiene una o más palabras que no están permitidas en nuestro espacio, por lo que no será publicado. Si crees que es un error, por favor contactate a nuestro equipo de moderación.' comment_post_notif: 'Tu comentario ha sido publicado.' comment_post_notif_premod: 'Gracias por el comentario. Nuestro equipo de moderación va a revisarlo muy pronto.' name: Nombre @@ -40,7 +40,7 @@ es: reply: Responder comment_offensive: 'Este comentario es ofensivo' comment_plural: Comentarios - comment_post_banned_word: 'Tu comentario contiene una o más palabras que no están permitidas en nuestro espacio, por lo que no será publicado. Si crees que es un error, por favor contacta a nuestro equipo de moderación.' + comment_post_banned_word: 'Tu comentario contiene una o más palabras que no están permitidas en nuestro espacio, por lo que no será publicado. Si crees que es un error, por favor contactate con nuestro equipo de moderación.' comment_post_notif: 'Tu comentario ha sido publicado.' comment_post_notif_premod: 'Gracias por el comentario. Nuestro equipo de moderación va a revisarlo muy pronto.' comment_singular: Comentario @@ -57,40 +57,40 @@ es: account_creation_date: 'Fecha de creación de la cuenta' active: Activa admin: Administrator - ads_marketing: 'Esto parece ser un ad/marketing' + ads_marketing: 'Esto parece ser un publicidad/acción de comercialización' all: 'Todos' - are_you_sure: '¿Estás segura que quieres suspender a {0}?' + are_you_sure: '¿Estás seguro que quieres suspender a {0}?' ban_user: '¿Quieres suspender al Usuario?' banned: Suspendido - banned_user: 'Usuario Suspendido' + banned_user: 'Usuario suspendido' cancel: Cancelar commenter: Comentarista dont_like_username: 'No me gusta este nombre de usuario' - filter_users: 'Filter users' + filter_users: 'Filtrarr usuarios' filter_role: Rol - flaggedaccounts: 'Nombres de Usuario Reportados' + flaggedaccounts: 'Nombres de usuario reportados' flags: Reportes impersonating: Impersonando loading: 'Cargando resultados' moderator: Moderator newsroom_role: 'Rol en la redacción' - no_flagged_accounts: 'No hay ningún nombre de usario reportado en este momento.' + no_flagged_accounts: 'No hay ningún nombre de usuario reportado en este momento.' no_results: 'No se encontraron usuarios con ese nombre o correo.' offensive: Ofensivo other: Otro people: Gente role: 'Seleccionar rol...' select_status: 'Seleccionar estado...' - spam_ads: Spam/Publicidad + spam_ads: Correo basura/Publicidad staff: Personal status: Estado suspended: Suspendido username_and_email: 'Usuario y Correo' - yes_ban_user: 'Si, Suspendan el usuario' + yes_ban_user: 'Sí, suspendan el usuario' configure: - access_message: 'Usted debe ser un administrador para acceder a esta página. Encuentre a otro admin y actualice los permisos de su cuenta!' + access_message: 'Usted debe ser un administrador para acceder a esta página. Encuentre a otro administrador y actualice los permisos de su cuenta!' apply: Aplicar - banned_word_text: 'Comentarios que contengan estas palabras o frases, en mayusculas o minúsculas, serán automáticamente eliminados del hilo de comentario. Escribir una palabra y apretar Enter o Tabulador para agregarla. O pueden pegar una lista de palabras separadas por coma.' + banned_word_text: 'Comentarios que contengan estas palabras o frases, en mayúsculas o minúsculas, serán automáticamente eliminados del hilo de comentarios. Escribir una palabra y apretar Enter o Tabulador para agregarla. O pueden pegar una lista de palabras separadas por coma.' banned_words_title: 'Lista de palabras prohibidas' close: Cerrar close_after: 'Cerrar comentarios luego de' @@ -98,14 +98,14 @@ es: close_stream_configuration: 'Este hilo de comentario está en este momento cerrado. Al abrirlo, nuevos comentarios serán publicados y mostrados.' closed_comments_desc: 'Escribe un mensaje que será mostrado cuando los comentarios estén cerrados y no se acepten más comentarios.' closed_comments_label: 'Escribe un mensaje...' - closed_stream_settings: 'Mensaje que se muestra cuando no se aceptan más comentarios en el articulo' + closed_stream_settings: 'Mensaje que se muestra cuando no se aceptan más comentarios en el artículo' comment_count_error: 'Por favor escribir un número válido' comment_count_header: 'Limitar el largo del comentario' - comment_count_text_post: carácteres + comment_count_text_post: caracteres comment_count_text_pre: 'Los comentarios serán limitados a' comment_settings: Configuración comment_stream: 'Hilo de Comentarios' - comment_stream_will_close: 'El hilo de comentarios se cerrara' + comment_stream_will_close: 'El hilo de comentarios se cerrará' community: Comunidad configure: Configurar copy_and_paste: 'Copiar y pegar el código de más abajo en tu CMS para colocar la caja de comentarios en tus artículos' @@ -122,9 +122,9 @@ es: embed_comment_stream: 'Colocar Hilo de Comentarios' enable_pre_moderation: 'Permitir pre-moderación' enable_pre_moderation_text: 'Los moderadores deben aprobar todo comentario antes que sea publicado.' - enable_premod: 'Activar Pre Moderación' + enable_premod: 'Activar Pre-Moderación' enable_premod_description: 'Los y las moderadoras deben aprobar cualquier comentario antes de su publicación' - enable_premod_links: 'Pre-Moderar Comentarios que contienen Enlaces' + enable_premod_links: 'Pre-Moderar comentarios que contienen Enlaces' enable_premod_links_description: 'Los y las moderadoras deben aprobar cualquier comentario que contengan enlaces antes de su publicación.' enable_premod_links_text: 'Los moderadores deben aprobar todo comentario que contenga un enlace antes de que sea publicado.' enable_questionbox: 'Hacer una pregunta a los y las lectoras.' @@ -140,7 +140,7 @@ es: open_stream: 'Abrir Hilo de Comentarios' open_stream_configuration: 'Este hilo de comentarios está abierto. Al cerrarlo no se podrán publicar nuevos comentarios pero todos los comentarios anteriores aún serán mostrados.' organization_contact_email: 'Email de la Organización' - organization_info_copy: 'Nosotros usamos esta información en las notificaciones de email generadas por Talk. Esto conecta los mensajes de tu organización, y provee una forma para que los usuarios se comuniquen si tienen un inconveniente con su cuenta.' + organization_info_copy: 'Nosotros usamos esta información en las notificaciones de correo electrónico generadas por Talk. Esto conecta los mensajes de tu organización, y provee una forma para que los usuarios se comuniquen si tienen un inconveniente con su cuenta.' organization_info_copy_2: 'Recomendamos crear un email genérico (ej: community@yournewsroom.com) for this purpose. Esto significa que puede permanecer consistente con el tiempo y no expone un nombre que los usuarios puedan atacar si su cuenta fue bloqueada.' organization_information: 'Información de la Organización' organization_name: 'Nombre de la Organización' @@ -315,14 +315,14 @@ es: save: Guardar create: confirm_password: 'Confirmar Contraseña' - email: 'Dirección de correo' - organization_contact_email: 'Organización: Email de contacto' + email: 'Dirección de correo electrónico' + organization_contact_email: 'Organización: correo electrónico de contacto' password: Contraseña save: Guardar username: 'Nombre de Usuario' final: close: 'Cerrar este instalador' - description: '¡Gracias por instalar Talk! Enviamos un correo para verificar su dirección de correo. Mientras esta terminando de configurar su cuenta, ya puede comenzar a involucrarse con sus lectores.' + description: '¡Gracias por instalar Talk! Enviamos un correo para verificar su dirección de correo electrónico. Mientras esta terminando de configurar su cuenta, ya puede comenzar a involucrarse con sus lectores.' launch: 'Iniciar Talk' initial: description: 'Vamos a crear su comunidad Talk en unos pocos pasos.' From 0ce0d57a96d010141ae14887e96f1442c67b6f75 Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Tue, 30 Oct 2018 15:45:26 +0000 Subject: [PATCH 05/32] Spanish translation tweak #1 --- plugins/talk-plugin-auth/client/translations.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/talk-plugin-auth/client/translations.yml b/plugins/talk-plugin-auth/client/translations.yml index caae962bb..4ff4fb994 100644 --- a/plugins/talk-plugin-auth/client/translations.yml +++ b/plugins/talk-plugin-auth/client/translations.yml @@ -219,7 +219,7 @@ es: register: "Registrar" sign_up: "Registro" confirm_password: "Confirmar Contraseña" - username: "Nombre" + username: "Nombre de Usuario" already_have_an_account: "¿Ya tienes una cuenta?" recover_password: "Recuperar la contraseña" email_in_use: "Este correo se encuentra en uso" From 7d246bba7656da39356ea81001834beb7ce41373 Mon Sep 17 00:00:00 2001 From: Wyatt Johnson Date: Tue, 30 Oct 2018 17:02:33 +0000 Subject: [PATCH 06/32] Metadata Scraper Debugger (#2048) * feat: added asset scrape debugger * fix: added docs for scraper * fix: added asset scraping to sidebar --- bin/cli-assets | 29 ++++++ docs/_config.yml | 2 + docs/source/integrating/asset-scraping.md | 44 +++++++++ jobs/scraper/index.js | 67 +------------- services/scraper.js | 33 ------- services/scraper/index.js | 96 ++++++++++++++++++++ {jobs => services}/scraper/rules/modified.js | 0 {jobs => services}/scraper/rules/section.js | 0 8 files changed, 175 insertions(+), 96 deletions(-) create mode 100644 docs/source/integrating/asset-scraping.md delete mode 100644 services/scraper.js create mode 100644 services/scraper/index.js rename {jobs => services}/scraper/rules/modified.js (100%) rename {jobs => services}/scraper/rules/section.js (100%) diff --git a/bin/cli-assets b/bin/cli-assets index 8242a02d6..d626ba094 100755 --- a/bin/cli-assets +++ b/bin/cli-assets @@ -219,6 +219,28 @@ async function rewrite(search, replace, options) { } } +/** + * debugAssetURL will scrape the given URL and print it's scraped values. + */ +async function debugAssetURL(url) { + try { + const meta = await scraper.scrape(url); + + const table = new Table({ head: ['Property', 'Value'] }); + + for (const [property, value] of Object.entries(meta)) { + table.push([property, value]); + } + + console.log(table.toString()); + + util.shutdown(0); + } catch (err) { + console.error(err); + util.shutdown(1); + } +} + //============================================================================== // Setting up the program command line arguments. //============================================================================== @@ -234,6 +256,13 @@ program .description('list all the assets in the database') .action(listAssets); +program + .command('debug [url]') + .description( + 'prints the scraped metadata that would be added to the given asset' + ) + .action(debugAssetURL); + program .command('refresh [age]') .description('queues the assets that exceed the age requested') diff --git a/docs/_config.yml b/docs/_config.yml index 041054bda..0931ecf5b 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -104,6 +104,8 @@ sidebar: url: /integrating/authentication/ - title: Asset Management url: /integrating/asset-management/ + - title: Asset Scraping + url: /integrating/asset-scraping/ - title: Configuring the Comment Stream url: /integrating/configuring-comment-stream/ - title: Configuring the Admin diff --git a/docs/source/integrating/asset-scraping.md b/docs/source/integrating/asset-scraping.md new file mode 100644 index 000000000..5d524f062 --- /dev/null +++ b/docs/source/integrating/asset-scraping.md @@ -0,0 +1,44 @@ +--- +title: Asset Scraping +permalink: /integrating/asset-scraping/ +--- + +By default, Assets in Talk have their metadata scraped when they are loaded. +This provides the easiest way for newsrooms to integrate their CMS's into Talk +in a simple way. We use the following +[meta tags](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta) on +the target pages that allow us to extract some properties. + +| Asset Property | Selector | +|--------------------|----------| +| `title` | See [`metascraper-title`](https://github.com/microlinkhq/metascraper/blob/dc664c37ea1b238b1e3e9d5342edfacc9027892c/packages/metascraper-title/index.js) | +| `description` | See [`metascraper-description`](https://github.com/microlinkhq/metascraper/blob/dc664c37ea1b238b1e3e9d5342edfacc9027892c/packages/metascraper-description/index.js) | +| `image` | See [`metascraper-image`](https://github.com/microlinkhq/metascraper/blob/dc664c37ea1b238b1e3e9d5342edfacc9027892c/packages/metascraper-image/index.js) | +| `author` | See [`metascraper-author`](https://github.com/microlinkhq/metascraper/blob/dc664c37ea1b238b1e3e9d5342edfacc9027892c/packages/metascraper-author/index.js) | +| `publication_date` | See [`metascraper-date`](https://github.com/microlinkhq/metascraper/blob/dc664c37ea1b238b1e3e9d5342edfacc9027892c/packages/metascraper-date/index.js) | +| `modified_date` | `meta[property="article:modified"]` | +| `section` | `meta[property="article:section"]` | + +You can use the `./bin/cli assets debug ` to print the scraped metadata +from that URL. For example: + +```bash + $ ./bin/cli assets debug https://www.washingtonpost.com/technology/2018/10/30/apple-event-october-ipad-pro-macbook-air/ +┌──────────────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ Property │ Value │ +├──────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ title │ Apple redesigns the iPad Pro, breathes new life in the MacBook Air │ +├──────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ description │ Apple is unveiling new iPads and MacBooks at an event in New York starting at 10 a.m. Fowler is there and will report in with the news and hands-on analysis throughout the day. │ +├──────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ image │ https://www.washingtonpost.com/resizer/JAwNQE2alL2JjiWrbXeJ46wZHqA=/1484x0/arc-anglerfish-washpost-prod-washpost.s3.amazonaws.com/public/G5TWBFW4LAI6RC5MX7QB7TODUY.jpg │ +├──────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ author │ Geoffrey A. Fowler │ +├──────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ publication_date │ 2018-10-30T10:40:00.000Z │ +├──────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ modified_date │ │ +├──────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ section │ │ +└──────────────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` \ No newline at end of file diff --git a/jobs/scraper/index.js b/jobs/scraper/index.js index 77d429042..ef64a2e25 100644 --- a/jobs/scraper/index.js +++ b/jobs/scraper/index.js @@ -1,61 +1,9 @@ const Asset = require('../../models/asset'); -const scraper = require('../../services/scraper'); +const scraper = require('../../services/scraper/scraper'); const Assets = require('../../services/assets'); const { createLogger } = require('../../services/logging'); const logger = createLogger('jobs:scraper'); -const fetch = require('node-fetch'); const { merge } = require('lodash'); -const { version } = require('../../package.json'); -const { SCRAPER_HEADERS, SCRAPER_PROXY_URL } = require('../../config'); -const ProxyAgent = require('proxy-agent'); - -// Load the scraper with the rules. -const metascraper = require('metascraper').load([ - require('metascraper-title')(), - require('metascraper-description')(), - require('metascraper-image')(), - require('metascraper-author')(), - require('metascraper-date')(), - require('./rules/modified')(), - require('./rules/section')(), -]); - -let customHeaders = {}; -try { - customHeaders = JSON.parse(SCRAPER_HEADERS); -} catch (err) { - console.error('Cannot parse TALK_SCRAPER_HEADERS'); - throw err; -} - -// Parse the headers to be added to the scraper. -const headers = merge( - { - 'User-Agent': `Coral-Talk/${version}`, - }, - customHeaders -); - -// Add proxy configuration if exists. -const agent = SCRAPER_PROXY_URL ? new ProxyAgent(SCRAPER_PROXY_URL) : null; - -/** - * Scrapes the given asset for metadata. - */ -async function scrape({ url }) { - const res = await fetch(url, { - headers, - agent, - }); - const html = await res.text(); - - // Get the metadata from the scraped html. - const metadata = await metascraper({ - html, - url, - }); - return metadata; -} /** * Updates an Asset based on scraped asset metadata. @@ -64,16 +12,9 @@ function update(id, meta) { return Asset.update( { id }, { - $set: { - title: meta.title || '', - description: meta.description || '', - image: meta.image ? meta.image : '', - author: meta.author || '', - publication_date: meta.date || '', - modified_date: meta.modified || '', - section: meta.section || '', + $set: merge(meta, { scraped: new Date(), - }, + }), } ); } @@ -95,7 +36,7 @@ module.exports = () => { } // Scrape the metadata from the asset. - const meta = await scrape(asset); + const meta = await scraper.scrape(asset.url); log.info('Finished scraping'); diff --git a/services/scraper.js b/services/scraper.js deleted file mode 100644 index cfd845424..000000000 --- a/services/scraper.js +++ /dev/null @@ -1,33 +0,0 @@ -const kue = require('./kue'); - -/** - * Exposes a service object to allow operations to execute against the scraper. - * @type {Object} - */ -const scraper = { - /** - * Create the new Task kue singleton. - */ - task: new kue.Task({ - name: 'scraper', - }), - - /** - * Creates a new scraper job and scrapes the url when it gets processed. - */ - async create(ctx, id) { - ctx.log.info({ assetID: id }, 'Creating job'); - - const job = await scraper.task.create({ - title: `Scrape for asset ${id}`, - id: ctx.id, - asset_id: id, - }); - - ctx.log.info({ jobID: job.id, assetID: id }, 'Created job'); - - return job; - }, -}; - -module.exports = scraper; diff --git a/services/scraper/index.js b/services/scraper/index.js new file mode 100644 index 000000000..59faa8bf0 --- /dev/null +++ b/services/scraper/index.js @@ -0,0 +1,96 @@ +const fetch = require('node-fetch'); +const ProxyAgent = require('proxy-agent'); +const { merge } = require('lodash'); + +const { SCRAPER_HEADERS, SCRAPER_PROXY_URL } = require('../../config'); +const kue = require('../kue'); +const { version } = require('../../package.json'); + +// Load the scraper with the rules. +const metascraper = require('metascraper').load([ + require('metascraper-title')(), + require('metascraper-description')(), + require('metascraper-image')(), + require('metascraper-author')(), + require('metascraper-date')(), + require('./rules/modified')(), + require('./rules/section')(), +]); + +let customHeaders = {}; +try { + customHeaders = JSON.parse(SCRAPER_HEADERS); +} catch (err) { + console.error('Cannot parse TALK_SCRAPER_HEADERS'); + throw err; +} + +// Parse the headers to be added to the scraper. +const headers = merge( + { + 'User-Agent': `Coral-Talk/${version}`, + }, + customHeaders +); + +// Add proxy configuration if exists. +const agent = SCRAPER_PROXY_URL ? new ProxyAgent(SCRAPER_PROXY_URL) : null; + +/** + * Exposes a service object to allow operations to execute against the scraper. + * @type {Object} + */ +const scraper = { + /** + * Create the new Task kue singleton. + */ + task: new kue.Task({ + name: 'scraper', + }), + + /** + * Creates a new scraper job and scrapes the url when it gets processed. + */ + async create(ctx, id) { + ctx.log.info({ assetID: id }, 'Creating job'); + + const job = await scraper.task.create({ + title: `Scrape for asset ${id}`, + id: ctx.id, + asset_id: id, + }); + + ctx.log.info({ jobID: job.id, assetID: id }, 'Created job'); + + return job; + }, + + /** + * Scrapes the given asset for metadata. + */ + async scrape(url) { + const res = await fetch(url, { + headers, + agent, + }); + const html = await res.text(); + + // Get the metadata from the scraped html. + const meta = await metascraper({ + html, + url, + }); + + return { + title: meta.title || '', + description: meta.description || '', + image: meta.image ? meta.image : '', + author: meta.author || '', + publication_date: meta.date || '', + modified_date: meta.modified || '', + section: meta.section || '', + }; + }, +}; + +module.exports = scraper; diff --git a/jobs/scraper/rules/modified.js b/services/scraper/rules/modified.js similarity index 100% rename from jobs/scraper/rules/modified.js rename to services/scraper/rules/modified.js diff --git a/jobs/scraper/rules/section.js b/services/scraper/rules/section.js similarity index 100% rename from jobs/scraper/rules/section.js rename to services/scraper/rules/section.js From ad73fcd94bddbc79c3acd621c09d55ab6feb005a Mon Sep 17 00:00:00 2001 From: Wyatt Johnson Date: Tue, 30 Oct 2018 17:31:32 +0000 Subject: [PATCH 07/32] fix: fixed typo (#2049) --- jobs/scraper/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jobs/scraper/index.js b/jobs/scraper/index.js index ef64a2e25..f918cddfc 100644 --- a/jobs/scraper/index.js +++ b/jobs/scraper/index.js @@ -1,5 +1,5 @@ const Asset = require('../../models/asset'); -const scraper = require('../../services/scraper/scraper'); +const scraper = require('../../services/scraper'); const Assets = require('../../services/assets'); const { createLogger } = require('../../services/logging'); const logger = createLogger('jobs:scraper'); From 2cd9a71d6266edd46638089dae7383fdf4aa1399 Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Tue, 30 Oct 2018 17:40:45 +0000 Subject: [PATCH 08/32] i18n support for Edit link --- client/coral-embed-stream/src/tabs/stream/components/Comment.js | 2 +- locales/en.yml | 1 + locales/es.yml | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/client/coral-embed-stream/src/tabs/stream/components/Comment.js b/client/coral-embed-stream/src/tabs/stream/components/Comment.js index e5aea7589..170f6f147 100644 --- a/client/coral-embed-stream/src/tabs/stream/components/Comment.js +++ b/client/coral-embed-stream/src/tabs/stream/components/Comment.js @@ -645,7 +645,7 @@ export default class Comment extends React.Component { })} onClick={this.onClickEdit} > - Edit + {t('framework.edit')} )} diff --git a/locales/en.yml b/locales/en.yml index 24d5eb780..865a433d4 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -318,6 +318,7 @@ en: comments: comments configure_stream: Configure content_not_available: 'This content is not available' + edit: Edit edit_name: button: Submit error: 'Usernames can contain letters numbers and _ only' diff --git a/locales/es.yml b/locales/es.yml index 5b319d302..237118365 100644 --- a/locales/es.yml +++ b/locales/es.yml @@ -290,6 +290,7 @@ es: comments: comentarios configure_stream: 'Configurar' content_not_available: 'Este contenido no se encuentra disponible' + edit: Editar edit_name: button: Enviar error: 'Nombres de usuarios pueden solamente incluir letras, números y _' From a28024dfedb1920caf462ba2b9bd99070b07e667 Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Tue, 30 Oct 2018 18:18:35 +0000 Subject: [PATCH 09/32] Revert CSS from #1990 --- client/coral-embed-stream/style/default.css | 5 ----- 1 file changed, 5 deletions(-) diff --git a/client/coral-embed-stream/style/default.css b/client/coral-embed-stream/style/default.css index 6cd9bd580..b9330ba62 100644 --- a/client/coral-embed-stream/style/default.css +++ b/client/coral-embed-stream/style/default.css @@ -112,11 +112,6 @@ body { position: relative; } -.talk-stream-comment { - display: flex; - flex-direction: row; -} - /* Comment styles */ .comment { margin-bottom: 10px; From 53abb65da198aed6d591c024b9da2650471f88ac Mon Sep 17 00:00:00 2001 From: Andrew Losowsky Date: Thu, 1 Nov 2018 15:08:08 -0400 Subject: [PATCH 10/32] Updated text - updated User Drawer information - updated Shortcuts information - changed the order --- .../03-03-product-guide-moderator-features.md | 69 +++++++++++-------- 1 file changed, 39 insertions(+), 30 deletions(-) diff --git a/docs/source/03-03-product-guide-moderator-features.md b/docs/source/03-03-product-guide-moderator-features.md index 306b2ad11..3b6c4f1c4 100644 --- a/docs/source/03-03-product-guide-moderator-features.md +++ b/docs/source/03-03-product-guide-moderator-features.md @@ -58,7 +58,7 @@ This queue contains comments that have been reported for moderator review, eithe The All queue contains all comments that have been submitted either article or site-wide. -#### Moderation Tags +#### Moderation Tags that appear in Reported/other queues **Pre-mod** @@ -88,7 +88,7 @@ Comment contains a word or phrase that is on the ’Suspect words’ list in the _Comment published? No_ -The History tag signifies comments that have been flagged because the user’s history indicates their Accepted:Rejected ratio has reached below the karma threshold. [Read more here...](/talk/trust/#user-karma-score) +The History tag signifies comments that have been flagged because the user’s history indicates their Accepted:Rejected ratio has reached below the karma threshold. [Read more about karma here.](/talk/trust/#user-karma-score) **Spam** @@ -130,9 +130,35 @@ Rejecting a comment removes the comment from the stream. Featuring a comment adds that comment to the Featured Comments tab on the stream. +#### Keyboard Shortcuts + +Talk also supports a number of keyboard shortcuts that moderators can leverage +to moderate queues quickly: + +| Shortcut | Action | +| -------- | -------------------------- | +| `j` | Go to the next comment | +| `k` | Go to the previous comment | +| `ctrl+f` | Open search | +| `1-5` | Switch queues | +| `z` | Zen mode | +| `?` | Open shortcuts menu | +| `d` | Approve | +| `f` | Reject | + +Note: "Zen mode" allows a moderator to view and action only one comment at a time. Enjoy the silence! + +#### The User Drawer + +In order to get an idea of what sort of a commenter someone is, moderators can +click on the commenter's username in any moderation queue/elsewhere in the admin (eg the Community page) to see details about +their comments, and to take actions. + +#### User Drawer Actions + **Suspend User** -Suspending a user allows a moderator to give a commenter a “time-out”; during +Suspending a user allows a moderator to give a commenter a “time-out” for a set time chosen from four options; during that time they won’t be allowed to post comments or react to comments. **Ban User** @@ -141,15 +167,13 @@ Banning a user allows a moderator to permanently disallow a commenter to interact with their community. The commenters previous comments will remain on the site. This action can only be un-done manually by a moderator. -#### Viewing a User’s Comment History +**Reject Username** -In order to get an idea of what sort of a commenter someone is, moderators can -click on the commenters username in any moderation queue and see details about -their history. +If a username is violating your guidelines but isn't bad enough to lead to a ban (eg. they are impersonating a famous person), you can reject their username. This will prevent them from publishing comments until they submit a new username. The new name will appear on the Community page for moderator approval before they can publish comments again. **Username, Email and Member Since Date** -This shows the basic details about a commenter. +This shows the basic details about a commenter's account **Total Comments** @@ -161,32 +185,17 @@ display on the site. This shows the % of comments a commenter has had rejected by moderators, or automatically. -**Reports** +**Karma score** -This shows if a commenter is a reliable flagger, an unreliable flagger, or a -neutral flagger. [Read more about reliable and unreliable flaggers here](/talk/trust/#reliable-and-unreliable-flaggers). +The user's current score. To see the default threshhold, click on the 'i' next to the word Karma. If the user's score is equal to or below the default threshhold, the number will be highlighted red. [Read more about karma scores here.](/talk/trust/#user-karma-score) + +**User History** + +This shows the history of the account - if a user has changed their username, or been suspended or banned. The name of the moderator who suspended/banned them/lifted the suspection or ban is displayed here as well. **Moderating from this View** -Talk also allows you to moderate a commenters recent comments from this view. - -#### Keyboard Shortcuts - -Talk also supports a number of keyboard shortcuts that moderators can leverage -to moderate quickly: - -| Shortcut | Action | -| -------- | -------------------------- | -| `j` | Go to the next comment | -| `k` | Go to the previous comment | -| `ctrl+f` | Open search | -| `t` | Switch queues | -| `z` | Zen mode | -| `?` | Open this menu | -| `d` | Approve | -| `f` | Reject | - -Note: "Zen mode" allows a moderator to view and action only one comment at a time. Enjoy the silence! +Talk also allows you to moderate a commenters recent comments from this view. You can 'Select all' to select up to ten previous comments, and take bulk accept/reject actions. ### Stories From b6101b880d95cc65101375e5ee91a6ce9b23187c Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Fri, 2 Nov 2018 00:01:46 +0100 Subject: [PATCH 11/32] fix: show avatar on the left --- .../src/tabs/stream/components/Comment.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/client/coral-embed-stream/src/tabs/stream/components/Comment.css b/client/coral-embed-stream/src/tabs/stream/components/Comment.css index 8b7257b46..00d0d003c 100644 --- a/client/coral-embed-stream/src/tabs/stream/components/Comment.css +++ b/client/coral-embed-stream/src/tabs/stream/components/Comment.css @@ -18,6 +18,11 @@ .comment { position: relative; padding-left: 15px; + display: flex; +} + +.commentContainer { + width: 100%; } .commentLevel0 { From 1a7b3fe90399353a4f65727bf825763d30d84fb3 Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Tue, 6 Nov 2018 13:50:31 -0500 Subject: [PATCH 12/32] Fix button translation --- plugins/talk-plugin-local-auth/translations.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/talk-plugin-local-auth/translations.yml b/plugins/talk-plugin-local-auth/translations.yml index 7d4c6d1c0..ce133d319 100644 --- a/plugins/talk-plugin-local-auth/translations.yml +++ b/plugins/talk-plugin-local-auth/translations.yml @@ -351,7 +351,7 @@ es: cancel: "Cancelar" change_email_msg: "Dirección de correo electrónico modificada. Esta dirección de correo electrónico ahora se utilizará para iniciar sesión y notificaciones por correo electrónico." add_email: - add_email_address: "Agregar dirección de correo electrónico" + add_email_address: "Confirmar" enter_email_address: "Introducir la dirección de correo electrónico:" invalid_email_address: "Dirección de correo electrónico no válida" confirm_email_address: "Confirmar el correo:" From 9edf1d7c415ae71968ecc5606e18b182167dd83e Mon Sep 17 00:00:00 2001 From: Wyatt Johnson Date: Tue, 6 Nov 2018 12:39:16 -0700 Subject: [PATCH 13/32] feat: added perspective feedback --- plugins/talk-plugin-toxic-comments/README.md | 1 + .../talk-plugin-toxic-comments/package.json | 12 +- .../server/config.js | 1 + .../server/hooks.js | 62 ++++++- .../server/perspective.js | 158 ++++++++++++++---- 5 files changed, 193 insertions(+), 41 deletions(-) diff --git a/plugins/talk-plugin-toxic-comments/README.md b/plugins/talk-plugin-toxic-comments/README.md index 19621ee13..f158a5eb3 100644 --- a/plugins/talk-plugin-toxic-comments/README.md +++ b/plugins/talk-plugin-toxic-comments/README.md @@ -27,3 +27,4 @@ Configuration: be processed before it will skip the toxicity analysis, parsed by [ms](https://www.npmjs.com/package/ms). (Default `300ms`) - `TALK_PERSPECTIVE_DO_NOT_STORE` - Whether the API stores or deletes the comment text and context from this request after it has been evaluated. Stored comments will be used for future research and community model building purposes to improve the API over time. (Default `true`) [Perspective API - Analyze Comment Request](https://github.com/conversationai/perspectiveapi/blob/master/api_reference.md#analyzecomment-request) +- `TALK_PERSPECTIVE_SEND_FEEDBACK` - If set to `TRUE`, this plugin will send back moderation actions as feedback to [Perspective](http://perspectiveapi.com/) to improve their model. (Default `FALSE`) diff --git a/plugins/talk-plugin-toxic-comments/package.json b/plugins/talk-plugin-toxic-comments/package.json index 8dbd2ed98..151c10505 100644 --- a/plugins/talk-plugin-toxic-comments/package.json +++ b/plugins/talk-plugin-toxic-comments/package.json @@ -1,13 +1,9 @@ { - "name": "@coralproject/talk-plugin-toxicity", - "pluginName": "talk-plugin-toxicity", + "name": "@coralproject/talk-plugin-toxic-comments", + "pluginName": "talk-plugin-toxic-comments", "version": "0.0.1", "description": "Provides support for measuring the toxicity of user comments using the Perspectives API", "main": "index.js", - "author": "The Coral Project Team ", - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.0.1", - "ms": "^2.0.0" - } + "author": "The Coral Project Team ", + "license": "Apache-2.0" } diff --git a/plugins/talk-plugin-toxic-comments/server/config.js b/plugins/talk-plugin-toxic-comments/server/config.js index 04102ed49..cc0c2daa0 100644 --- a/plugins/talk-plugin-toxic-comments/server/config.js +++ b/plugins/talk-plugin-toxic-comments/server/config.js @@ -8,6 +8,7 @@ const config = { THRESHOLD: process.env.TALK_TOXICITY_THRESHOLD || 0.8, API_TIMEOUT: ms(process.env.TALK_PERSPECTIVE_TIMEOUT || '300ms'), DO_NOT_STORE: process.env.TALK_PERSPECTIVE_DO_NOT_STORE || true, + SEND_FEEDBACK: process.env.TALK_PERSPECTIVE_SEND_FEEDBACK === 'TRUE', }; if (process.env.NODE_ENV !== 'test' && !config.API_KEY) { diff --git a/plugins/talk-plugin-toxic-comments/server/hooks.js b/plugins/talk-plugin-toxic-comments/server/hooks.js index 610e7ad77..c8cf61071 100644 --- a/plugins/talk-plugin-toxic-comments/server/hooks.js +++ b/plugins/talk-plugin-toxic-comments/server/hooks.js @@ -1,5 +1,8 @@ -const { getScores, isToxic } = require('./perspective'); +const { getScores, submitFeedback, isToxic } = require('./perspective'); +const { SEND_FEEDBACK } = require('./config'); const { ErrToxic } = require('./errors'); + +const { merge } = require('lodash'); const debug = require('debug')('talk:plugin:toxic-comments'); function handlePositiveToxic(input) { @@ -28,7 +31,8 @@ async function getScore(body) { return scores; } -module.exports = { +// Create all the hooks that will enable Perspective to add scores to Comments. +const hooks = { RootMutation: { editComment: { pre: async (_, { edit: { body }, edit }) => { @@ -59,3 +63,57 @@ module.exports = { }, }, }; + +// If feedback sending is enabled, we need to add in the hooks for processing +// feedback. +if (SEND_FEEDBACK) { + // statusMap provides a map of Talk names to ones Perspective are expecting. + const statusMap = { + ACCEPTED: 'APPROVED', + REJECTED: 'DELETED', + }; + + // Merge these hooks into the hooks for plugging into the graph operations. + merge(hooks, { + RootMutation: { + // Hook into mutations associated with accepting/rejecting comments. + setCommentStatus: { + async post(root, args, ctx) { + if (ctx.user && args.status in statusMap) { + const comment = await ctx.loaders.Comments.get.load(args.id); + if (comment) { + const asset = await ctx.loaders.Assets.getByID.load( + comment.asset_id + ); + + // Submit feedback. + submitFeedback(comment, asset, statusMap[args.status]); + } + } + }, + }, + // Hook into mutations associated with featuring comments. + addTag: { + async post(root, args, ctx) { + if ( + ctx.user && + args.tag.name === 'FEATURED' && + args.tag.item_type === 'COMMENTS' + ) { + const comment = await ctx.loaders.Comments.get.load(args.tag.id); + if (comment) { + const asset = await ctx.loaders.Assets.getByID.load( + comment.asset_id + ); + + // Submit feedback. + submitFeedback(comment, asset, 'HIGHLIGHTED'); + } + } + }, + }, + }, + }); +} + +module.exports = hooks; diff --git a/plugins/talk-plugin-toxic-comments/server/perspective.js b/plugins/talk-plugin-toxic-comments/server/perspective.js index 7966d3b36..b2e913d1d 100644 --- a/plugins/talk-plugin-toxic-comments/server/perspective.js +++ b/plugins/talk-plugin-toxic-comments/server/perspective.js @@ -1,3 +1,4 @@ +const { URL } = require('url'); const fetch = require('node-fetch'); const { API_ENDPOINT, @@ -8,6 +9,34 @@ const { } = require('./config'); const debug = require('debug')('talk:plugin:toxic-comments'); +// Load the global Talk configuration, we want to grab some variables.. +const { ROOT_URL } = require('config'); + +// Use the ROOT_URL to grab the domain to construct a communityID for the +// feedback. +const communityId = `Coral:${new URL(ROOT_URL).domain}`; + +async function send(method, body) { + // Perform the fetch. + const res = await fetch(`${API_ENDPOINT}/${method}?key=${API_KEY}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + timeout: API_TIMEOUT, + body: JSON.stringify(body, null, 2), + }); + if (!res.ok) { + return null; + } + + // Grab the JSON from the request. + const data = await res.json(); + + // Send the data back! + return data; +} + /** * Get scores from the perspective api * @@ -17,33 +46,20 @@ const debug = require('debug')('talk:plugin:toxic-comments'); async function getScores(text) { debug('Sending to Perspective: %o', text); - const response = await fetch( - `${API_ENDPOINT}/comments:analyze?key=${API_KEY}`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - timeout: API_TIMEOUT, - body: JSON.stringify({ - comment: { - text, - }, - // TODO: support other languages. - languages: ['en'], - doNotStore: DO_NOT_STORE, - requestedAttributes: { - TOXICITY: {}, - SEVERE_TOXICITY: {}, - }, - }), - } - ); - - const data = await response.json(); - - // If we get an error, just say it's not a toxic comment. - if (data.error) { + // Send the comment off to be analyzed. + const data = await send('comments:analyze', { + comment: { + text, + }, + // TODO: support other languages. + languages: ['en'], + doNotStore: DO_NOT_STORE, + requestedAttributes: { + TOXICITY: {}, + SEVERE_TOXICITY: {}, + }, + }); + if (!data || data.error) { debug('Received Error when submitting: %o', data.error); return { TOXICITY: { @@ -90,6 +106,19 @@ function isToxic(scoresOrProbability) { return probability > THRESHOLD; } +/** + * wrapError will mask API key in error messages. + * + * @param {Error} err the error potentially containing the API key + */ +function wrapError(err) { + if (err.message) { + err.message = err.message.replace(API_KEY, '***'); + } + + return err; +} + /** * maskKeyInError is a decorator that calls fn and masks the * API_KEY in errors before throwing. @@ -102,16 +131,83 @@ function maskKeyInError(fn) { try { return await fn(...args); } catch (err) { - if (err.message) { - err.message = err.message.replace(API_KEY, '***'); - } - throw err; + throw wrapError(err); } }; } +/** + * submitFeedback will send back moderation feedback to Perspective. + * + * @param {Object} comment the Comment that feedback is related to + * @param {Object} asset the Asset where the Comment was made on + * @param {Object} status the attribute to send back to Perspective + */ +const submitFeedback = ( + { + id: Coral_comment_id, // Comment ID. + parent_id: reply_to_id_Coral_comment_id, // Comment parent id (reply parent). + body: text, // Comment body. + }, // Comment. + { + url, // Asset (article) URL. + }, // Asset (article). + status // Either APPROVED, DELETED, or HIGHLIGHTED. +) => + // Handle this operation in the next tick, so it does not affect the current + // comment processing. + process.nextTick(async () => { + // Construct a client token. + const clientToken = `comment:${Coral_comment_id}`; + + try { + // Send the feedback to perspective. + const body = await send('comments:suggestscore', { + comment: { + text, + }, + context: { + entries: [ + { + text: JSON.stringify({ + url, + reply_to_id_Coral_comment_id, + Coral_comment_id, + }), + }, + ], + }, + attributeScores: { + [status]: { + summaryScore: { + value: 1, + }, + }, + }, + languages: ['EN'], + communityId, + clientToken, + }); + if (!body || body.clientToken !== clientToken) { + throw new Error( + `"${JSON.stringify( + body + )}" did not contain the clientToken we expected` + ); + } + + debug(`sent ${status} feedback to perspective`); + } catch (err) { + console.error( + `could not send ${status} feedback to perspective`, + wrapError(err) + ); + } + }); + module.exports = { getScores: maskKeyInError(getScores), getProbability, + submitFeedback, isToxic, }; From 17a801d6d2a9a742c50ada861a1baf04a60a3c95 Mon Sep 17 00:00:00 2001 From: Wyatt Johnson Date: Tue, 6 Nov 2018 12:56:02 -0700 Subject: [PATCH 14/32] fix: removed url parsing --- plugins/talk-plugin-toxic-comments/server/perspective.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/talk-plugin-toxic-comments/server/perspective.js b/plugins/talk-plugin-toxic-comments/server/perspective.js index b2e913d1d..db6d0c8de 100644 --- a/plugins/talk-plugin-toxic-comments/server/perspective.js +++ b/plugins/talk-plugin-toxic-comments/server/perspective.js @@ -1,4 +1,3 @@ -const { URL } = require('url'); const fetch = require('node-fetch'); const { API_ENDPOINT, @@ -14,7 +13,7 @@ const { ROOT_URL } = require('config'); // Use the ROOT_URL to grab the domain to construct a communityID for the // feedback. -const communityId = `Coral:${new URL(ROOT_URL).domain}`; +const communityId = `Coral:${ROOT_URL}`; async function send(method, body) { // Perform the fetch. From 9f6ddd3801b827c7fc10bb3c6cd8f87edef6bf61 Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Wed, 7 Nov 2018 13:31:06 -0500 Subject: [PATCH 15/32] Version 4.6.6 (#2066) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ba30a9aa7..353af862d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "talk", - "version": "4.6.5", + "version": "4.6.6", "description": "A better commenting experience from Mozilla, The New York Times, and the Washington Post. https://coralproject.net", "main": "app.js", "private": true, From bbf034a59545ed6a8ddacfb7194123b681d8a1eb Mon Sep 17 00:00:00 2001 From: Wyatt Johnson Date: Wed, 7 Nov 2018 22:27:48 +0000 Subject: [PATCH 16/32] Update ToxicDetail.js --- .../client/components/ToxicDetail.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/talk-plugin-toxic-comments/client/components/ToxicDetail.js b/plugins/talk-plugin-toxic-comments/client/components/ToxicDetail.js index 9530188f2..e1cab57c4 100644 --- a/plugins/talk-plugin-toxic-comments/client/components/ToxicDetail.js +++ b/plugins/talk-plugin-toxic-comments/client/components/ToxicDetail.js @@ -11,10 +11,10 @@ const getInfo = (toxicity, actions) => { let text = t('talk-plugin-toxic-comments.unlikely'); if (toxicity > 0.8) { text = t('talk-plugin-toxic-comments.highly_likely'); - } else if (toxicity >= 0.5) { - text = t('talk-plugin-toxic-comments.possibly'); } else if (toxicity >= 0.7) { text = t('talk-plugin-toxic-comments.likely'); + } else if (toxicity >= 0.5) { + text = t('talk-plugin-toxic-comments.possibly'); } return ( From 4a165c0972ea4fd8cee85cda488d1a81f133101d Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Thu, 8 Nov 2018 15:58:26 +0000 Subject: [PATCH 17/32] fix: ensure iframe is big enough for add email dialog --- .../client/containers/AddEmailAddressDialog.js | 10 +++++++++- yarn.lock | 7 ------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/plugins/talk-plugin-local-auth/client/containers/AddEmailAddressDialog.js b/plugins/talk-plugin-local-auth/client/containers/AddEmailAddressDialog.js index 34bb5603d..c6b5f6bc3 100644 --- a/plugins/talk-plugin-local-auth/client/containers/AddEmailAddressDialog.js +++ b/plugins/talk-plugin-local-auth/client/containers/AddEmailAddressDialog.js @@ -1,4 +1,6 @@ import React from 'react'; +import { findDOMNode } from 'react-dom'; + import PropTypes from 'prop-types'; import { compose, gql } from 'react-apollo'; import { bindActionCreators } from 'redux'; @@ -23,6 +25,12 @@ class AddEmailAddressDialog extends React.Component { componentDidMount() { this.props.startAttach(); + document.body.style.minHeight = + `${document.getElementById('talk-plugin-local-auth-email-dialog').clientHeight}px` + } + + componentWillUnmount() { + document.body.style.removeProperty("min-height"); } handleDone = () => { @@ -63,7 +71,7 @@ class AddEmailAddressDialog extends React.Component { } = this.props; return ( - + {step === 0 && } {step === 1 && !requireEmailConfirmation && ( diff --git a/yarn.lock b/yarn.lock index 8c729d3b8..14380061b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3319,13 +3319,6 @@ debug@2.6.8: dependencies: ms "2.0.0" -debug@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" - integrity sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg== - dependencies: - ms "^2.1.1" - decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" From f13654b29712a59907f1ee8bf942f49030e3e2c7 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Thu, 8 Nov 2018 16:04:16 +0000 Subject: [PATCH 18/32] fix: lint --- .../client/containers/AddEmailAddressDialog.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/plugins/talk-plugin-local-auth/client/containers/AddEmailAddressDialog.js b/plugins/talk-plugin-local-auth/client/containers/AddEmailAddressDialog.js index c6b5f6bc3..702634308 100644 --- a/plugins/talk-plugin-local-auth/client/containers/AddEmailAddressDialog.js +++ b/plugins/talk-plugin-local-auth/client/containers/AddEmailAddressDialog.js @@ -1,5 +1,4 @@ import React from 'react'; -import { findDOMNode } from 'react-dom'; import PropTypes from 'prop-types'; import { compose, gql } from 'react-apollo'; @@ -25,12 +24,14 @@ class AddEmailAddressDialog extends React.Component { componentDidMount() { this.props.startAttach(); - document.body.style.minHeight = - `${document.getElementById('talk-plugin-local-auth-email-dialog').clientHeight}px` + document.body.style.minHeight = `${ + document.getElementById('talk-plugin-local-auth-email-dialog') + .clientHeight + }px`; } componentWillUnmount() { - document.body.style.removeProperty("min-height"); + document.body.style.removeProperty('min-height'); } handleDone = () => { From 65a6b484a9a8ad7d070bc2837adead998ab9aa30 Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Fri, 9 Nov 2018 10:00:53 -0500 Subject: [PATCH 19/32] Add Spanish translations for blank comment history --- locales/es.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/locales/es.yml b/locales/es.yml index 1a393853b..cff505cbd 100644 --- a/locales/es.yml +++ b/locales/es.yml @@ -38,6 +38,9 @@ es: name: Nombre post: Publicar reply: Responder + comment_history_blank: + info: 'Una historia de tus comentarios aparecerá aquí' + title: 'No has escrito ningún comentario' comment_offensive: 'Este comentario es ofensivo' comment_plural: Comentarios comment_post_banned_word: 'Tu comentario contiene una o más palabras que no están permitidas en nuestro espacio, por lo que no será publicado. Si crees que es un error, por favor contactate con nuestro equipo de moderación.' From 4fd61b3731cfda39b815c19a6d367853798d9119 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Thu, 15 Nov 2018 23:51:14 +0100 Subject: [PATCH 20/32] fix: polyfill missing forEach for NodeLists in IE11 --- client/coral-admin/src/index.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/client/coral-admin/src/index.js b/client/coral-admin/src/index.js index 158870dec..b1232a049 100644 --- a/client/coral-admin/src/index.js +++ b/client/coral-admin/src/index.js @@ -14,6 +14,11 @@ import { hideShortcutsNote } from './actions/moderation'; smoothscroll.polyfill(); +if (!NodeList.prototype.forEach) { + // Polyfill IE11 missing forEach in NodeList. + NodeList.prototype.forEach = Array.prototype.forEach; +} + function init({ store, localStorage }) { const shouldHide = localStorage.getItem('coral:shortcutsNote') === 'hide'; if (shouldHide) { From 396ccbd6c2e67a6a9835442c6a0a7fadbb1b7e2b Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Thu, 15 Nov 2018 23:51:28 +0100 Subject: [PATCH 21/32] fix: workaround flexbox bug in IE11 --- .../src/routes/Moderation/components/Comment.css | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/client/coral-admin/src/routes/Moderation/components/Comment.css b/client/coral-admin/src/routes/Moderation/components/Comment.css index 5cd6a6ae2..282a83f3e 100644 --- a/client/coral-admin/src/routes/Moderation/components/Comment.css +++ b/client/coral-admin/src/routes/Moderation/components/Comment.css @@ -68,7 +68,12 @@ margin-top: 0px; flex: 1; color: black; - max-width: 500px; + /* + IE11 fix – Next line was supposed to be: + max-width: 500px; + */ + padding-right: 20px; + /** IE11 fix end **/ font-weight: 300; font-size: 16px; overflow-wrap: break-word; From eb58dd52f88a5afd627e4883cf5c85de92578c1d Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Mon, 26 Nov 2018 15:25:44 +0000 Subject: [PATCH 22/32] Fixed Sp translations --- plugins/talk-plugin-local-auth/translations.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/talk-plugin-local-auth/translations.yml b/plugins/talk-plugin-local-auth/translations.yml index ce133d319..7e52310c0 100644 --- a/plugins/talk-plugin-local-auth/translations.yml +++ b/plugins/talk-plugin-local-auth/translations.yml @@ -315,8 +315,8 @@ es: save: "Salvar" cancel: "Cancelar" edit: "Editar" - changed_password_msg: "Senha alterada - Sua senha foi alterada com sucesso" - forgot_password_sent: "Esqueceu a senha - Nós enviamos um email para recuperação da senha" + changed_password_msg: "Contraseña cambiada - Su contraseña ha sido cambiado" + forgot_password_sent: "Contraseña olvidada - Enviamos un email para recuperar la contraseña" change_password: "Cambiar Contraseña" passwords_dont_match: "Las contraseñas no coinciden" required_field: "Este campo es requerido" From 809b39ae2ac0099136e3509230814a91be13535e Mon Sep 17 00:00:00 2001 From: Richard Venneman Date: Tue, 27 Nov 2018 15:25:14 -0400 Subject: [PATCH 23/32] Update Dutch (nl_NL) translations --- locales/nl_NL.yml | 105 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 92 insertions(+), 13 deletions(-) diff --git a/locales/nl_NL.yml b/locales/nl_NL.yml index 007d07cd7..619ec543c 100644 --- a/locales/nl_NL.yml +++ b/locales/nl_NL.yml @@ -38,6 +38,9 @@ nl_NL: name: Naam post: Plaats reply: Beantwoord + comment_history_blank: + info: 'Reacties die je hebt geplaatst zullen hier verschijnen' + title: 'Je hebt nog geen reacties geplaatst' comment_offensive: 'Deze reactie is aanstootgevend' comment_plural: Reacties comment_post_banned_word: 'Je reactie bevat een of meerdere termen die wij niet toestaan. Neem contact op wanneer je het er niet mee eens bent.' @@ -45,7 +48,10 @@ nl_NL: comment_post_notif_premod: 'Dank voor je reactie! Deze wordt zo snel mogelijk gemodereerd.' comment_singular: Reactie common: + contains_link: 'Bevat link' copy: Kopieer + copied: Gekopieerd + notsupported: 'Niet ondersteund' error: 'Er is een fout opgetreden.' reaction: reactie reactions: reacties @@ -80,9 +86,11 @@ nl_NL: spam_ads: Spam/Ads staff: Staff status: Status + suspended: Geschorst username_and_email: 'Gebruikersnaam en e-mailadres' yes_ban_user: 'Ja, verban gebruiker' configure: + access_message: 'Je moet een admin zijn om toegang te krijgen tot de configuratie instellingen. Vraag de dichtsbijzijnde Admin om toegang!' apply: Toepassen banned_word_text: 'Reacties die deze woorden of zinnen bevatten (niet hoofdlettergevoelig) worden automatisch uit de conversatie verwijderd. Voer een woord in, en druk op enter of Tab om toe te passen. Je kunt ook een kommagescheiden lijst plakken.' banned_words_title: 'Lijst met verbannen woorden' @@ -107,6 +115,8 @@ nl_NL: custom_css_url_desc: 'URL van CSS stylesheet die de standaard Embed Conversatie stylesheet overschrijft. Kan intern of extern zijn.' days: Dagen description: 'Als admin kun je de instellingen aanpassen voor de conversatie bij dit verhaal:' + disable_commenting_desc: 'Schrijf een bericht dat wordt weergeven wanneer reageren is afgesloten.' + disable_commenting_title: 'Reacties afsluiten voor de gehele site' domain_list_text: 'Voer de domeinen in die je wil toestaan voor Talk, bijvoorbeeld je staging en productie-omgevingen (bijv. localhost:3000 staging.domeinnaam.com domeinnaam.com).' domain_list_title: 'Toegestane domeinnamen' edit_comment_timeframe_heading: 'Wijzig reactie tijdsduur' @@ -132,9 +142,23 @@ nl_NL: open: Open open_stream: 'Open Stream' open_stream_configuration: 'Deze converstatie is momenteel open. Door deze te sluiten kunnen geen nieuwe reacties meer worden geplaatst, maar de oude zullen nog steeds worden weergegeven.' + organization_contact_email: 'Organisatie Contact E-mailadres' + organization_info_copy: 'We gebruiken deze informatie in e-mail meldingen die door Talk worden verstuurd. Dit verbind de berichten met je organisatie en biedt gebruikers een manier om contact op te nemen mochten ze een probleem met hun account ondervinden.' + organization_info_copy_2: 'We raden aan om een algemeen e-mail account (bijvoorbeeld community@yournewsroom.com) te gebruiken voor dit doeleinde. Dit betekent dat dit adres onveranderd kan blijven en deze geen naam blootstelt die gebruikers kunnen gebruiken mocht hun account geblokkeerd worden.' + organization_information: 'Organisatie Informatie' + organization_name: 'Organisatie Naam' + suspect_or_forbidden_words_placeholder: 'Woord of uitdrukking' + product_guide_link: 'Product Handleiding' + report_bug_or_feedback: 'Rapporteer een bug of geef feedback' require_email_verification: 'Maak e-mail verificatie vereist' require_email_verification_text: 'Nieuwe gebruikers moeten hun e-mailadres verifiëren voordat ze door kunnen gaan.' save_changes: 'Wijzigingen opslaan' + save_changes_dialog: + cancel: Annuleren + copy: 'Je hebt een of meerdere wijzigingen gedaan zonder op te slaan. Wil je je wijzigingen opslaan of ongedaan maken?' + discard: 'Ongedaan maken' + save_settings: 'Instellingen Opslaan' + unsaved_changes: 'Niet-opgeslagen wijzigingen' shortcuts: Sneltoetsen sign_out: Uitloggen stories: Conversaties @@ -183,6 +207,9 @@ nl_NL: if_you_did_not: 'Wanneer jij dit niet hebt aangevraagd, kun je deze e-mail negeren.' subject: 'Email bevestiging' to_confirm: 'Ga naar de volgende link om het account te bevestigen:' + password_change: + body: 'Het wachtwoord voor je account is gewijzigd.\n\nAls je deze wijziging niet hebt aangevraagd, neem dan contact met ons op: {0}' + subject: '{0} wachtwoord wijziging' password_reset: if_you_did: 'Wanneer je dit zelf was,' please_click: 'klik dan hier om je wachtwoord te veranderen' @@ -192,44 +219,61 @@ nl_NL: embed_comments_tab: Reacties embedlink: copy: 'Kopieer naar klembord' + copied: Gekopieerd error: ALREADY_EXISTS: 'Bron bestaat al' + AUTHENTICATION: 'Er is een fout opgetreden tijdens het aanmelden van je account' CANNOT_IGNORE_STAFF: 'Kan geen Staff-leden negeren.' COMMENT_PARENT_NOT_VISIBLE: 'De reactie waarop je probeert te reageren bestaat niet of is inmiddels verwijderd.' COMMENT_TOO_SHORT: 'Reacties moeten meer dan één teken hebben. Herzie je reactie en probeer opnieuw.' COMMENT_TOO_LONG: 'Tekst is te lang' COMMENTING_CLOSED: 'Reageren is al afgesloten.' + COMMENTING_DISABLED: 'Reageren is momenteel uigeschakeld op deze site' confirm_password: 'Wachtwoorden komen niet overeen. Controleer opnieuw.' + DELETION_NOT_SCHEDULED: 'Verwijdering was niet ingepland' EDIT_USERNAME_NOT_AUTHORIZED: 'Je bent niet gemachtigd om je gebruikersnaam te wijzigen.' EDIT_WINDOW_ENDED: 'Dit commentaar kan niet langer worden gewijzigd. Het tijdsbestek is verstreken.' email: 'Geen geldig e-mailadres' + EMAIL_ALREADY_VERIFIED: 'E-mailadres is reeds geverifiëerd' EMAIL_IN_USE: 'E-mailadres al in gebruik' email_not_verified: 'E-mailadres {0} is niet geverifiëerd' EMAIL_NOT_VERIFIED: 'E-mailadres is niet geverifiëerd' email_password: 'E-mail en/of wachtwoord combinatie onjuist' EMAIL_REQUIRED: 'Een e-mailadres is vereist' EMAIL_VERIFICATION_TOKEN_INVALID: 'Ongeldig e-mail verificatie token' + INCORRECT_PASSWORD: 'Ongeldig wachtwoord' INVALID_ASSET_URL: 'Ongeldige URL' LOGIN_MAXIMUM_EXCEEDED: 'Je hebt te veel mislukte inlogpogingen gedaan. Even geduld aub.' network_error: 'Kon geen verbinding maken met server. Controleer je internetverbinding en probeer het opnieuw.' NO_SPECIAL_CHARACTERS: 'Gebruikersnamen kunnen alleen cijfers, letters en _ bevatten.' NOT_AUTHORIZED: 'Je bent niet geauthoriseerd om dit te doen.' NOT_FOUND: 'Bron niet gevonden' + organization_contact_email: 'Organisatie e-mailadres is niet geldig.' organization_name: 'Organisatienaam kan alleen cijfers en letters bevatten.' password: 'Wachtwoord moet minimaal 8 karakters lang zijn' + PAGE_NOT_AVAILABLE_ROLE: 'Deze pagina is enkel voor toegankelijk voor teamleden. Neem contact op met een admin als je toegang tot dit team wilt.' + PASSWORD_INCORRECT: 'Je huidige wachtwoord is incorrect ingevuld' PASSWORD_LENGTH: 'Wachtwoord is te kort' PASSWORD_REQUIRED: 'Je moet een wachtwoord invoeren.' PASSWORD_RESET_TOKEN_INVALID: 'Je wachtwoord-herstel token is ongeldig.' PROFANITY_ERROR: 'Gebruikersnamen mogen niet aanstootgevend zijn. Neem contact op met de administrator wanneer je denkt dat dit niet klopt.' RATE_LIMIT_EXCEEDED: 'Gebruikslimiet overschreden' + required_field: 'Dit veld is verplicht' SAME_USERNAME_PROVIDED: 'Je moet een andere gebruikersnaam invoeren.' - temporarily_suspended: 'Your account is currently suspended. It will be reactivated {0}. Please contact us if you have any questions.' + temporarily_suspended: 'Je account is momenteel geschorst. Deze zal worden gereactiveerd {0}. Neem s.v.p. contact met ons op voor vragen.' unexpected: 'Onverwachte fout opgetreden. Sorry!' username: 'Gebruikersnamen kunnen alleen cijfers, letters en _ bevatten.' USERNAME_IN_USE: 'Gebruikersnaam al in gebruik' USERNAME_REQUIRED: 'Gebruikersnaam is vereist' flag_comment: 'Rapporteer reactie' flag_reason: 'Reden voor rapporteren (optioneel)' + flag_reasons: + username: + impersonating: 'Deze gebruiker doet zich voor als iemand anders' + nolike: 'Ik vind deze gebruikersnaam niet leuk' + offensive: 'Deze gebruikersnaam is aanstootgevend' + other: Andere + spam: 'Dit lijkt op een advertentie/marketing' flag_username: 'Rapporteer gebruikersnaam' flagged_usernames: notify_approved: '{0} heeft gebruikersnaam {1} goedgekeurd' @@ -258,6 +302,7 @@ nl_NL: changed_name: msg: 'De verandering van je gebruikersnaam wordt door ons moderatieteam gecontroleerd.' comment: reactie + comment_is_deleted: 'De reageerder heeft zijn account verwijderd.' comment_is_hidden: 'Deze reactie is niet beschikbaar.' comment_is_ignored: 'Deze reactie is verborgen omdat je de gebruiker negeert.' comment_is_rejected: 'Je hebt deze reactie afgewezen.' @@ -306,6 +351,17 @@ nl_NL: title: 'Toegestane domeinnamen' like: Like loading_results: 'Resultaten worden geladen' + login: + email_address: E-mailadres + forgot_password: 'Wachtwoord vergeten?' + go_back: 'Ga terug' + sign_in: Inloggen + sign_in_button: Inloggen + sign_in_message: 'Log in om te communiceren met je community' + password: Wachtwoord + reset_password_send_button: 'Wachtwoord ophalen' + request_passowrd: 'Vraag een nieuwe aan.' + team_sign_in: 'Team login' marketing: 'Dit lijkt op een advertentie/marketing' moderate_this_stream: 'Modereer deze conversatie' modqueue: @@ -350,6 +406,8 @@ nl_NL: show_shortcuts: 'Toon sneltoetsen' singleview: Zen-modus sort: Sorteer + suspend: 'Schors gebruiker' + system_withheld: 'Achtergehouden door systeem' thismenu: 'Open dit menu' thousand: k toggle_search: 'Open zoekvenster' @@ -363,6 +421,7 @@ nl_NL: other: Ander password_reset: change_password: 'Verander wachtwoord' + change_password_help: 'Voer een nieuw wachtwoord in om mee in te loggen. Gebruik een veilig wachtwoord!' confirm_new_password: 'Bevestig nieuw wachtwoord' new_password: 'Nieuw wachtwoord' new_password_help: 'Wachtwoord moet minimaal 8 karakters lang zijn.' @@ -384,6 +443,13 @@ nl_NL: username: gebruikersnaam write_message: 'Schrijf een bericht' yes_suspend: 'Ja, schors' + reject_username_dialog: + cancel: Annuleren + description: 'Help ons dit te begrijpen' + message: 'Reden voor rapporteren (Optioneel)' + reason: Reden + reject_username: 'Gebruikersnaam afwijzen' + title: 'Gebruikersnaam afwijzen' reply: Beantwoord report: Rapporteer report_notif: 'Dank voor het rapporteren van deze reactie. Deze wordt zo snel mogelijk gemodereerd.' @@ -443,30 +509,43 @@ nl_NL: user_detail: all: Alle ban: 'Gebruiker verbannen' - email: Email + email: E-mailadres + id: ID + karma: Karma + karma_docs_link: 'https://docs.coralproject.net/talk/trust/#user-karma-score' + learn_more: 'Meer informatie' member_since: 'Lid sinds' reject_rate: 'Beoordeling verwijderen' + reject_username: 'Gebruikersnaam afwijzen' rejected: Afgewezen remove_ban: 'Verbanning verwijderen' remove_suspension: 'Schorsing opheffen' suspend: 'Gebruiker schorsen' + suspended: Geschorst total_comments: 'Totaal aantal reacties' + unreliable: Onbetrouwbaar user_history: Accountgeschiedenis + user_karma_score: 'Gebruiker Karma Score' + username: Gebruikersnaam + username_needs_approval: 'Gebruikersnaam heeft goedkeuring nodig' + username_rejected: 'Gebruikersnaam afgewezen' user_history: - action: Action - ban_removed: 'Ban removed' - date: Date - suspended: 'Suspended, {0}' - suspension_removed: 'Suspension removed' - system: System - taken_by: 'Taken By' - user_banned: 'User banned' - username_status: 'Username {0}' - user_impersonating: 'Deze gebruiker imiteert' + action: Actie + ban_removed: 'Schorsing opgeheven' + date: Datum + suspended: 'Geschorst, {0}' + suspension_removed: 'Schorsing opgeheven' + system: Systeem + taken_by: 'Genomen door' + user_banned: 'Gebruiker geschorst' + username_status: 'Gebruikersnaam {0}' + user_impersonating: 'Deze gebruiker doet zich voor als iemand anders' user_no_comment: 'Je hebt nog niet eerder gereageerd. Laat je mening horen!' username_offensive: 'Dit is een aanstootgevende gebruikersnaam.' validators: - confirm_password: 'Wachtwoorden komen niet overeen. Controleer opnieuw.' + confirm_email: 'E-mailadressen komen niet overeen. Controleer opnieuw.' + confirm_password: Wachtwoorden komen niet overeen. Controleer opnieuw. + required: 'Dit veld is verplicht' verify_email: 'Geen geldig e-mailadres' verify_organization_name: 'Organisatienaam kan alleen cijfers en letters bevatten.' verify_password: 'Wachtwoord moet minimaal 8 karakters lang zijn' From b3c034d89d71100c7566ab7bcd3507845708745e Mon Sep 17 00:00:00 2001 From: Richard Venneman Date: Tue, 27 Nov 2018 16:16:34 -0400 Subject: [PATCH 24/32] Add Dutch (nl_NL) translation for talk-plugin-local-auth --- .../talk-plugin-local-auth/translations.yml | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/plugins/talk-plugin-local-auth/translations.yml b/plugins/talk-plugin-local-auth/translations.yml index 7e52310c0..a13b005b5 100644 --- a/plugins/talk-plugin-local-auth/translations.yml +++ b/plugins/talk-plugin-local-auth/translations.yml @@ -376,3 +376,79 @@ es: description_2: "Puedes cambiar la configuración de tu cuenta visitando" path: "Mi perfil > Configuración" alert: "¡Correo electrónico agregado!" +nl_NL: + email: + email_change_original: + subject: E-mailadres wijziging + body: "Je e-mailadres is gewijzigd van {0} naar {1}. Als je deze wijziging niet hebt aangevraagd, neem dan s.v.p. contact op: {2}." + error: + NO_LOCAL_PROFILE: Er is geen bestaand e-mailadres geassocieerd met dit account. + LOCAL_PROFILE: Er is reeds een e-mailadres geassocieerd met dit account. + INCORRECT_PASSWORD: Het opgegeven wachtwoord is onjuist. + talk-plugin-local-auth: + change_password: + change_password: "Wachtwoord wijzigen" + passwords_dont_match: "Wachtwoorden komen niet overeen" + required_field: "Dit veld is verplicht" + forgot_password: "Wachtwoord vergeten?" + old_password: "Oud Wachtwoord" + new_password: "Nieuw Wachtwoord" + confirm_new_password: "Bevestig Nieuw Wachtwoord" + save: "Opslaan" + cancel: "Annuleren" + edit: "Wijzigen" + changed_password_msg: "Wachtwoord Gewijzigd - Je wachtwoord is succesvol gewijzigd" + forgot_password_sent: "Wachtwoord Vergeten - We hebben je een e-mail gestuurd om je wachtwoord te herstellen" + change_username: + change_username_note: "Gebruikersnamen kunnen eens per 14 dagen worden gewijzigd." + is_not_eligible: "Je kunt je gebruikersnaam momenteel niet wijzigen." + save: "Opslaan" + edit_profile: "Profiel wijzigen" + cancel: "Annuleren" + confirm_username_change: "Bevestig Gebruikersnaam Wijziging" + description: "Je probeert je gebruikersnaam te wijzigen. Je nieuwe gebruikersnaam zal verschijnen bij al je huidige en toekomstige reacties." + old_username: "Oude Gebruikersnaam" + new_username: "Nieuwe Gebruikersnaam" + re_enter: "Voer je nieuwe gebruikersnaam opnieuw in" + bottom_note: "Let op: Je kan je gebruikersnaam niet opnieuw wijzigen in de komende 14 dagen." + confirm_changes: "Bevestig Wijzigingen" + username_does_not_match: "Gebruikersnaam komt niet overeen" + cant_be_equal: "Je nieuwe {0} moet verschillen van je huidige" + changed_username_success_msg: "Gebruikersnaam Gewijzigd - Je gebruikersnaam is succesvol gewijzigd. Je kan je gebruikersnaam niet wijzigen voor de komende 14 dagen." + change_username_attempt: "Gebruikersnaam kan niet worden gewijzigd. Gebruikersnamen kunnen eens per 14 dagen worden gewijzigd." + change_email: + confirm_email_change: "Bevestig E-mailadres Wijziging" + description: "Je probeert je e-mailadres te wijzigen. Je nieuwe e-mailadres zal worden gebruikt om in te loggen en voor het ontvangen van account notificaties." + old_email: "Oude E-mailadres" + new_email: "Nieuwe E-mailadres" + enter_password: "Wachtwoord Invoeren" + incorrect_password: "Ongeldig Wachtwoord" + confirm_change: "Bevestig Wijziging" + cancel: "Annuleren" + change_email_msg: "E-mailadres Gewijzigd. Dit E-mailadres zal nu worden gebruikt om in te loggen en voor het ontvangen van account notificaties." + add_email: + add_email_address: "E-mailadres Toevoegen" + enter_email_address: "E-mailadres Invoeren:" + invalid_email_address: "Ongeldig E-mailadres" + confirm_email_address: "Bevestig E-mailadres:" + email_does_not_match: "E-mailadres komt niet overeen" + insert_password: "Wachtwoord Invoeren:" + confirm_password: "Wachtwoord Bevestigen:" + required_field: "Dit veld is verplicht" + done: "Klaar" + content: + title: "Voeg een e-mailadres toe" + description: "Voor je veiligheid vragen we gebruikers om een e-mailadres toe te voegen aan hun account. Je e-mailadres zal worden gebruikt om:" + item_1: "Updates te ontvangen omtrent wijzigingen in je account (e-mailadres, gebruikersnaam, wachtwoord, etc.)" + item_2: "Je reacties te kunnen downloaden." + item_3: "Reactie notificaties te sturen indien je hebt gekozen deze te ontvangen." + verify: + title: "Bevestig Je E-mailadres" + description: "We hebben een e-mail gestuurd aan {0} om je account te bevestigen. Je moet je e-mailadres verifiëren zodat deze gebruikt kan worden voor bevestigingen omtrent account wijzigingen en voor notificaties." + added: + title: "E-mailadres Toegevoegd" + description: "Je e-mailadres is toegevoegd aan je account." + subtitle: "Wil je je e-mailadres wijzigen?" + description_2: "Je kan je account instellingen wijzigen door te gaan naar" + path: "Mijn Profiel > Instellingen" + alert: "E-mailadres Toegevoegd!" From f60c7e3ca6b5cc9ea83fa7c28e8e63f5b6b6055c Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Tue, 27 Nov 2018 20:20:00 +0000 Subject: [PATCH 25/32] Version 4.6.7 (#2096) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 353af862d..e4b6088c3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "talk", - "version": "4.6.6", + "version": "4.6.7", "description": "A better commenting experience from Mozilla, The New York Times, and the Washington Post. https://coralproject.net", "main": "app.js", "private": true, From 8e29f0094c563d03c09e9ec83bda77c838216bf5 Mon Sep 17 00:00:00 2001 From: Richard Venneman Date: Tue, 27 Nov 2018 16:20:39 -0400 Subject: [PATCH 26/32] Add Dutch (nl_NL) translations for talk-plugin-facebook-auth --- .../client/translations.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/plugins/talk-plugin-facebook-auth/client/translations.yml b/plugins/talk-plugin-facebook-auth/client/translations.yml index ff2ba457d..ca98e390b 100644 --- a/plugins/talk-plugin-facebook-auth/client/translations.yml +++ b/plugins/talk-plugin-facebook-auth/client/translations.yml @@ -2,6 +2,10 @@ ar: talk-plugin-facebook-auth: sign_in: "تسجيل الدخول عبر حساب الفيسبوك" sign_up: "اشترك عبر حساب الفيسبوك" +de: + talk-plugin-facebook-auth: + sign_in: "Mit Facebook anmelden" + sign_up: "Mit Facebook registrieren" en: talk-plugin-facebook-auth: sign_in: "Sign in with Facebook" @@ -14,6 +18,10 @@ fr: talk-plugin-facebook-auth: sign_in: "Connectez-vous avec Facebook" sign_up: "Inscrivez-vous avec Facebook" +nl_NL: + talk-plugin-facebook-auth: + sign_in: "Inloggen met Facebook" + sign_up: "Registreren met Facebook" zh_CN: talk-plugin-facebook-auth: sign_in: "使用 Facebook 帐号" @@ -22,7 +30,3 @@ zh_TW: talk-plugin-facebook-auth: sign_in: "使用 Facebook 帳號" sign_up: "使用 Facebook 帳號" -de: - talk-plugin-facebook-auth: - sign_in: "Mit Facebook anmelden" - sign_up: "Mit Facebook registrieren" From ba0513fd6cbd027e95c37de0d6946ca3bc0604e3 Mon Sep 17 00:00:00 2001 From: Richard Venneman Date: Tue, 27 Nov 2018 16:22:00 -0400 Subject: [PATCH 27/32] Fix talk-plugin-member-since Dutch (nl_NL) translation Member != User --- plugins/talk-plugin-member-since/client/translations.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/talk-plugin-member-since/client/translations.yml b/plugins/talk-plugin-member-since/client/translations.yml index e143056c3..5f5fb4004 100644 --- a/plugins/talk-plugin-member-since/client/translations.yml +++ b/plugins/talk-plugin-member-since/client/translations.yml @@ -18,7 +18,7 @@ fr: member_since: "Member Since" nl_NL: talk-plugin-member-since: - member_since: "Gebruiker sinds" + member_since: "Lid sinds" pt_BR: talk-plugin-member-since: member_since: "Membro desde" From e2fac4a2dc16e424a0250d6a11e57425db8164c0 Mon Sep 17 00:00:00 2001 From: Richard Venneman Date: Tue, 27 Nov 2018 16:30:42 -0400 Subject: [PATCH 28/32] Fix and update talk-plugin-auth Dutch (nl_NL) translations --- .../talk-plugin-auth/client/translations.yml | 95 ++++++++++--------- 1 file changed, 52 insertions(+), 43 deletions(-) diff --git a/plugins/talk-plugin-auth/client/translations.yml b/plugins/talk-plugin-auth/client/translations.yml index 4ff4fb994..fe6324e21 100644 --- a/plugins/talk-plugin-auth/client/translations.yml +++ b/plugins/talk-plugin-auth/client/translations.yml @@ -297,49 +297,58 @@ fr: write_your_username: "Modifier votre nom d'utilisateur" your_username: "Votre nom d'utilisateur apparaît sur chaque commentaire que vous publiez." nl_NL: - sign_in: - email_verify_cta: "Controleer je e-mailadres." - request_new_verify_email: "Vraag nieuwe bevestigingsemail aan" - verify_email: "Bedankt voor het aanmaken van een account! We hebben een email verstuurd naar het adres dat je hebt opgegeven om je account te verifiëren." - verify_email2: "Je account moet worden geverifiëerd voordat je kunt deelnemen in de community." - not_you: "Ben je dit niet?" - logged_in_as: "Ingelogd als" - facebook_sign_in: "Inloggen met Facebook" - facebook_sign_up: "Registreren met Facebook" - logout: "Uitloggen" - sign_in: "Inloggen" - sign_in_to_join: "Log in om deel te nemen" - or: "Of" - email: "E-mailadres" - password: "Wachtwoord" - forgot_your_pass: "Wachtwoord vergeten?" - need_an_account: "Heb je een account nodig?" - register: "Registreren" - sign_up: "Aanmelden" - confirm_password: "Bevestig wachtwoord" - username: "Gebruikersnaam" - already_have_an_account: "Heb je al een account?" - recover_password: "Wachtwoord herstellen" - email_in_use: "E-mailadres is al in gebruik" - email_or_username_in_use: "E-mailadres of gebruikersnaam is al in gebruik" - required_field: "Dit is een vereist veld" - passwords_dont_match: "Wachtwoorden komen niet overeen" - special_characters: "Gebruikersnamen kunnen alleen letters, cijfers en _ bevatten" - sign_in_to_comment: "Aanmelden om te reageren" - check_the_form: "Het formulier bevat ongeldige invoer, controleer je invoer" - createdisplay: - check_the_form: "Het formulier bevat ongeldige invoer, controleer je invoer" - continue: "Doorgaan met dezelfde Facebook gebruikersnaam" - error_create: "Fout opgetreden bij het wijzigen van de gebruikersnaam" - fake_comment_body: "Dit is een voorbeeldreactie. Lezers kunnen hun gedachten en meningen met newsrooms delen in het reactie-gedeelte" - fake_comment_date: "1 minuut geleden" - if_you_dont_change_your_name: "Wanneer je je gebruikersnaam nu niet wijzigt, zal je Facebook naam bij al je reacties komen te staan." - required_field: "Vereist veld" - save: Opslaan - special_characters: "Gebruikersnamen kunnen alleen letters, cijfers en _ bevatten" - username: Gebruikersnaam - write_your_username: "Wijzig je gebruikersnaam" - your_username: "Je gebruikersnaam verschijnt bij al je reacties." + talk-plugin-auth: + login: + email_verify_cta: "Controleer je e-mailadres." + request_new_verify_email: "Vraag nieuwe bevestigingsemail aan" + verify_email: "Bedankt voor het aanmaken van een account! We hebben een email verstuurd naar het adres dat je hebt opgegeven om je account te verifiëren." + verify_email2: "Je account moet worden geverifiëerd voordat je kunt deelnemen in de community." + not_you: "Ben je dit niet?" + logged_in_as: "Ingelogd als" + logout: "Uitloggen" + sign_in: "Inloggen" + sign_in_to_join: "Log in om deel te nemen" + or: "Of" + email: "E-mailadres" + password: "Wachtwoord" + password_error: "Wachtwoord moet minstens 8 karakters bevatten." + forgot_your_pass: "Wachtwoord vergeten?" + need_an_account: "Heb je een account nodig?" + register: "Registreren" + sign_up: "Aanmelden" + confirm_password: "Bevestig wachtwoord" + username: "Gebruikersnaam" + already_have_an_account: "Heb je al een account?" + recover_password: "Wachtwoord herstellen" + email_in_use: "E-mailadres is al in gebruik" + email_or_username_in_use: "E-mailadres of gebruikersnaam is al in gebruik" + required_field: "Dit is een vereist veld" + passwords_dont_match: "Wachtwoorden komen niet overeen" + special_characters: "Gebruikersnamen kunnen alleen letters, cijfers en _ bevatten" + sign_in_to_comment: "Aanmelden om te reageren" + check_the_form: "Het formulier bevat ongeldige invoer, controleer je invoer" + set_username_dialog: + check_the_form: "Het formulier bevat ongeldige invoer, controleer je invoer" + continue: "Doorgaan met dezelfde Facebook gebruikersnaam" + error_create: "Fout opgetreden bij het wijzigen van de gebruikersnaam" + fake_comment_body: "Dit is een voorbeeldreactie. Lezers kunnen hun gedachten en meningen met newsrooms delen in het reactie-gedeelte" + fake_comment_date: "1 minuut geleden" + if_you_dont_change_your_name: "Wanneer je je gebruikersnaam nu niet wijzigt, zal je Facebook naam bij al je reacties komen te staan." + required_field: "Vereist veld" + save: Opslaan + special_characters: "Gebruikersnamen kunnen alleen letters, cijfers en _ bevatten" + username: Gebruikersnaam + write_your_username: "Wijzig je gebruikersnaam" + your_username: "Je gebruikersnaam verschijnt bij al je reacties." + change_password: + change_password: "Wachtwoord Wijzigen" + passwords_dont_match: "Wachtwoorden komen niet overeen" + required_field: "Dit veld is verplicht" + forgot_password: "Wachtwoord vergeten?" + save: "Opslaan" + cancel: "Annuleren" + edit: "Wijzigen" + changed_password_msg: "Je wachtwoord is succesvol gewijzigd" pt_BR: talk-plugin-auth: login: From f38e72c4df05bc0b84e6d1996e8d804d555aa8c1 Mon Sep 17 00:00:00 2001 From: Richard Venneman Date: Tue, 27 Nov 2018 16:32:36 -0400 Subject: [PATCH 29/32] Add Dutch (nl_NL) translations for talk-plugin-google-auth --- plugins/talk-plugin-google-auth/client/translations.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/talk-plugin-google-auth/client/translations.yml b/plugins/talk-plugin-google-auth/client/translations.yml index 10ebe24ae..70e184d4d 100644 --- a/plugins/talk-plugin-google-auth/client/translations.yml +++ b/plugins/talk-plugin-google-auth/client/translations.yml @@ -14,6 +14,10 @@ fr: talk-plugin-google-auth: sign_in: "Connectez-vous avec Google" sign_up: "Inscrivez-vous avec Google" +nl_NL: + talk-plugin-google-auth: + sign_in: "Inloggen met Google" + sign_up: "Registeren met Google" zh_CN: talk-plugin-google-auth: sign_in: "使用 Google 帐号" From 9c06a63afd799ec18453f5ed6619dda0baa9ecfc Mon Sep 17 00:00:00 2001 From: Richard Venneman Date: Tue, 27 Nov 2018 16:55:32 -0400 Subject: [PATCH 30/32] Add Dutch (nl_NL) translations for talk notifications plugins --- locales/nl_NL.yml | 2 +- .../client/translations.yml | 3 +++ .../client/translations.yml | 3 +++ .../translations.yml | 6 ++++++ .../client/translations.yml | 4 ++++ .../client/translations.yml | 4 ++++ .../client/translations.yml | 18 ++++++++++++++++++ .../server/translations.yml | 14 ++++++++++++++ 8 files changed, 53 insertions(+), 1 deletion(-) diff --git a/locales/nl_NL.yml b/locales/nl_NL.yml index 619ec543c..61cff7a42 100644 --- a/locales/nl_NL.yml +++ b/locales/nl_NL.yml @@ -143,7 +143,7 @@ nl_NL: open_stream: 'Open Stream' open_stream_configuration: 'Deze converstatie is momenteel open. Door deze te sluiten kunnen geen nieuwe reacties meer worden geplaatst, maar de oude zullen nog steeds worden weergegeven.' organization_contact_email: 'Organisatie Contact E-mailadres' - organization_info_copy: 'We gebruiken deze informatie in e-mail meldingen die door Talk worden verstuurd. Dit verbind de berichten met je organisatie en biedt gebruikers een manier om contact op te nemen mochten ze een probleem met hun account ondervinden.' + organization_info_copy: 'We gebruiken deze informatie in e-mail notificaties die door Talk worden verstuurd. Dit verbind de berichten met je organisatie en biedt gebruikers een manier om contact op te nemen mochten ze een probleem met hun account ondervinden.' organization_info_copy_2: 'We raden aan om een algemeen e-mail account (bijvoorbeeld community@yournewsroom.com) te gebruiken voor dit doeleinde. Dit betekent dat dit adres onveranderd kan blijven en deze geen naam blootstelt die gebruikers kunnen gebruiken mocht hun account geblokkeerd worden.' organization_information: 'Organisatie Informatie' organization_name: 'Organisatie Naam' diff --git a/plugins/talk-plugin-notifications-category-reply/client/translations.yml b/plugins/talk-plugin-notifications-category-reply/client/translations.yml index dc7bdc233..08fbb7fc6 100644 --- a/plugins/talk-plugin-notifications-category-reply/client/translations.yml +++ b/plugins/talk-plugin-notifications-category-reply/client/translations.yml @@ -10,3 +10,6 @@ es: de: talk-plugin-notifications-category-reply: toggle_description: Jemand antwortet auf meinen Kommentar +nl_NL: + talk-plugin-notifications-category-reply: + toggle_description: Iemand antwoord op mijn reactie diff --git a/plugins/talk-plugin-notifications-category-staff/client/translations.yml b/plugins/talk-plugin-notifications-category-staff/client/translations.yml index bd469ba3c..43c2f5c01 100644 --- a/plugins/talk-plugin-notifications-category-staff/client/translations.yml +++ b/plugins/talk-plugin-notifications-category-staff/client/translations.yml @@ -10,3 +10,6 @@ es: de: talk-plugin-notifications-category-staff: toggle_description: Ein Redaktionsmitglied antwortet auf meinen Kommentar +nl_NL: + talk-plugin-notifications-category-staff: + toggle_description: Een redactielid antwoord op mijn reactie diff --git a/plugins/talk-plugin-notifications-category-staff/translations.yml b/plugins/talk-plugin-notifications-category-staff/translations.yml index a5f6e8c2c..24fe7d9ea 100644 --- a/plugins/talk-plugin-notifications-category-staff/translations.yml +++ b/plugins/talk-plugin-notifications-category-staff/translations.yml @@ -23,3 +23,9 @@ de: staff: subject: "Jemand hat bei {0} auf Ihren Kommentar geantwortet" body: "{0}\n{1} arbeitet für {2} und hat auf Ihren Kommentar geantwortet: {3}" +nl_NL: + talk-plugin-notifications: + categories: + staff: + subject: "Iemand bij {0} heeft geantwoord op je reactie" + body: "{0}\n{1} werkt voor {2} en heeft geantwoord op je reactie: {3}" diff --git a/plugins/talk-plugin-notifications-digest-daily/client/translations.yml b/plugins/talk-plugin-notifications-digest-daily/client/translations.yml index 3b7d9979d..f71c3364b 100644 --- a/plugins/talk-plugin-notifications-digest-daily/client/translations.yml +++ b/plugins/talk-plugin-notifications-digest-daily/client/translations.yml @@ -14,3 +14,7 @@ de: talk-plugin-notifications: digest_enum: DAILY: Einmal täglich +nl_NL: + talk-plugin-notifications: + digest_enum: + DAILY: In een dagelijkse samenvatting diff --git a/plugins/talk-plugin-notifications-digest-hourly/client/translations.yml b/plugins/talk-plugin-notifications-digest-hourly/client/translations.yml index 2abd8636c..cb82b6253 100644 --- a/plugins/talk-plugin-notifications-digest-hourly/client/translations.yml +++ b/plugins/talk-plugin-notifications-digest-hourly/client/translations.yml @@ -14,3 +14,7 @@ de: talk-plugin-notifications: digest_enum: HOURLY: Stündlich +nl_NL: + talk-plugin-notifications: + digest_enum: + HOURLY: In een uurlijkse samenvatting diff --git a/plugins/talk-plugin-notifications/client/translations.yml b/plugins/talk-plugin-notifications/client/translations.yml index 6606d7dcf..f1967feca 100644 --- a/plugins/talk-plugin-notifications/client/translations.yml +++ b/plugins/talk-plugin-notifications/client/translations.yml @@ -70,3 +70,21 @@ de: digest_option: Benachrichtigungen senden digest_enum: NONE: Sofort +nl_NL: + talk-plugin-notifications: + settings_title: Notificaties + settings_subtitle: Ontvang notificaties wanneer + turn_off_all: Ik wil geen notificaties ontvangen + banner_info: + title: E-mail bevestiging vereist + text: Je moet een geverifieerd e-mailadres hebben om e-mail notificaties te ontvangen + verify_now: Verifieer je e-mailadres nu + banner_success: + title: E-mail verificatie verzonden + text: Een e-mail met verificatielink is verstuurd naar {0}. + banner_error: + title: Fout + text: Er is een fout opgetreden tijdens het versturen van je verificatie e-mail. Probeer het later nog eens. + digest_option: Notificaties versturen + digest_enum: + NONE: Onmiddelijk diff --git a/plugins/talk-plugin-notifications/server/translations.yml b/plugins/talk-plugin-notifications/server/translations.yml index 8c66af8eb..d063ab522 100644 --- a/plugins/talk-plugin-notifications/server/translations.yml +++ b/plugins/talk-plugin-notifications/server/translations.yml @@ -40,3 +40,17 @@ de: confirm: "Bestätigen" are_unsubscribed: "Sie haben haben alle Benachrichtigungen erfolgreich abbestellt." token_invalid: "Der Abbestell-Link ist ungültig. Klicken Sie den Link einer neueren E-Mail oder gehen Sie zu einem Kommentarbereich, melden Sie sich an und ändern Sie dort Ihre Benachrichtigungseinstellungen" +nl_NL: + talk-plugin-notifications: + templates: + digest: + subject: "Je recente reactie-activiteit op {0}" + footer: "Je hebt deze notificatie ontvangen omdat je een reageerder bent op {0} en je hebt je aangemeld om notificaties te ontvangen." + links: + unsubscribe: "Afmelden voor reactie notificaties" + unsubscribe_page: + unsubscribe: "Afmelden voor reactie notificaties" + click_to_confirm: "Klik onderstaande om te bevestigen dat je je wilt afmelden voor alle notificaties" + confirm: "Bevestigen" + are_unsubscribed: "Je bent nu afgemeld voor alle notificaties." + token_invalid: "Afmeldlink is ongeldig, klik de link van een recentere e-mail of bezoek een pagina met reacties en log in om je notificatie voorkeuren te wijzigen" From 286d9baddf2fe9b977fe0b57d3e768bbb9183824 Mon Sep 17 00:00:00 2001 From: Richard Venneman Date: Tue, 27 Nov 2018 16:56:49 -0400 Subject: [PATCH 31/32] Update Dutch (nl_NL) translations for talk-plugin-love --- plugins/talk-plugin-love/client/translations.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/talk-plugin-love/client/translations.yml b/plugins/talk-plugin-love/client/translations.yml index 872d77460..c42216844 100644 --- a/plugins/talk-plugin-love/client/translations.yml +++ b/plugins/talk-plugin-love/client/translations.yml @@ -24,8 +24,8 @@ fr: loved: Loved nl_NL: talk-plugin-love: - love: Ik hou er van - loved: Geliefd + love: Love + loved: Loved pt_BR: talk-plugin-love: love: Love From debdd3eae439850650d54395403a1771bee65726 Mon Sep 17 00:00:00 2001 From: Richard Venneman Date: Tue, 27 Nov 2018 16:56:56 -0400 Subject: [PATCH 32/32] Fix nl typo --- locales/nl_NL.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/nl_NL.yml b/locales/nl_NL.yml index 61cff7a42..c53177fc3 100644 --- a/locales/nl_NL.yml +++ b/locales/nl_NL.yml @@ -166,7 +166,7 @@ nl_NL: suspect_word_text: 'Reacties die deze woorden of zinsdelen bevatten (niet hoofdlettergevoelig) zullen worden gemarkeerd in de conversatie. Type een woord en druk op enter of tab om toe te voegen. Je kunt optioneel een komma-gescheiden lijst plakken.' suspect_word_title: 'Lijst met verdachte woorden' tech_settings: 'Technische instellingen' - title: 'Conversatie cnfigureren' + title: 'Conversatie configureren' weeks: Weken wordlist: 'Zwarte woordenlijst' confirm_email: