mirror of
https://github.com/wassname/talk.git
synced 2026-09-13 13:10:43 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d331bdee18 | ||
|
|
d6f6fbcd9c | ||
|
|
1ed5df71da | ||
|
|
f1a3a5ca28 | ||
|
|
8ef44dc6f5 | ||
|
|
362f29f77e | ||
|
|
08d342ea2e | ||
|
|
5d32c4ec03 | ||
|
|
50d4e2bb9b | ||
|
|
debdd3eae4 | ||
|
|
286d9baddf | ||
|
|
9c06a63afd | ||
|
|
f38e72c4df | ||
|
|
e2fac4a2dc | ||
|
|
ba0513fd6c | ||
|
|
8e29f0094c | ||
|
|
f60c7e3ca6 | ||
|
|
b3c034d89d | ||
|
|
be2657eb30 | ||
|
|
fd32d2aa24 | ||
|
|
809b39ae2a | ||
|
|
6197981480 | ||
|
|
eb58dd52f8 | ||
|
|
f5c011f44b | ||
|
|
396ccbd6c2 | ||
|
|
4fd61b3731 | ||
|
|
cbd795dc95 | ||
|
|
65a6b484a9 |
@@ -41,9 +41,9 @@ integration_job: &integration_job
|
||||
- attach_workspace:
|
||||
at: ~/coralproject/talk
|
||||
- <<: *create_indexes
|
||||
- run:
|
||||
name: Setup the database with defaults
|
||||
command: ./bin/cli setup --defaults
|
||||
# - run:
|
||||
# name: Setup the database with defaults
|
||||
# command: ./bin/cli setup --defaults
|
||||
- run:
|
||||
name: Run the integration tests
|
||||
command: bash .circleci/e2e.sh
|
||||
|
||||
@@ -11,6 +11,7 @@ ONBUILD ARG TALK_DEFAULT_LANG=en
|
||||
ONBUILD ARG TALK_WHITELISTED_LANGUAGES
|
||||
ONBUILD ARG TALK_PLUGINS_JSON
|
||||
ONBUILD ARG TALK_WEBPACK_SOURCE_MAP
|
||||
ONBUILD ARG TALK_DEFAULT_LAZY_RENDER
|
||||
|
||||
# Bundle app source
|
||||
ONBUILD COPY . /usr/src/app
|
||||
|
||||
+37
-31
@@ -45,11 +45,10 @@ const performSetup = async () => {
|
||||
} catch (err) {
|
||||
// If the error is `not init`, then we're good, otherwise, it's something
|
||||
// else.
|
||||
if (err instanceof ErrSettingsNotInit) {
|
||||
if (!err instanceof ErrSettingsNotInit) {
|
||||
throw err;
|
||||
return;
|
||||
}
|
||||
|
||||
throw err;
|
||||
}
|
||||
|
||||
if (program.defaults) {
|
||||
@@ -138,7 +137,7 @@ const performSetup = async () => {
|
||||
|
||||
console.log("\nWe'll ask you some questions about your first admin user.\n");
|
||||
|
||||
let user = await inquirer.prompt([
|
||||
let { username, email } = await inquirer.prompt([
|
||||
{
|
||||
type: 'input',
|
||||
name: 'username',
|
||||
@@ -161,39 +160,46 @@ const performSetup = async () => {
|
||||
return 'Email is required';
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'password',
|
||||
message: 'Password',
|
||||
type: 'password',
|
||||
filter: password => {
|
||||
return UsersService.isValidPassword(password).catch(err => {
|
||||
throw err.message;
|
||||
});
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'confirmPassword',
|
||||
message: 'Confirm Password',
|
||||
type: 'password',
|
||||
filter: (confirmPassword, { password }) => {
|
||||
if (password !== confirmPassword) {
|
||||
return Promise.reject(new Error('Passwords do not match'));
|
||||
}
|
||||
|
||||
return UsersService.isValidPassword(confirmPassword).catch(err => {
|
||||
throw err.message;
|
||||
});
|
||||
},
|
||||
},
|
||||
]);
|
||||
|
||||
let password = '';
|
||||
while (!password) {
|
||||
answers = await inquirer.prompt([
|
||||
{
|
||||
name: 'password',
|
||||
message: 'Password',
|
||||
type: 'password',
|
||||
filter: password => {
|
||||
try {
|
||||
UsersService.isValidPassword(password);
|
||||
} catch (err) {
|
||||
throw err.message;
|
||||
}
|
||||
|
||||
return password;
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'confirmPassword',
|
||||
message: 'Confirm Password',
|
||||
type: 'password',
|
||||
},
|
||||
]);
|
||||
|
||||
if (answers.password !== answers.confirmPassword) {
|
||||
console.error('Passwords do not match');
|
||||
} else {
|
||||
password = answers.password;
|
||||
}
|
||||
}
|
||||
|
||||
const ctx = Context.forSystem();
|
||||
let { user: newUser } = await SetupService.setup(ctx, {
|
||||
settings: settings.toObject(),
|
||||
user: {
|
||||
email: user.email,
|
||||
username: user.username,
|
||||
password: user.password,
|
||||
email,
|
||||
username,
|
||||
password,
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
/* global __webpack_public_path__ */ // eslint-disable-line no-unused-vars
|
||||
|
||||
import queryString from 'querystringify';
|
||||
import pym from 'pym.js';
|
||||
import EventEmitter from 'eventemitter2';
|
||||
import { buildUrl } from 'coral-framework/utils/url';
|
||||
import Snackbar from './Snackbar';
|
||||
import onIntersect from './onIntersect';
|
||||
import {
|
||||
createStorage,
|
||||
connectStorageToPym,
|
||||
@@ -10,13 +13,14 @@ import {
|
||||
|
||||
const NOTIFICATION_OFFSET = 200;
|
||||
|
||||
// Ensure there is a trailing slash.
|
||||
function ensureEndSlash(p) {
|
||||
return p.match(/\/$/) ? p : `${p}/`;
|
||||
}
|
||||
|
||||
// Build the URL to load in the pym iframe.
|
||||
function buildStreamIframeUrl(talkBaseUrl, query) {
|
||||
let url = [
|
||||
talkBaseUrl,
|
||||
talkBaseUrl.match(/\/$/) ? '' : '/', // make sure no double-'/' if opts.talk already ends with '/'
|
||||
'embed/stream?',
|
||||
].join('');
|
||||
let url = talkBaseUrl + 'embed/stream?';
|
||||
|
||||
url += queryString.stringify(query);
|
||||
|
||||
@@ -47,18 +51,76 @@ export default class Stream {
|
||||
events = null,
|
||||
snackBarStyles = null,
|
||||
onAuthChanged = null,
|
||||
talkStaticUrl = talkBaseUrl,
|
||||
...opts
|
||||
} = config;
|
||||
|
||||
this.onAuthChanged = onAuthChanged;
|
||||
this.el = el;
|
||||
this.talkBaseUrl = ensureEndSlash(talkBaseUrl);
|
||||
this.talkStaticUrl = ensureEndSlash(talkStaticUrl);
|
||||
this.opts = opts;
|
||||
|
||||
this.emitter = new EventEmitter({ wildcard: true });
|
||||
this.pym = new pym.Parent(el.id, buildStreamIframeUrl(talkBaseUrl, query), {
|
||||
title: opts.title,
|
||||
id: `${el.id}_iframe`,
|
||||
name: `${el.id}_iframe`,
|
||||
});
|
||||
this.snackBar = new Snackbar(snackBarStyles || {});
|
||||
this.emitter = new EventEmitter({ wildcard: true });
|
||||
|
||||
// Because we're loading chunks dynamically below, we need to point to the
|
||||
// static URL.
|
||||
//
|
||||
// The __webpack_public_path__ can be referenced:
|
||||
// https://webpack.js.org/configuration/output/#output-publicpath
|
||||
//
|
||||
__webpack_public_path__ = this.talkStaticUrl + 'static/';
|
||||
|
||||
// Attach to the events emitted by the pym parent.
|
||||
if (events) {
|
||||
events(this.emitter);
|
||||
}
|
||||
if (config.lazy || process.env.TALK_DEFAULT_LAZY_RENDER === 'TRUE') {
|
||||
const renderOnIntersect = () => onIntersect(this.el, () => this.render());
|
||||
if (!window.IntersectionObserver) {
|
||||
// Include a polyfill for the intersection observer.
|
||||
import(/* webpackChunkName: "intersection-observer" */ 'intersection-observer')
|
||||
.then(() => {
|
||||
// Polyfill applied.
|
||||
renderOnIntersect();
|
||||
})
|
||||
.catch(e => {
|
||||
console.error(e);
|
||||
// Loading polyfill failed, just render it directly.
|
||||
this.render();
|
||||
});
|
||||
} else {
|
||||
// No need for polyfill.
|
||||
renderOnIntersect();
|
||||
}
|
||||
} else {
|
||||
this.render();
|
||||
}
|
||||
}
|
||||
|
||||
assertRendered() {
|
||||
if (!this.pym) {
|
||||
throw new Error('Stream Embed must be rendered first');
|
||||
}
|
||||
}
|
||||
|
||||
isRendered() {
|
||||
return !!this.pym;
|
||||
}
|
||||
|
||||
render() {
|
||||
if (this.pym) {
|
||||
throw new Error('Stream Embed already rendered');
|
||||
}
|
||||
this.pym = new pym.Parent(
|
||||
this.el.id,
|
||||
buildStreamIframeUrl(this.talkBaseUrl, this.query),
|
||||
{
|
||||
title: this.opts.title,
|
||||
id: `${this.el.id}_iframe`,
|
||||
name: `${this.el.id}_iframe`,
|
||||
}
|
||||
);
|
||||
|
||||
// Workaround: IOS Safari ignores `width` but respects `min-width` value.
|
||||
this.pym.el.firstChild.style.width = '1px';
|
||||
@@ -73,19 +135,14 @@ export default class Stream {
|
||||
}
|
||||
});
|
||||
|
||||
// Attach to the events emitted by the pym parent.
|
||||
if (events) {
|
||||
events(this.emitter);
|
||||
}
|
||||
|
||||
this.pym.onMessage('getConfig', () => {
|
||||
this.pym.sendMessage('config', JSON.stringify(opts));
|
||||
this.pym.sendMessage('config', JSON.stringify(this.opts));
|
||||
});
|
||||
|
||||
// If the auth changes, and someone is listening for it, then re-emit it.
|
||||
if (onAuthChanged) {
|
||||
if (this.onAuthChanged) {
|
||||
this.pym.onMessage('coral-auth-changed', message => {
|
||||
onAuthChanged(message ? JSON.parse(message) : null);
|
||||
this.onAuthChanged(message ? JSON.parse(message) : null);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -163,22 +220,27 @@ export default class Stream {
|
||||
}
|
||||
|
||||
enablePluginsDebug() {
|
||||
this.assertRendered();
|
||||
this.pym.sendMessage('enablePluginsDebug');
|
||||
}
|
||||
|
||||
disablePluginsDebug() {
|
||||
this.assertRendered();
|
||||
this.pym.sendMessage('disablePluginsDebug');
|
||||
}
|
||||
|
||||
login(token) {
|
||||
this.assertRendered();
|
||||
this.pym.sendMessage('login', token);
|
||||
}
|
||||
|
||||
logout() {
|
||||
this.assertRendered();
|
||||
this.pym.sendMessage('logout');
|
||||
}
|
||||
|
||||
remove() {
|
||||
this.assertRendered();
|
||||
// Remove the event listeners.
|
||||
document.removeEventListener('click', this.handleClick.bind(this));
|
||||
this.emitter.removeAllListeners();
|
||||
@@ -191,6 +253,7 @@ export default class Stream {
|
||||
}
|
||||
|
||||
handleClick() {
|
||||
this.assertRendered();
|
||||
this.pym.sendMessage('click');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ export class Talk {
|
||||
* @param {String} [config.asset_url] - Asset URL
|
||||
* @param {String} [config.asset_id] - Asset ID
|
||||
* @param {String} [config.auth_token] - (optional) A jwt representing the session
|
||||
* @param {String} [config.lazy] - (optional) If set the stream will only render lazily.
|
||||
* @return {Object}
|
||||
*
|
||||
* Example:
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
export default function onIntersect(el, callback) {
|
||||
if (!IntersectionObserver) {
|
||||
// tslint:disable-next-line:no-console
|
||||
console.warn('IntersectionObserver not available');
|
||||
callback();
|
||||
return;
|
||||
}
|
||||
const options = {
|
||||
rootMargin: '100px',
|
||||
threshold: 1.0,
|
||||
};
|
||||
|
||||
const observer = new IntersectionObserver(entries => {
|
||||
if (entries[0].isIntersecting) {
|
||||
observer.disconnect();
|
||||
callback();
|
||||
}
|
||||
}, options);
|
||||
observer.observe(el);
|
||||
}
|
||||
@@ -76,6 +76,10 @@ const CONFIG = {
|
||||
// on the scraper when it makes requests.
|
||||
SCRAPER_HEADERS: process.env.TALK_SCRAPER_HEADERS || '{}',
|
||||
|
||||
// HTTP_X_REQUEST_ID is a string which represents the request header where we
|
||||
// should source the request ID from, otherwise, a new one will be generated.
|
||||
HTTP_X_REQUEST_ID: process.env.TALK_HTTP_X_REQUEST_ID || null,
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// JWT based configuration
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
@@ -187,8 +187,10 @@ and walk through the initial setup steps.
|
||||
|
||||
* First, enter your **Organization Name** and **Organization Contact Email**. This will appear in emails when inviting new team members.
|
||||
* Next, create your Admin user. You can specify an **Email Address**, **Username**, and **Password**
|
||||
|
||||
* Finally, enter your list of **Permitted Domains**, read [here](/talk/configuring-talk/#permitted-domains) about whitelisting domains
|
||||
|
||||
|
||||
_During development, ensure you whitelist 127.0.0.1:3000 otherwise the
|
||||
[http://127.0.0.1:3000/](http://127.0.0.1:3000/) page will not
|
||||
load._
|
||||
@@ -220,6 +222,17 @@ Once you have added the domain of these docs, you can click the button below.
|
||||
<div class="mount"></div>
|
||||
</div>
|
||||
|
||||
### Developer Endpoints
|
||||
|
||||
With your local instance of Talk running in development mode (env variable `NODE_ENV=development`) you should now also be able to access the following developer routes:
|
||||
|
||||
* [http://127.0.0.1:3000/dev](http://127.0.0.1:3000/dev]) provides a sample comment stream
|
||||
|
||||
* [http://127.0.0.1:3000/dev/assets](http://127.0.0.1:3000/dev/assets]) provides a list of all stories in Talk and can generate new sample assets
|
||||
|
||||
### Conclusion
|
||||
At this point you've successfully installed, configured, and ran your very own
|
||||
instance of Talk! Continue through this documentation on this site to learn more
|
||||
on how to configure, develop with, and contribute to Talk!
|
||||
|
||||
|
||||
|
||||
@@ -70,5 +70,7 @@ You can now start the application by running:
|
||||
yarn watch:server
|
||||
```
|
||||
|
||||
If you are developing a custom plugin you can use `yarn watch:client` or `yarn watch` to run both client and server.
|
||||
|
||||
At this stage, you should refer to the [configuration](/talk/configuration/) for
|
||||
configuration variables that are specific to your installation.
|
||||
|
||||
@@ -23,11 +23,13 @@ permalink: /pre-launch-checklist/
|
||||
|
||||
- [ ] Do you need to migrate comments from a legacy system? We currently support Disqus, Livefyre, and Civil Comments.
|
||||
- Use the [Talk Import](https://github.com/coralproject/talk-importer) framework
|
||||
|
||||
|
||||
|
||||
- [ ] Do you want to provide single sign-on (SSO) by integrating with an external auth system?
|
||||
- See [Authenticating with Talk](/talk/integrating/authentication/)
|
||||
|
||||
- [ ] Do you want to integrate Talk with your CMS to automate embedding Talk Comment Stream into your site?
|
||||
- See [Asset Management](/talk/integrating/asset-management/)
|
||||
|
||||
- [ ] Do you want to use Social sign-on?
|
||||
- Facebook
|
||||
|
||||
@@ -5,13 +5,15 @@ permalink: /commenter-features/
|
||||
|
||||
## Signing up for Talk
|
||||
|
||||
There are 2 ways that newsrooms can support signup/login functionality with Talk:
|
||||
There are 3 ways that newsrooms can support signup/login functionality with Talk:
|
||||
|
||||
* Use Talk’s auth plugin out of the box (supports account registration with username and password, as well as features like forgot password)
|
||||
|
||||
* Use 3rd party authentication provider such as FaceBook or Google. We provide plugins that support logging in with either [Facebook](/talk/plugin/talk-plugin-facebook-auth/)
|
||||
or [Google](/talk/plugin/talk-plugin-google-auth/). (Note: you must provide your own Facebook App ID and Secret, which you can read more about here: [https://developers.facebook.com](https://developers.facebook.com))
|
||||
|
||||
* Create their own auth plugin to integrate with your own auth systems
|
||||
|
||||
We also provide a Facebook auth plugin that supports logging in with Facebook (you must provide your own Facebook App ID and Secret, which you can read more about here: [https://developers.facebook.com](https://developers.facebook.com))
|
||||
|
||||
## Comments and Replies
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ By default, Talk will use "Lazy Asset Creation" to dynamically generate Assets
|
||||
in Talk in order to make it easier for lighter installations. In order to have
|
||||
more strict control over this flow, we will create a plugin that will:
|
||||
|
||||
|
||||
1. Disable "Lazy Asset Creation" by [Overriding a Resolver](#overriding-a-resolver).
|
||||
2. Create Assets from our CMS by [Creating a New Asset Route](#creating-a-new-asset-route).
|
||||
3. Facilitate updates from our CMS to keep Talk in sync by [Creating an Asset Update Route](#creating-an-asset-update-route).
|
||||
@@ -248,7 +249,7 @@ module.exports = router => {
|
||||
};
|
||||
```
|
||||
|
||||
As you can see from the previous step of [Creating a New Asset Route](#creating-a-New-Asset-Route)
|
||||
As you can see from the previous step of [Creating a New Asset Route](#Creating%20a%20New%20Asset%20Route)
|
||||
, we have added the new `PUT` route to the router. This is a simple addition
|
||||
that allows your CMS to call into Talk when the asset has updated it's title,
|
||||
it's url (or really anything in the [AssetSchema](https://github.com/coralproject/talk/blob/master/models/asset.js)) to keep the Talk Admin and links up to date.
|
||||
|
||||
@@ -3,8 +3,10 @@ title: Authenticating with Talk
|
||||
permalink: /integrating/authentication/
|
||||
---
|
||||
|
||||
You can integrate Talk with any external authentication service that will enable
|
||||
seamless single sign-on for users within your organization. There are a few
|
||||
Out of the box Talk supports account registration with username and password, as well as features like forgot password.
|
||||
|
||||
You can also integrate Talk with any external authentication service that will enable
|
||||
seamless single sign-on (SSO) for users within your organization. There are a few
|
||||
methods of doing so:
|
||||
|
||||
1. Passport Middleware
|
||||
@@ -17,8 +19,12 @@ choice.
|
||||
|
||||
You would choose the **Passport Middleware** route when you are OK using an auth
|
||||
that is triggered from inside Talk that is not connected to an external auth
|
||||
state (you don't use the auth anywhere else now). A great example of this is our
|
||||
[talk-plugin-facebook-auth](/talk/plugin/talk-plugin-facebook-auth/) plugin.
|
||||
state (you don't use the auth anywhere else now).
|
||||
|
||||
Plugins are available for the following 3rd party authentication providers:
|
||||
|
||||
* [Facebook](/talk/plugin/talk-plugin-facebook-auth/)
|
||||
* [Google](/talk/plugin/talk-plugin-google-auth/)
|
||||
|
||||
## Custom Token Integration
|
||||
|
||||
|
||||
@@ -105,6 +105,8 @@ Then the application can be started as is.
|
||||
|
||||
### Docker
|
||||
|
||||
To deploy customized plugins to a production instance of Talk, we recommend using the Docker onbuild strategy outlined below.
|
||||
|
||||
If you deploy using Docker, you can extend from the `*-onbuild` image, an
|
||||
example `Dockerfile` for your project could be:
|
||||
|
||||
@@ -112,14 +114,22 @@ example `Dockerfile` for your project could be:
|
||||
FROM coralproject/talk:4.5-onbuild
|
||||
```
|
||||
|
||||
Where the directory for your instance would contain a `plugins.json` file
|
||||
describing the plugin requirements and a `plugins` directory containing any
|
||||
Establish a private repository for your instance that includes the following:
|
||||
|
||||
* a `plugins.json` file
|
||||
listing the plugin requirements
|
||||
* a `plugins` directory containing any
|
||||
other local plugins that should be included.
|
||||
* a Dockerfile as outlined above
|
||||
|
||||
Git submodules can also be used to point to plugin directories that might be outside your primary repository.
|
||||
|
||||
Onbuild triggers will execute when the image is building with your custom
|
||||
configuration and will ensure that the image is ready to use by building all
|
||||
assets inside the image as well.
|
||||
|
||||
Once built, you can deploy the docker image to your architecture by tagging the image and including it in your docker-compose.yml.
|
||||
|
||||
For more information on the onbuild image, refer to the
|
||||
[Installation from Docker](/talk/installation-from-docker/) documentation.
|
||||
|
||||
|
||||
@@ -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.'
|
||||
|
||||
+93
-14
@@ -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 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'
|
||||
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
|
||||
@@ -142,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:
|
||||
@@ -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'
|
||||
|
||||
+16
-6
@@ -1,11 +1,21 @@
|
||||
const { HTTP_X_REQUEST_ID } = require('../config');
|
||||
const uuid = require('uuid/v1');
|
||||
|
||||
// Trace middleware attaches a request id to each incoming request.
|
||||
module.exports = (req, res, next) => {
|
||||
req.id = uuid();
|
||||
module.exports = HTTP_X_REQUEST_ID
|
||||
? (req, res, next) => {
|
||||
req.id = req.get(HTTP_X_REQUEST_ID) || uuid();
|
||||
|
||||
// Add the context ID to the request as an HTTP header.
|
||||
res.set('X-Talk-Trace-ID', req.id);
|
||||
// Add the context ID to the request as an HTTP header.
|
||||
res.set('X-Talk-Trace-ID', req.id);
|
||||
|
||||
next();
|
||||
};
|
||||
next();
|
||||
}
|
||||
: (req, res, next) => {
|
||||
req.id = uuid();
|
||||
|
||||
// Add the context ID to the request as an HTTP header.
|
||||
res.set('X-Talk-Trace-ID', req.id);
|
||||
|
||||
next();
|
||||
};
|
||||
|
||||
+3
-2
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "talk",
|
||||
"version": "4.6.6",
|
||||
"version": "4.6.9",
|
||||
"description": "A better commenting experience from Mozilla, The New York Times, and the Washington Post. https://coralproject.net",
|
||||
"main": "app.js",
|
||||
"private": true,
|
||||
@@ -105,7 +105,7 @@
|
||||
"eventemitter2": "^4.1.2",
|
||||
"exports-loader": "^0.6.4",
|
||||
"express": "4.16.0",
|
||||
"express-static-gzip": "^0.3.1",
|
||||
"express-static-gzip": "^1.1.1",
|
||||
"extract-text-webpack-plugin": "^3.0.2",
|
||||
"file-loader": "^0.11.2",
|
||||
"final-form": "^4.8.1",
|
||||
@@ -130,6 +130,7 @@
|
||||
"imports-loader": "^0.7.1",
|
||||
"inquirer": "^3.2.2",
|
||||
"inquirer-autocomplete-prompt": "^0.12.1",
|
||||
"intersection-observer": "^0.5.1",
|
||||
"ioredis": "3.1.4",
|
||||
"ip": "^1.1.5",
|
||||
"jest": "^23.0.0",
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 帐号"
|
||||
|
||||
@@ -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"
|
||||
@@ -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!"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
+22
-1
@@ -42,6 +42,26 @@ if (!DISABLE_STATIC_SERVER) {
|
||||
res.redirect(301, newEmbed);
|
||||
});
|
||||
|
||||
/**
|
||||
* setHeaders adds new headers related to caching to the static files that are
|
||||
* served.
|
||||
*
|
||||
* @param res the response that can be used to set headers on
|
||||
* @param path the path on the filesystem where the files are being served from
|
||||
*/
|
||||
const setHeaders = (res, path) => {
|
||||
if (path.endsWith('embed.js')) {
|
||||
// The embed.js file itself should not be cached for a long duration of
|
||||
// time, as it may change based on the deploy.
|
||||
res.setHeader('Cache-Control', 'public, max-age=3600');
|
||||
} else {
|
||||
// All static files besides the embed.js file contain hashes, we should
|
||||
// ensure that any other file is cached for a long duration of time. This
|
||||
// is cached for 1 week.
|
||||
res.setHeader('Cache-Control', 'public, max-age=604800, immutable');
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Serve the directories under dist.
|
||||
*/
|
||||
@@ -58,10 +78,11 @@ if (!DISABLE_STATIC_SERVER) {
|
||||
fileExtension: 'zz',
|
||||
},
|
||||
],
|
||||
setHeaders,
|
||||
})
|
||||
);
|
||||
} else {
|
||||
router.use('/static', express.static(dist));
|
||||
router.use('/static', express.static(dist, { setHeaders }));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -159,6 +159,9 @@ const config = {
|
||||
'process.env': {
|
||||
VERSION: `"${require('./package.json').version}"`,
|
||||
NODE_ENV: `${JSON.stringify(process.env.NODE_ENV)}`,
|
||||
TALK_DEFAULT_LAZY_RENDER: `${JSON.stringify(
|
||||
process.env.TALK_DEFAULT_LAZY_RENDER
|
||||
)}`,
|
||||
},
|
||||
}),
|
||||
new webpack.EnvironmentPlugin({
|
||||
|
||||
@@ -4277,10 +4277,10 @@ exports-loader@^0.6.4:
|
||||
loader-utils "^1.0.2"
|
||||
source-map "0.5.x"
|
||||
|
||||
express-static-gzip@^0.3.1:
|
||||
version "0.3.2"
|
||||
resolved "https://registry.yarnpkg.com/express-static-gzip/-/express-static-gzip-0.3.2.tgz#89ede84547a5717de3146315f62dc996c071a88d"
|
||||
integrity sha512-xFOW5Lxrh4xLey5i6gGWHOFznJayGCxazUau0kq7ElUh1t7q2B6IlvWv4d3UJwJej+aXEu9os/VpzPvRchdNiA==
|
||||
express-static-gzip@^1.1.1:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.yarnpkg.com/express-static-gzip/-/express-static-gzip-1.1.3.tgz#345ea02637d9d5865777d6fb57ccc0884abcda65"
|
||||
integrity sha512-k8Q4Dx4PDpzEb8kth4uiPWrBeJWJYSgnWMzNdjQUOsEyXfYKbsyZDkU/uXYKcorRwOie5Vzp4RMEVrJLMfB6rA==
|
||||
dependencies:
|
||||
serve-static "^1.12.3"
|
||||
|
||||
@@ -6042,6 +6042,11 @@ interpret@^1.0.0, interpret@^1.0.1:
|
||||
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
|
||||
integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=
|
||||
|
||||
intersection-observer@^0.5.1:
|
||||
version "0.5.1"
|
||||
resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.5.1.tgz#e340fc56ce74290fe2b2394d1ce88c4353ac6dfa"
|
||||
integrity sha512-Zd7Plneq82kiXFixs7bX62YnuZ0BMRci9br7io88LwDyF3V43cQMI+G5IiTlTNTt+LsDUppl19J/M2Fp9UkH6g==
|
||||
|
||||
invariant@^2.0.0, invariant@^2.2.0, invariant@^2.2.1, invariant@^2.2.2:
|
||||
version "2.2.4"
|
||||
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
|
||||
|
||||
Reference in New Issue
Block a user