diff --git a/.github/ISSUE_TEMPLATE/devops_ticket.md b/.github/ISSUE_TEMPLATE/devops_ticket.md
new file mode 100644
index 000000000..6f8ea55cb
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/devops_ticket.md
@@ -0,0 +1,24 @@
+---
+name: 💥 DevOps ticket
+about: Help us manage our deployed App.
+labels: devops
+title: 💥 [DevOps]
+---
+
+## :fire: DevOps ticket
+
+
+### Motive
+
+
+### Related issues
+
+
+### Implementation
+
+
+### Validation
+
+
+### Additional context
+
diff --git a/.github/ISSUE_TEMPLATE/refactor_tickets.md b/.github/ISSUE_TEMPLATE/refactor_tickets.md
new file mode 100644
index 000000000..b6c799f67
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/refactor_tickets.md
@@ -0,0 +1,20 @@
+---
+name: 🔧 Refactor ticket
+about: Help us improve our code by refactoring it.
+labels: refactor
+title: 🔧 [Refactor]
+---
+
+## :zap: Refactor ticket
+
+
+### Motive
+
+### Related issues
+
+
+### Implementation
+
+
+### Additional context
+
diff --git a/.travis.yml b/.travis.yml
index f598594cb..7cfb983cd 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -24,6 +24,9 @@ script:
- export CYPRESS_RETRIES=1
- export BRANCH=$(if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then echo $TRAVIS_BRANCH; else echo $TRAVIS_PULL_REQUEST_BRANCH; fi)
- echo "TRAVIS_BRANCH=$TRAVIS_BRANCH, PR=$PR, BRANCH=$BRANCH"
+ # Miscellaneous
+ - ./scripts/translations/sort.sh
+ - ./scripts/translations/missing-keys.sh
# Backend
- docker-compose exec backend yarn run lint
- docker-compose exec backend yarn run test --ci --verbose=false --coverage
@@ -69,7 +72,3 @@ deploy:
script: bash scripts/deploy.sh
on:
branch: master
- - provider: script
- script: bash scripts/github_release.sh
- on:
- branch: master
diff --git a/.vscode/settings.json b/.vscode/settings.json
deleted file mode 100644
index 8565bda8e..000000000
--- a/.vscode/settings.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "eslint.validate": [
- "javascript",
- "javascriptreact",
- {
- "language": "vue",
- "autoFix": true
- }
- ],
- "editor.formatOnSave": false,
-}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 842838f83..8067daad4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,10 +4,67 @@ All notable changes to this project will be documented in this file. Dates are d
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
+#### [v0.3.1](https://github.com/Human-Connection/Human-Connection/compare/v0.3.0...v0.3.1)
+
+> 10 February 2020
+
+- fix: Display unblock feature only for blocking user [`#3034`](https://github.com/Human-Connection/Human-Connection/pull/3034)
+- refactor(factories): Refactor test factories with rosie.js [`#2921`](https://github.com/Human-Connection/Human-Connection/pull/2921)
+- build(deps-dev): bump @vue/cli-shared-utils from 4.1.2 to 4.2.2 in /webapp [`#3031`](https://github.com/Human-Connection/Human-Connection/pull/3031)
+- build(deps): bump graphql-shield from 7.0.10 to 7.0.11 in /backend [`#3028`](https://github.com/Human-Connection/Human-Connection/pull/3028)
+- build(deps-dev): bump codecov from 3.6.4 to 3.6.5 [`#3027`](https://github.com/Human-Connection/Human-Connection/pull/3027)
+- chore: Add DevOps issue template [`#2999`](https://github.com/Human-Connection/Human-Connection/pull/2999)
+- fix: Error pages can be translated [`#2826`](https://github.com/Human-Connection/Human-Connection/pull/2826)
+- build(deps-dev): bump apollo-server-testing from 2.9.16 to 2.10.0 in /backend [`#3020`](https://github.com/Human-Connection/Human-Connection/pull/3020)
+- build(deps): bump apollo-server from 2.9.16 to 2.10.0 in /backend [`#3019`](https://github.com/Human-Connection/Human-Connection/pull/3019)
+- build(deps): bump graphql-tag from 2.10.2 to 2.10.3 in /backend [`#3011`](https://github.com/Human-Connection/Human-Connection/pull/3011)
+- build(deps): bump graphql-shield from 7.0.9 to 7.0.10 in /backend [`#3010`](https://github.com/Human-Connection/Human-Connection/pull/3010)
+- build(deps-dev): bump @storybook/addon-actions from 5.3.10 to 5.3.12 in /webapp [`#2998`](https://github.com/Human-Connection/Human-Connection/pull/2998)
+- build(deps-dev): bump @storybook/addon-notes from 5.3.10 to 5.3.12 in /webapp [`#2997`](https://github.com/Human-Connection/Human-Connection/pull/2997)
+- build(deps-dev): bump @storybook/addon-a11y from 5.3.10 to 5.3.12 in /webapp [`#2996`](https://github.com/Human-Connection/Human-Connection/pull/2996)
+- build(deps): bump metascraper-author from 5.10.6 to 5.10.7 in /backend [`#2994`](https://github.com/Human-Connection/Human-Connection/pull/2994)
+- build(deps): bump metascraper-title from 5.10.6 to 5.10.7 in /backend [`#2978`](https://github.com/Human-Connection/Human-Connection/pull/2978)
+- build(deps-dev): bump @storybook/vue from 5.3.10 to 5.3.12 in /webapp [`#2995`](https://github.com/Human-Connection/Human-Connection/pull/2995)
+- build(deps): bump metascraper-audio from 5.10.6 to 5.10.7 in /backend [`#2993`](https://github.com/Human-Connection/Human-Connection/pull/2993)
+- build(deps): bump graphql-tag from 2.10.1 to 2.10.2 in /backend [`#2992`](https://github.com/Human-Connection/Human-Connection/pull/2992)
+- build(deps): bump metascraper-url from 5.10.6 to 5.10.7 in /backend [`#2991`](https://github.com/Human-Connection/Human-Connection/pull/2991)
+- build(deps): bump @sentry/node from 5.12.0 to 5.12.3 in /backend [`#2990`](https://github.com/Human-Connection/Human-Connection/pull/2990)
+- build(deps-dev): bump @storybook/addon-notes from 5.3.9 to 5.3.10 in /webapp [`#2951`](https://github.com/Human-Connection/Human-Connection/pull/2951)
+- build(deps): bump metascraper from 5.10.6 to 5.11.0 in /backend [`#2976`](https://github.com/Human-Connection/Human-Connection/pull/2976)
+- build(deps): bump metascraper-logo from 5.10.6 to 5.10.7 in /backend [`#2975`](https://github.com/Human-Connection/Human-Connection/pull/2975)
+- chore: Add issue template for Refactoring tickets [`#2983`](https://github.com/Human-Connection/Human-Connection/pull/2983)
+- build(deps): bump @nuxtjs/sentry from 3.1.0 to 3.2.2 in /webapp [`#2974`](https://github.com/Human-Connection/Human-Connection/pull/2974)
+- build(deps): bump metascraper-video from 5.10.6 to 5.10.7 in /backend [`#2952`](https://github.com/Human-Connection/Human-Connection/pull/2952)
+- build(deps): bump metascraper-lang from 5.10.6 to 5.10.7 in /backend [`#2950`](https://github.com/Human-Connection/Human-Connection/pull/2950)
+- build(deps): bump metascraper-description from 5.10.6 to 5.11.0 in /backend [`#2948`](https://github.com/Human-Connection/Human-Connection/pull/2948)
+- build(deps): bump @sentry/node from 5.11.2 to 5.12.0 in /backend [`#2977`](https://github.com/Human-Connection/Human-Connection/pull/2977)
+- build(deps): bump @nuxtjs/pwa from 3.0.0-beta.19 to 3.0.0-beta.20 in /webapp [`#2959`](https://github.com/Human-Connection/Human-Connection/pull/2959)
+- build(deps-dev): bump @storybook/addon-a11y from 5.3.9 to 5.3.10 in /webapp [`#2956`](https://github.com/Human-Connection/Human-Connection/pull/2956)
+- build(deps-dev): bump eslint-plugin-import from 2.20.0 to 2.20.1 in /webapp [`#2949`](https://github.com/Human-Connection/Human-Connection/pull/2949)
+- build(deps): bump metascraper-soundcloud from 5.10.6 to 5.10.7 in /backend [`#2945`](https://github.com/Human-Connection/Human-Connection/pull/2945)
+- build(deps): bump metascraper-date from 5.10.6 to 5.10.7 in /backend [`#2944`](https://github.com/Human-Connection/Human-Connection/pull/2944)
+- build(deps-dev): bump codecov from 3.6.2 to 3.6.4 [`#2943`](https://github.com/Human-Connection/Human-Connection/pull/2943)
+- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2953`](https://github.com/Human-Connection/Human-Connection/pull/2953)
+- build(deps): bump metascraper-publisher in /backend [`#2954`](https://github.com/Human-Connection/Human-Connection/pull/2954)
+- build(deps-dev): bump eslint-plugin-import in /backend [`#2955`](https://github.com/Human-Connection/Human-Connection/pull/2955)
+- build(deps): bump metascraper-youtube from 5.10.6 to 5.10.7 in /backend [`#2957`](https://github.com/Human-Connection/Human-Connection/pull/2957)
+- build(deps): bump metascraper-image from 5.10.6 to 5.10.7 in /backend [`#2960`](https://github.com/Human-Connection/Human-Connection/pull/2960)
+- build(deps-dev): bump @storybook/vue from 5.3.9 to 5.3.10 in /webapp [`#2961`](https://github.com/Human-Connection/Human-Connection/pull/2961)
+- build(deps): bump @nuxtjs/axios from 5.9.4 to 5.9.5 in /webapp [`#2962`](https://github.com/Human-Connection/Human-Connection/pull/2962)
+- fix: Update mute/unmute icon to unused icon [`#2973`](https://github.com/Human-Connection/Human-Connection/pull/2973)
+- fix: Remove github release script breaking build [`#2971`](https://github.com/Human-Connection/Human-Connection/pull/2971)
+- Use original createdAt for merged users/emails [`#2969`](https://github.com/Human-Connection/Human-Connection/pull/2969)
+- Fix typo [`#2966`](https://github.com/Human-Connection/Human-Connection/pull/2966)
+- chore: Update to v0.3.0 [`#2941`](https://github.com/Human-Connection/Human-Connection/pull/2941)
+- Replace buildList with array of Promises [`46edc3f`](https://github.com/Human-Connection/Human-Connection/commit/46edc3fdd5b83c2f00506f595b1254d7597767e0)
+- build(deps-dev): bump @storybook/addon-notes in /webapp [`75137ce`](https://github.com/Human-Connection/Human-Connection/commit/75137ce716dadcc6f0ceeed6a2b0fe5c50fa7b8f)
+- Update to v0.3.0 [`dbe2c4c`](https://github.com/Human-Connection/Human-Connection/commit/dbe2c4cdd5bab2195c6369b84989507b9f7da768)
+
#### [v0.3.0](https://github.com/Human-Connection/Human-Connection/compare/v0.2.1...v0.3.0)
> 31 January 2020
+- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /webapp [`#2939`](https://github.com/Human-Connection/Human-Connection/pull/2939)
- feat: 🍰 Direct Reply On Comment [`#2608`](https://github.com/Human-Connection/Human-Connection/pull/2608)
- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /backend [`#2938`](https://github.com/Human-Connection/Human-Connection/pull/2938)
- fix: deploy script with new naming convention [`#2930`](https://github.com/Human-Connection/Human-Connection/pull/2930)
@@ -181,9 +238,9 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
- refactor(modules): Various import fixes [`#2773`](https://github.com/Human-Connection/Human-Connection/issues/2773) [`#2774`](https://github.com/Human-Connection/Human-Connection/issues/2774)
- feat(webapp): Display deployed version in footer [`#1831`](https://github.com/Human-Connection/Human-Connection/issues/1831)
- fix #2229 [`#2229`](https://github.com/Human-Connection/Human-Connection/issues/2229)
-- refactor: Make `db:setup` init stage of `migrate` [`b063847`](https://github.com/Human-Connection/Human-Connection/commit/b063847849a84db885337dc8e84e75ddaf87011f)
-- Improve styling per @alina-beck review [`bcc1ab1`](https://github.com/Human-Connection/Human-Connection/commit/bcc1ab167e8b1dfdac1ec0a05a0c14e8234bcabc)
-- test(cypress): Cover "Pinned post" feature [`d49afc2`](https://github.com/Human-Connection/Human-Connection/commit/d49afc25cfa1c1f98ed04f78dd3ff826cd85ae25)
+- Get rid of different factory files [`fc36729`](https://github.com/Human-Connection/Human-Connection/commit/fc367297e3e054f09b7f8f31788ab68d87f6babf)
+- Refactor factory for comments [`2fc71d7`](https://github.com/Human-Connection/Human-Connection/commit/2fc71d75a5d5eab9c3467e94e00257ef6dd7d8a0)
+- Refactor user factory [`2a79c53`](https://github.com/Human-Connection/Human-Connection/commit/2a79c53765b73f9b91691eb75f55cf8c9e48306e)
#### [v0.2.1](https://github.com/Human-Connection/Human-Connection/compare/v0.2.0...v0.2.1)
diff --git a/backend/package.json b/backend/package.json
index 63d895802..1822a52ca 100644
--- a/backend/package.json
+++ b/backend/package.json
@@ -1,6 +1,6 @@
{
"name": "human-connection-backend",
- "version": "0.2.2",
+ "version": "0.3.1",
"description": "GraphQL Backend for Human Connection",
"main": "src/index.js",
"scripts": {
@@ -38,12 +38,12 @@
},
"dependencies": {
"@hapi/joi": "^17.1.0",
- "@sentry/node": "^5.11.2",
+ "@sentry/node": "^5.12.3",
"apollo-cache-inmemory": "~1.6.5",
"apollo-client": "~2.6.8",
"apollo-link-context": "~1.0.19",
"apollo-link-http": "~1.5.16",
- "apollo-server": "~2.9.16",
+ "apollo-server": "~2.10.0",
"apollo-server-express": "^2.9.16",
"babel-plugin-transform-runtime": "^6.23.0",
"bcryptjs": "~2.4.3",
@@ -60,29 +60,31 @@
"graphql-iso-date": "~3.6.1",
"graphql-middleware": "~4.0.2",
"graphql-middleware-sentry": "^3.2.1",
- "graphql-shield": "~7.0.9",
- "graphql-tag": "~2.10.1",
+ "graphql-redis-subscriptions": "^2.1.2",
+ "graphql-shield": "~7.0.11",
+ "graphql-tag": "~2.10.3",
"helmet": "~3.21.2",
+ "ioredis": "^4.14.1",
"jsonwebtoken": "~8.5.1",
"linkifyjs": "~2.1.8",
"lodash": "~4.17.14",
"merge-graphql-schemas": "^1.7.6",
- "metascraper": "^5.10.6",
- "metascraper-audio": "^5.10.6",
- "metascraper-author": "^5.10.6",
+ "metascraper": "^5.11.0",
+ "metascraper-audio": "^5.10.7",
+ "metascraper-author": "^5.10.7",
"metascraper-clearbit-logo": "^5.3.0",
- "metascraper-date": "^5.10.6",
- "metascraper-description": "^5.10.6",
- "metascraper-image": "^5.10.6",
- "metascraper-lang": "^5.10.6",
+ "metascraper-date": "^5.10.7",
+ "metascraper-description": "^5.11.0",
+ "metascraper-image": "^5.11.1",
+ "metascraper-lang": "^5.10.7",
"metascraper-lang-detector": "^4.10.2",
- "metascraper-logo": "^5.10.6",
- "metascraper-publisher": "^5.10.6",
- "metascraper-soundcloud": "^5.10.6",
- "metascraper-title": "^5.10.6",
- "metascraper-url": "^5.10.6",
- "metascraper-video": "^5.10.6",
- "metascraper-youtube": "^5.10.6",
+ "metascraper-logo": "^5.10.7",
+ "metascraper-publisher": "^5.10.7",
+ "metascraper-soundcloud": "^5.10.7",
+ "metascraper-title": "^5.10.7",
+ "metascraper-url": "^5.10.7",
+ "metascraper-video": "^5.10.7",
+ "metascraper-youtube": "^5.10.7",
"migrate": "^1.6.2",
"minimatch": "^3.0.4",
"mustache": "^4.0.0",
@@ -93,9 +95,10 @@
"nodemailer": "^6.4.2",
"nodemailer-html-to-text": "^3.1.0",
"npm-run-all": "~4.1.5",
- "request": "~2.88.0",
+ "request": "~2.88.2",
"sanitize-html": "~1.21.1",
"slug": "~2.1.1",
+ "subscriptions-transport-ws": "^0.9.16",
"trunc-html": "~1.1.2",
"uuid": "~3.4.0",
"validator": "^12.2.0",
@@ -109,7 +112,7 @@
"@babel/plugin-proposal-throw-expressions": "^7.8.3",
"@babel/preset-env": "~7.8.4",
"@babel/register": "^7.8.3",
- "apollo-server-testing": "~2.9.16",
+ "apollo-server-testing": "~2.10.0",
"babel-core": "~7.0.0-0",
"babel-eslint": "~10.0.3",
"babel-jest": "~25.1.0",
@@ -118,8 +121,8 @@
"eslint": "~6.8.0",
"eslint-config-prettier": "~6.10.0",
"eslint-config-standard": "~14.1.0",
- "eslint-plugin-import": "~2.20.0",
- "eslint-plugin-jest": "~23.6.0",
+ "eslint-plugin-import": "~2.20.1",
+ "eslint-plugin-jest": "~23.7.0",
"eslint-plugin-node": "~11.0.0",
"eslint-plugin-prettier": "~3.1.2",
"eslint-plugin-promise": "~4.2.1",
@@ -127,6 +130,10 @@
"jest": "~25.1.0",
"nodemon": "~2.0.2",
"prettier": "~1.19.1",
+ "rosie": "^2.0.1",
"supertest": "~4.0.2"
+ },
+ "resolutions": {
+ "fs-capacitor": "6.0.0"
}
}
diff --git a/backend/src/activitypub/routes/webfinger.spec.js b/backend/src/activitypub/routes/webfinger.spec.js
index 06ca4577d..3cd9613e7 100644
--- a/backend/src/activitypub/routes/webfinger.spec.js
+++ b/backend/src/activitypub/routes/webfinger.spec.js
@@ -1,10 +1,9 @@
import { handler } from './webfinger'
-import Factory from '../../factories'
+import Factory, { cleanDatabase } from '../../db/factories'
import { getDriver } from '../../db/neo4j'
let resource, res, json, status, contentType
-const factory = Factory()
const driver = getDriver()
const request = () => {
@@ -28,7 +27,7 @@ const request = () => {
}
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('webfinger', () => {
@@ -90,7 +89,7 @@ describe('webfinger', () => {
describe('given a user for acct', () => {
beforeEach(async () => {
- await factory.create('User', { slug: 'some-user' })
+ await Factory.build('user', { slug: 'some-user' })
})
it('returns user object', async () => {
diff --git a/backend/src/config/index.js b/backend/src/config/index.js
index 2f8d0ed22..398bc6ff2 100644
--- a/backend/src/config/index.js
+++ b/backend/src/config/index.js
@@ -4,6 +4,9 @@ if (require.resolve) {
dotenv.config({ path: require.resolve('../../.env') })
}
+// eslint-disable-next-line no-undef
+const env = typeof Cypress !== 'undefined' ? Cypress.env() : process.env
+
const {
MAPBOX_TOKEN,
JWT_SECRET,
@@ -20,7 +23,10 @@ const {
NEO4J_PASSWORD = 'neo4j',
CLIENT_URI = 'http://localhost:3000',
GRAPHQL_URI = 'http://localhost:4000',
-} = process.env
+ REDIS_DOMAIN,
+ REDIS_PORT,
+ REDIS_PASSWORD,
+} = env
export const requiredConfigs = {
MAPBOX_TOKEN,
@@ -58,7 +64,7 @@ export const developmentConfigs = {
}
export const sentryConfigs = { SENTRY_DSN_BACKEND, COMMIT }
-
+export const redisConfiig = { REDIS_DOMAIN, REDIS_PORT, REDIS_PASSWORD }
export default {
...requiredConfigs,
...smtpConfigs,
@@ -66,4 +72,5 @@ export default {
...serverConfigs,
...developmentConfigs,
...sentryConfigs,
+ ...redisConfiig,
}
diff --git a/backend/src/db/clean.js b/backend/src/db/clean.js
index cbb1412e2..e658317e2 100644
--- a/backend/src/db/clean.js
+++ b/backend/src/db/clean.js
@@ -1,4 +1,4 @@
-import { cleanDatabase } from '../factories'
+import { cleanDatabase } from '../db/factories'
if (process.env.NODE_ENV === 'production') {
throw new Error(`You cannot clean the database in production environment!`)
diff --git a/backend/src/db/factories.js b/backend/src/db/factories.js
new file mode 100644
index 000000000..754f84dec
--- /dev/null
+++ b/backend/src/db/factories.js
@@ -0,0 +1,229 @@
+import uuid from 'uuid/v4'
+import faker from 'faker'
+import slugify from 'slug'
+import { hashSync } from 'bcryptjs'
+import { Factory } from 'rosie'
+import { getDriver, getNeode } from './neo4j'
+
+const neode = getNeode()
+
+export const cleanDatabase = async (options = {}) => {
+ const { driver = getDriver() } = options
+ const session = driver.session()
+ try {
+ await session.writeTransaction(transaction => {
+ return transaction.run(
+ `
+ MATCH (everything)
+ DETACH DELETE everything
+ `,
+ )
+ })
+ } finally {
+ session.close()
+ }
+}
+
+Factory.define('category')
+ .attr('id', uuid)
+ .attr('icon', 'globe')
+ .attr('name', 'Global Peace & Nonviolence')
+ .after((buildObject, options) => {
+ return neode.create('Category', buildObject)
+ })
+
+Factory.define('badge')
+ .attr('type', 'crowdfunding')
+ .attr('status', 'permanent')
+ .after((buildObject, options) => {
+ return neode.create('Badge', buildObject)
+ })
+
+Factory.define('userWithoutEmailAddress')
+ .option('password', '1234')
+ .attrs({
+ id: uuid,
+ name: faker.name.findName,
+ password: '1234',
+ role: 'user',
+ avatar: faker.internet.avatar,
+ about: faker.lorem.paragraph,
+ termsAndConditionsAgreedVersion: '0.0.1',
+ termsAndConditionsAgreedAt: '2019-08-01T10:47:19.212Z',
+ allowEmbedIframes: false,
+ showShoutsPublicly: false,
+ locale: 'en',
+ })
+ .attr('slug', ['slug', 'name'], (slug, name) => {
+ return slug || slugify(name, { lower: true })
+ })
+ .attr('encryptedPassword', ['password'], password => {
+ return hashSync(password, 10)
+ })
+ .after(async (buildObject, options) => {
+ return neode.create('User', buildObject)
+ })
+
+Factory.define('user')
+ .extend('userWithoutEmailAddress')
+ .option('email', faker.internet.exampleEmail)
+ .after(async (buildObject, options) => {
+ const [user, email] = await Promise.all([
+ buildObject,
+ neode.create('EmailAddress', { email: options.email }),
+ ])
+ await Promise.all([user.relateTo(email, 'primaryEmail'), email.relateTo(user, 'belongsTo')])
+ return user
+ })
+
+Factory.define('post')
+ .option('categoryIds', [])
+ .option('categories', ['categoryIds'], categoryIds => {
+ if (categoryIds.length) return Promise.all(categoryIds.map(id => neode.find('Category', id)))
+ // there must be at least one category
+ return Promise.all([Factory.build('category')])
+ })
+ .option('tagIds', [])
+ .option('tags', ['tagIds'], tagIds => {
+ return Promise.all(tagIds.map(id => neode.find('Tag', id)))
+ })
+ .option('authorId', null)
+ .option('author', ['authorId'], authorId => {
+ if (authorId) return neode.find('User', authorId)
+ return Factory.build('user')
+ })
+ .option('pinnedBy', null)
+ .attrs({
+ id: uuid,
+ title: faker.lorem.sentence,
+ content: faker.lorem.paragraphs,
+ image: faker.image.unsplash.imageUrl,
+ visibility: 'public',
+ deleted: false,
+ imageBlurred: false,
+ imageAspectRatio: 1.333,
+ })
+ .attr('pinned', ['pinned'], pinned => {
+ // Convert false to null
+ return pinned || null
+ })
+ .attr('contentExcerpt', ['contentExcerpt', 'content'], (contentExcerpt, content) => {
+ return contentExcerpt || content
+ })
+ .attr('slug', ['slug', 'title'], (slug, title) => {
+ return slug || slugify(title, { lower: true })
+ })
+ .attr('language', ['language'], language => {
+ return language || 'en'
+ })
+ .after(async (buildObject, options) => {
+ const [post, author, categories, tags] = await Promise.all([
+ neode.create('Post', buildObject),
+ options.author,
+ options.categories,
+ options.tags,
+ ])
+ await Promise.all([
+ post.relateTo(author, 'author'),
+ Promise.all(categories.map(c => c.relateTo(post, 'post'))),
+ Promise.all(tags.map(t => t.relateTo(post, 'post'))),
+ ])
+ if (buildObject.pinned) {
+ const pinnedBy = await (options.pinnedBy || Factory.build('user', { role: 'admin' }))
+ await pinnedBy.relateTo(post, 'pinned')
+ }
+ return post
+ })
+
+Factory.define('comment')
+ .option('postId', null)
+ .option('post', ['postId'], postId => {
+ if (postId) return neode.find('Post', postId)
+ return Factory.build('post')
+ })
+ .option('authorId', null)
+ .option('author', ['authorId'], authorId => {
+ if (authorId) return neode.find('User', authorId)
+ return Factory.build('user')
+ })
+ .attrs({
+ id: uuid,
+ content: faker.lorem.sentence,
+ })
+ .attr('contentExcerpt', ['contentExcerpt', 'content'], (contentExcerpt, content) => {
+ return contentExcerpt || content
+ })
+ .after(async (buildObject, options) => {
+ const [comment, author, post] = await Promise.all([
+ neode.create('Comment', buildObject),
+ options.author,
+ options.post,
+ ])
+ await Promise.all([comment.relateTo(author, 'author'), comment.relateTo(post, 'post')])
+ return comment
+ })
+
+Factory.define('donations')
+ .attr('id', uuid)
+ .attr('goal', 15000)
+ .attr('progress', 0)
+ .after((buildObject, options) => {
+ return neode.create('Donations', buildObject)
+ })
+
+const emailDefaults = {
+ email: faker.internet.email,
+ verifiedAt: () => new Date().toISOString(),
+}
+
+Factory.define('emailAddress')
+ .attr(emailDefaults)
+ .after((buildObject, options) => {
+ return neode.create('EmailAddress', buildObject)
+ })
+
+Factory.define('unverifiedEmailAddress')
+ .attr(emailDefaults)
+ .after((buildObject, options) => {
+ return neode.create('UnverifiedEmailAddress', buildObject)
+ })
+
+Factory.define('location')
+ .attrs({
+ name: 'Germany',
+ namePT: 'Alemanha',
+ nameDE: 'Deutschland',
+ nameES: 'Alemania',
+ nameNL: 'Duitsland',
+ namePL: 'Niemcy',
+ nameFR: 'Allemagne',
+ nameIT: 'Germania',
+ nameEN: 'Germany',
+ id: 'country.10743216036480410',
+ type: 'country',
+ })
+ .after((buildObject, options) => {
+ return neode.create('Location', buildObject)
+ })
+
+Factory.define('report').after((buildObject, options) => {
+ return neode.create('Report', buildObject)
+})
+
+Factory.define('tag')
+ .attrs({
+ name: '#human-connection',
+ })
+ .after((buildObject, options) => {
+ return neode.create('Tag', buildObject)
+ })
+
+Factory.define('socialMedia')
+ .attrs({
+ url: 'https://mastodon.social/@Gargron',
+ })
+ .after((buildObject, options) => {
+ return neode.create('SocialMedia', buildObject)
+ })
+
+export default Factory
diff --git a/backend/src/db/migrate/template.js b/backend/src/db/migrate/template.js
index 1d63673b4..9adb0786d 100644
--- a/backend/src/db/migrate/template.js
+++ b/backend/src/db/migrate/template.js
@@ -18,6 +18,7 @@ export async function up(next) {
await transaction.rollback()
// eslint-disable-next-line no-console
console.log('rolled back')
+ throw new Error(error)
} finally {
session.close()
}
diff --git a/backend/src/db/migrations/20200123150105-merge_duplicate_user_accounts.js b/backend/src/db/migrations/20200123150105-merge_duplicate_user_accounts.js
index ec38befc5..377f971e9 100644
--- a/backend/src/db/migrations/20200123150105-merge_duplicate_user_accounts.js
+++ b/backend/src/db/migrations/20200123150105-merge_duplicate_user_accounts.js
@@ -34,12 +34,11 @@ export function up(next) {
return txc
.run(
`
- MATCH (oldUser:User)-[:PRIMARY_EMAIL]->(oldEmail:EmailAddress {email: $email}), (oldUser)-[previousRelationship]-(oldEmail)
+ MATCH (oldUser:User)-[:PRIMARY_EMAIL]->(oldEmail:EmailAddress {email: $email})
MATCH (user:User)-[:PRIMARY_EMAIL]->(email:EmailAddress {email: $normalizedEmail})
- DELETE previousRelationship
WITH oldUser, oldEmail, user, email
- CALL apoc.refactor.mergeNodes([user, oldUser], { properties: 'discard', mergeRels: true }) YIELD node as mergedUser
- CALL apoc.refactor.mergeNodes([email, oldEmail], { properties: 'discard', mergeRels: true }) YIELD node as mergedEmail
+ CALL apoc.refactor.mergeNodes([user, oldUser], { properties: { createdAt: 'overwrite', \`.*\`: 'discard' }, mergeRels: true }) YIELD node as mergedUser
+ CALL apoc.refactor.mergeNodes([email, oldEmail], { properties: { createdAt: 'overwrite', verifiedAt: 'overwrite', \`.*\`: 'discard' }, mergeRels: true }) YIELD node as mergedEmail
RETURN user {.*}, email {.*}
`,
{ email, normalizedEmail },
diff --git a/backend/src/db/migrations/20200206190233-swap_latitude_with_longitude.js b/backend/src/db/migrations/20200206190233-swap_latitude_with_longitude.js
new file mode 100644
index 000000000..619e30320
--- /dev/null
+++ b/backend/src/db/migrations/20200206190233-swap_latitude_with_longitude.js
@@ -0,0 +1,42 @@
+import { getDriver } from '../../db/neo4j'
+
+export const description = `
+This migration swaps the value stored in Location.lat with the value
+of Location.lng. This is necessary as the values of lat and lng were
+stored incorrectly. For example Hamburg, Germany, was stored with the
+values lat=10.0 and lng=53.55, which is close to the horn of Africa,
+but it is lat=53.55 and lng=10.0
+`
+
+const swap = async function(next) {
+ const driver = getDriver()
+ const session = driver.session()
+ const transaction = session.beginTransaction()
+ try {
+ // Implement your migration here.
+ await transaction.run(`
+ MATCH (l:Location) WHERE NOT(l.lat IS NULL)
+ WITH l.lng AS longitude, l.lat AS latitude, l AS location
+ SET location.lat = longitude, location.lng = latitude
+ `)
+ await transaction.commit()
+ next()
+ } catch (error) {
+ // eslint-disable-next-line no-console
+ console.log(error)
+ await transaction.rollback()
+ // eslint-disable-next-line no-console
+ console.log('rolled back')
+ throw new Error(error)
+ } finally {
+ session.close()
+ }
+}
+
+export async function up(next) {
+ swap(next)
+}
+
+export async function down(next) {
+ swap(next)
+}
diff --git a/backend/src/db/seed.js b/backend/src/db/seed.js
index ba7ace90b..d1e430629 100644
--- a/backend/src/db/seed.js
+++ b/backend/src/db/seed.js
@@ -2,7 +2,7 @@ import faker from 'faker'
import sample from 'lodash/sample'
import { createTestClient } from 'apollo-server-testing'
import createServer from '../server'
-import Factory from '../factories'
+import Factory from '../db/factories'
import { getNeode, getDriver } from '../db/neo4j'
import { gql } from '../helpers/jest'
@@ -12,7 +12,6 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
;(async function() {
let authenticatedUser = null
const driver = getDriver()
- const factory = Factory()
const neode = getNeode()
try {
@@ -28,12 +27,12 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
const { mutate } = createTestClient(server)
const [Hamburg, Berlin, Germany, Paris, France] = await Promise.all([
- factory.create('Location', {
+ Factory.build('location', {
id: 'region.5127278006398860',
name: 'Hamburg',
type: 'region',
- lat: 10.0,
- lng: 53.55,
+ lng: 10.0,
+ lat: 53.55,
nameES: 'Hamburgo',
nameFR: 'Hambourg',
nameIT: 'Amburgo',
@@ -44,12 +43,12 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
namePL: 'Hamburg',
nameRU: 'Гамбург',
}),
- factory.create('Location', {
+ Factory.build('location', {
id: 'region.14880313158564380',
type: 'region',
name: 'Berlin',
- lat: 13.38333,
- lng: 52.51667,
+ lng: 13.38333,
+ lat: 52.51667,
nameES: 'Berlín',
nameFR: 'Berlin',
nameIT: 'Berlino',
@@ -60,7 +59,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
namePL: 'Berlin',
nameRU: 'Берлин',
}),
- factory.create('Location', {
+ Factory.build('location', {
id: 'country.10743216036480410',
name: 'Germany',
type: 'country',
@@ -74,12 +73,12 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
nameEN: 'Germany',
nameRU: 'Германия',
}),
- factory.create('Location', {
+ Factory.build('location', {
id: 'region.9397217726497330',
name: 'Paris',
type: 'region',
- lat: 2.35183,
- lng: 48.85658,
+ lng: 2.35183,
+ lat: 48.85658,
nameES: 'París',
nameFR: 'Paris',
nameIT: 'Parigi',
@@ -90,7 +89,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
namePL: 'Paryż',
nameRU: 'Париж',
}),
- factory.create('Location', {
+ Factory.build('location', {
id: 'country.9759535382641660',
name: 'France',
type: 'country',
@@ -112,27 +111,27 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
])
const [racoon, rabbit, wolf, bear, turtle, rhino] = await Promise.all([
- factory.create('Badge', {
+ Factory.build('badge', {
id: 'indiegogo_en_racoon',
icon: '/img/badges/indiegogo_en_racoon.svg',
}),
- factory.create('Badge', {
+ Factory.build('badge', {
id: 'indiegogo_en_rabbit',
icon: '/img/badges/indiegogo_en_rabbit.svg',
}),
- factory.create('Badge', {
+ Factory.build('badge', {
id: 'indiegogo_en_wolf',
icon: '/img/badges/indiegogo_en_wolf.svg',
}),
- factory.create('Badge', {
+ Factory.build('badge', {
id: 'indiegogo_en_bear',
icon: '/img/badges/indiegogo_en_bear.svg',
}),
- factory.create('Badge', {
+ Factory.build('badge', {
id: 'indiegogo_en_turtle',
icon: '/img/badges/indiegogo_en_turtle.svg',
}),
- factory.create('Badge', {
+ Factory.build('badge', {
id: 'indiegogo_en_rhino',
icon: '/img/badges/indiegogo_en_rhino.svg',
}),
@@ -147,55 +146,90 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
louie,
dagobert,
] = await Promise.all([
- factory.create('User', {
- id: 'u1',
- name: 'Peter Lustig',
- slug: 'peter-lustig',
- role: 'admin',
- email: 'admin@example.org',
- }),
- factory.create('User', {
- id: 'u2',
- name: 'Bob der Baumeister',
- slug: 'bob-der-baumeister',
- role: 'moderator',
- email: 'moderator@example.org',
- }),
- factory.create('User', {
- id: 'u3',
- name: 'Jenny Rostock',
- slug: 'jenny-rostock',
- role: 'user',
- email: 'user@example.org',
- }),
- factory.create('User', {
- id: 'u4',
- name: 'Huey',
- slug: 'huey',
- role: 'user',
- email: 'huey@example.org',
- }),
- factory.create('User', {
- id: 'u5',
- name: 'Dewey',
- slug: 'dewey',
- role: 'user',
- email: 'dewey@example.org',
- }),
- factory.create('User', {
- id: 'u6',
- name: 'Louie',
- slug: 'louie',
- role: 'user',
- email: 'louie@example.org',
- }),
- factory.create('User', {
- id: 'u7',
- name: 'Dagobert',
- slug: 'dagobert',
- role: 'user',
- email: 'dagobert@example.org',
- }),
+ Factory.build(
+ 'user',
+ {
+ id: 'u1',
+ name: 'Peter Lustig',
+ slug: 'peter-lustig',
+ role: 'admin',
+ },
+ {
+ email: 'admin@example.org',
+ },
+ ),
+ Factory.build(
+ 'user',
+ {
+ id: 'u2',
+ name: 'Bob der Baumeister',
+ slug: 'bob-der-baumeister',
+ role: 'moderator',
+ },
+ {
+ email: 'moderator@example.org',
+ },
+ ),
+ Factory.build(
+ 'user',
+ {
+ id: 'u3',
+ name: 'Jenny Rostock',
+ slug: 'jenny-rostock',
+ role: 'user',
+ },
+ {
+ email: 'user@example.org',
+ },
+ ),
+ Factory.build(
+ 'user',
+ {
+ id: 'u4',
+ name: 'Huey',
+ slug: 'huey',
+ role: 'user',
+ },
+ {
+ email: 'huey@example.org',
+ },
+ ),
+ Factory.build(
+ 'user',
+ {
+ id: 'u5',
+ name: 'Dewey',
+ slug: 'dewey',
+ role: 'user',
+ },
+ {
+ email: 'dewey@example.org',
+ },
+ ),
+ Factory.build(
+ 'user',
+ {
+ id: 'u6',
+ name: 'Louie',
+ slug: 'louie',
+ role: 'user',
+ },
+ {
+ email: 'louie@example.org',
+ },
+ ),
+ Factory.build(
+ 'user',
+ {
+ id: 'u7',
+ name: 'Dagobert',
+ slug: 'dagobert',
+ role: 'user',
+ },
+ {
+ email: 'dagobert@example.org',
+ },
+ ),
])
await Promise.all([
@@ -236,97 +270,97 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
])
await Promise.all([
- factory.create('Category', {
+ Factory.build('category', {
id: 'cat1',
name: 'Just For Fun',
slug: 'just-for-fun',
icon: 'smile',
}),
- factory.create('Category', {
+ Factory.build('category', {
id: 'cat2',
name: 'Happiness & Values',
slug: 'happiness-values',
icon: 'heart-o',
}),
- factory.create('Category', {
+ Factory.build('category', {
id: 'cat3',
name: 'Health & Wellbeing',
slug: 'health-wellbeing',
icon: 'medkit',
}),
- factory.create('Category', {
+ Factory.build('category', {
id: 'cat4',
name: 'Environment & Nature',
slug: 'environment-nature',
icon: 'tree',
}),
- factory.create('Category', {
+ Factory.build('category', {
id: 'cat5',
name: 'Animal Protection',
slug: 'animal-protection',
icon: 'paw',
}),
- factory.create('Category', {
+ Factory.build('category', {
id: 'cat6',
name: 'Human Rights & Justice',
slug: 'human-rights-justice',
icon: 'balance-scale',
}),
- factory.create('Category', {
+ Factory.build('category', {
id: 'cat7',
name: 'Education & Sciences',
slug: 'education-sciences',
icon: 'graduation-cap',
}),
- factory.create('Category', {
+ Factory.build('category', {
id: 'cat8',
name: 'Cooperation & Development',
slug: 'cooperation-development',
icon: 'users',
}),
- factory.create('Category', {
+ Factory.build('category', {
id: 'cat9',
name: 'Democracy & Politics',
slug: 'democracy-politics',
icon: 'university',
}),
- factory.create('Category', {
+ Factory.build('category', {
id: 'cat10',
name: 'Economy & Finances',
slug: 'economy-finances',
icon: 'money',
}),
- factory.create('Category', {
+ Factory.build('category', {
id: 'cat11',
name: 'Energy & Technology',
slug: 'energy-technology',
icon: 'flash',
}),
- factory.create('Category', {
+ Factory.build('category', {
id: 'cat12',
name: 'IT, Internet & Data Privacy',
slug: 'it-internet-data-privacy',
icon: 'mouse-pointer',
}),
- factory.create('Category', {
+ Factory.build('category', {
id: 'cat13',
name: 'Art, Culture & Sport',
slug: 'art-culture-sport',
icon: 'paint-brush',
}),
- factory.create('Category', {
+ Factory.build('category', {
id: 'cat14',
name: 'Freedom of Speech',
slug: 'freedom-of-speech',
icon: 'bullhorn',
}),
- factory.create('Category', {
+ Factory.build('category', {
id: 'cat15',
name: 'Consumption & Sustainability',
slug: 'consumption-sustainability',
icon: 'shopping-cart',
}),
- factory.create('Category', {
+ Factory.build('category', {
id: 'cat16',
name: 'Global Peace & Nonviolence',
slug: 'global-peace-nonviolence',
@@ -335,104 +369,164 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
])
const [environment, nature, democracy, freedom] = await Promise.all([
- factory.create('Tag', {
+ Factory.build('tag', {
id: 'Environment',
}),
- factory.create('Tag', {
+ Factory.build('tag', {
id: 'Nature',
}),
- factory.create('Tag', {
+ Factory.build('tag', {
id: 'Democracy',
}),
- factory.create('Tag', {
+ Factory.build('tag', {
id: 'Freedom',
}),
])
const [p0, p1, p3, p4, p5, p6, p9, p10, p11, p13, p14, p15] = await Promise.all([
- factory.create('Post', {
- author: peterLustig,
- id: 'p0',
- language: sample(languages),
- image: faker.image.unsplash.food(300, 169),
- categoryIds: ['cat16'],
- imageBlurred: true,
- imageAspectRatio: 300 / 169,
- }),
- factory.create('Post', {
- author: bobDerBaumeister,
- id: 'p1',
- language: sample(languages),
- image: faker.image.unsplash.technology(300, 1500),
- categoryIds: ['cat1'],
- imageAspectRatio: 300 / 1500,
- }),
- factory.create('Post', {
- author: huey,
- id: 'p3',
- language: sample(languages),
- categoryIds: ['cat3'],
- }),
- factory.create('Post', {
- author: dewey,
- id: 'p4',
- language: sample(languages),
- categoryIds: ['cat4'],
- }),
- factory.create('Post', {
- author: louie,
- id: 'p5',
- language: sample(languages),
- categoryIds: ['cat5'],
- }),
- factory.create('Post', {
- authorId: 'u1',
- id: 'p6',
- language: sample(languages),
- image: faker.image.unsplash.buildings(300, 857),
- categoryIds: ['cat6'],
- imageAspectRatio: 300 / 857,
- }),
- factory.create('Post', {
- author: huey,
- id: 'p9',
- language: sample(languages),
- categoryIds: ['cat9'],
- }),
- factory.create('Post', {
- author: dewey,
- id: 'p10',
- categoryIds: ['cat10'],
- imageBlurred: true,
- }),
- factory.create('Post', {
- author: louie,
- id: 'p11',
- language: sample(languages),
- image: faker.image.unsplash.people(300, 901),
- categoryIds: ['cat11'],
- imageAspectRatio: 300 / 901,
- }),
- factory.create('Post', {
- author: bobDerBaumeister,
- id: 'p13',
- language: sample(languages),
- categoryIds: ['cat13'],
- }),
- factory.create('Post', {
- author: jennyRostock,
- id: 'p14',
- language: sample(languages),
- image: faker.image.unsplash.objects(300, 200),
- categoryIds: ['cat14'],
- imageAspectRatio: 300 / 450,
- }),
- factory.create('Post', {
- author: huey,
- id: 'p15',
- language: sample(languages),
- categoryIds: ['cat15'],
- }),
+ Factory.build(
+ 'post',
+ {
+ id: 'p0',
+ language: sample(languages),
+ image: faker.image.unsplash.food(300, 169),
+ imageBlurred: true,
+ imageAspectRatio: 300 / 169,
+ },
+ {
+ categoryIds: ['cat16'],
+ author: peterLustig,
+ },
+ ),
+ Factory.build(
+ 'post',
+ {
+ id: 'p1',
+ language: sample(languages),
+ image: faker.image.unsplash.technology(300, 1500),
+ imageAspectRatio: 300 / 1500,
+ },
+ {
+ categoryIds: ['cat1'],
+ author: bobDerBaumeister,
+ },
+ ),
+ Factory.build(
+ 'post',
+ {
+ id: 'p3',
+ language: sample(languages),
+ },
+ {
+ categoryIds: ['cat3'],
+ author: huey,
+ },
+ ),
+ Factory.build(
+ 'post',
+ {
+ id: 'p4',
+ language: sample(languages),
+ },
+ {
+ categoryIds: ['cat4'],
+ author: dewey,
+ },
+ ),
+ Factory.build(
+ 'post',
+ {
+ id: 'p5',
+ language: sample(languages),
+ },
+ {
+ categoryIds: ['cat5'],
+ author: louie,
+ },
+ ),
+ Factory.build(
+ 'post',
+ {
+ id: 'p6',
+ language: sample(languages),
+ image: faker.image.unsplash.buildings(300, 857),
+ imageAspectRatio: 300 / 857,
+ },
+ {
+ categoryIds: ['cat6'],
+ author: peterLustig,
+ },
+ ),
+ Factory.build(
+ 'post',
+ {
+ id: 'p9',
+ language: sample(languages),
+ },
+ {
+ categoryIds: ['cat9'],
+ author: huey,
+ },
+ ),
+ Factory.build(
+ 'post',
+ {
+ id: 'p10',
+ imageBlurred: true,
+ },
+ {
+ categoryIds: ['cat10'],
+ author: dewey,
+ },
+ ),
+ Factory.build(
+ 'post',
+ {
+ id: 'p11',
+ language: sample(languages),
+ image: faker.image.unsplash.people(300, 901),
+ imageAspectRatio: 300 / 901,
+ },
+ {
+ categoryIds: ['cat11'],
+ author: louie,
+ },
+ ),
+ Factory.build(
+ 'post',
+ {
+ id: 'p13',
+ language: sample(languages),
+ },
+ {
+ categoryIds: ['cat13'],
+ author: bobDerBaumeister,
+ },
+ ),
+ Factory.build(
+ 'post',
+ {
+ id: 'p14',
+ language: sample(languages),
+ image: faker.image.unsplash.objects(300, 200),
+ imageAspectRatio: 300 / 450,
+ },
+ {
+ categoryIds: ['cat14'],
+ author: jennyRostock,
+ },
+ ),
+ Factory.build(
+ 'post',
+ {
+ id: 'p15',
+ language: sample(languages),
+ },
+ {
+ categoryIds: ['cat15'],
+ author: huey,
+ },
+ ),
])
authenticatedUser = await louie.toJson()
@@ -554,61 +648,116 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
authenticatedUser = null
const comments = await Promise.all([
- factory.create('Comment', {
- author: jennyRostock,
- id: 'c1',
- postId: 'p1',
- }),
- factory.create('Comment', {
- author: huey,
- id: 'c2',
- postId: 'p1',
- }),
- factory.create('Comment', {
- author: louie,
- id: 'c3',
- postId: 'p3',
- }),
- factory.create('Comment', {
- author: jennyRostock,
- id: 'c5',
- postId: 'p3',
- }),
- factory.create('Comment', {
- author: peterLustig,
- id: 'c6',
- postId: 'p4',
- }),
- factory.create('Comment', {
- author: jennyRostock,
- id: 'c7',
- postId: 'p2',
- }),
- factory.create('Comment', {
- author: huey,
- id: 'c8',
- postId: 'p15',
- }),
- factory.create('Comment', {
- author: dewey,
- id: 'c9',
- postId: 'p15',
- }),
- factory.create('Comment', {
- author: louie,
- id: 'c10',
- postId: 'p15',
- }),
- factory.create('Comment', {
- author: jennyRostock,
- id: 'c11',
- postId: 'p15',
- }),
- factory.create('Comment', {
- author: jennyRostock,
- id: 'c12',
- postId: 'p15',
- }),
+ Factory.build(
+ 'comment',
+ {
+ id: 'c1',
+ },
+ {
+ author: jennyRostock,
+ postId: 'p1',
+ },
+ ),
+ Factory.build(
+ 'comment',
+ {
+ id: 'c2',
+ },
+ {
+ author: huey,
+ postId: 'p1',
+ },
+ ),
+ Factory.build(
+ 'comment',
+ {
+ id: 'c3',
+ },
+ {
+ author: louie,
+ postId: 'p3',
+ },
+ ),
+ Factory.build(
+ 'comment',
+ {
+ id: 'c5',
+ },
+ {
+ author: jennyRostock,
+ postId: 'p3',
+ },
+ ),
+ Factory.build(
+ 'comment',
+ {
+ id: 'c6',
+ },
+ {
+ author: peterLustig,
+ postId: 'p4',
+ },
+ ),
+ Factory.build(
+ 'comment',
+ {
+ id: 'c7',
+ },
+ {
+ author: jennyRostock,
+ postId: 'p2',
+ },
+ ),
+ Factory.build(
+ 'comment',
+ {
+ id: 'c8',
+ },
+ {
+ author: huey,
+ postId: 'p15',
+ },
+ ),
+ Factory.build(
+ 'comment',
+ {
+ id: 'c9',
+ },
+ {
+ author: dewey,
+ postId: 'p15',
+ },
+ ),
+ Factory.build(
+ 'comment',
+ {
+ id: 'c10',
+ },
+ {
+ author: louie,
+ postId: 'p15',
+ },
+ ),
+ Factory.build(
+ 'comment',
+ {
+ id: 'c11',
+ },
+ {
+ author: jennyRostock,
+ postId: 'p15',
+ },
+ ),
+ Factory.build(
+ 'comment',
+ {
+ id: 'c12',
+ },
+ {
+ author: jennyRostock,
+ postId: 'p15',
+ },
+ ),
])
const trollingComment = comments[0]
@@ -675,10 +824,10 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
])
const reports = await Promise.all([
- factory.create('Report'),
- factory.create('Report'),
- factory.create('Report'),
- factory.create('Report'),
+ Factory.build('report'),
+ Factory.build('report'),
+ Factory.build('report'),
+ Factory.build('report'),
])
const reportAgainstDagobert = reports[0]
const reportAgainstTrollingPost = reports[1]
@@ -784,231 +933,337 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
trollingComment.update({ disabled: true, updatedAt: new Date().toISOString(), closed: true }),
])
+ await Promise.all([...Array(30).keys()].map(() => Factory.build('user')))
+
await Promise.all(
- [...Array(30).keys()].map(i => {
- return factory.create('User')
- }),
+ [...Array(30).keys()].map(() =>
+ Factory.build(
+ 'post',
+ {
+ image: faker.image.unsplash.objects(),
+ },
+ {
+ categoryIds: ['cat1'],
+ author: jennyRostock,
+ },
+ ),
+ ),
)
await Promise.all(
- [...Array(30).keys()].map(() => {
- return factory.create('Post', {
- author: jennyRostock,
- image: faker.image.unsplash.objects(),
- })
- }),
+ [...Array(6).keys()].map(() =>
+ Factory.build(
+ 'comment',
+ {},
+ {
+ author: jennyRostock,
+ postId: 'p2',
+ },
+ ),
+ ),
)
await Promise.all(
- [...Array(6).keys()].map(() => {
- return factory.create('Comment', {
- author: jennyRostock,
- postId: 'p2',
- })
- }),
+ [...Array(4).keys()].map(() =>
+ Factory.build(
+ 'comment',
+ {},
+ {
+ author: jennyRostock,
+ postId: 'p15',
+ },
+ ),
+ ),
)
await Promise.all(
- [...Array(4).keys()].map(() => {
- return factory.create('Comment', {
- author: jennyRostock,
- postId: 'p15',
- })
- }),
+ [...Array(2).keys()].map(() =>
+ Factory.build(
+ 'comment',
+ {},
+ {
+ author: jennyRostock,
+ postId: 'p4',
+ },
+ ),
+ ),
)
await Promise.all(
- [...Array(2).keys()].map(() => {
- return factory.create('Comment', {
- author: jennyRostock,
- postId: 'p4',
- })
- }),
+ [...Array(21).keys()].map(() =>
+ Factory.build(
+ 'post',
+ {
+ image: faker.image.unsplash.buildings(),
+ },
+ {
+ categoryIds: ['cat1'],
+ author: peterLustig,
+ },
+ ),
+ ),
)
await Promise.all(
- [...Array(21).keys()].map(() => {
- return factory.create('Post', {
- author: peterLustig,
- image: faker.image.unsplash.buildings(),
- })
- }),
+ [...Array(3).keys()].map(() =>
+ Factory.build(
+ 'comment',
+ {},
+ {
+ author: peterLustig,
+ postId: 'p4',
+ },
+ ),
+ ),
)
await Promise.all(
- [...Array(3).keys()].map(() => {
- return factory.create('Comment', {
- author: peterLustig,
- postId: 'p4',
- })
- }),
+ [...Array(3).keys()].map(() =>
+ Factory.build(
+ 'comment',
+ {},
+ {
+ author: peterLustig,
+ postId: 'p14',
+ },
+ ),
+ ),
)
await Promise.all(
- [...Array(5).keys()].map(() => {
- return factory.create('Comment', {
- author: peterLustig,
- postId: 'p14',
- })
- }),
+ [...Array(6).keys()].map(() =>
+ Factory.build(
+ 'comment',
+ {},
+ {
+ author: peterLustig,
+ postId: 'p0',
+ },
+ ),
+ ),
)
await Promise.all(
- [...Array(6).keys()].map(() => {
- return factory.create('Comment', {
- author: peterLustig,
- postId: 'p0',
- })
- }),
+ [...Array(11).keys()].map(() =>
+ Factory.build(
+ 'post',
+ {
+ image: faker.image.unsplash.food(),
+ },
+ {
+ categoryIds: ['cat1'],
+ author: dewey,
+ },
+ ),
+ ),
)
await Promise.all(
- [...Array(11).keys()].map(() => {
- return factory.create('Post', {
- author: dewey,
- image: faker.image.unsplash.food(),
- })
- }),
+ [...Array(7).keys()].map(() =>
+ Factory.build(
+ 'comment',
+ {},
+ {
+ author: dewey,
+ postId: 'p2',
+ },
+ ),
+ ),
)
await Promise.all(
- [...Array(7).keys()].map(() => {
- return factory.create('Comment', {
- author: dewey,
- postId: 'p2',
- })
- }),
+ [...Array(5).keys()].map(() =>
+ Factory.build(
+ 'comment',
+ {},
+ {
+ author: dewey,
+ postId: 'p6',
+ },
+ ),
+ ),
)
await Promise.all(
- [...Array(5).keys()].map(() => {
- return factory.create('Comment', {
- author: dewey,
- postId: 'p6',
- })
- }),
+ [...Array(2).keys()].map(() =>
+ Factory.build(
+ 'comment',
+ {},
+ {
+ author: dewey,
+ postId: 'p9',
+ },
+ ),
+ ),
)
await Promise.all(
- [...Array(2).keys()].map(() => {
- return factory.create('Comment', {
- author: dewey,
- postId: 'p9',
- })
- }),
+ [...Array(16).keys()].map(() =>
+ Factory.build(
+ 'post',
+ {
+ image: faker.image.unsplash.technology(),
+ },
+ {
+ categoryIds: ['cat1'],
+ author: louie,
+ },
+ ),
+ ),
)
await Promise.all(
- [...Array(16).keys()].map(() => {
- return factory.create('Post', {
- author: louie,
- image: faker.image.unsplash.technology(),
- })
- }),
+ [...Array(4).keys()].map(() =>
+ Factory.build(
+ 'comment',
+ {},
+ {
+ postId: 'p1',
+ author: louie,
+ },
+ ),
+ ),
)
await Promise.all(
- [...Array(4).keys()].map(() => {
- return factory.create('Comment', {
- author: louie,
- postId: 'p1',
- })
- }),
+ [...Array(8).keys()].map(() =>
+ Factory.build(
+ 'comment',
+ {},
+ {
+ author: louie,
+ postId: 'p10',
+ },
+ ),
+ ),
)
await Promise.all(
- [...Array(8).keys()].map(() => {
- return factory.create('Comment', {
- author: louie,
- postId: 'p10',
- })
- }),
+ [...Array(5).keys()].map(() =>
+ Factory.build(
+ 'comment',
+ {},
+ {
+ author: louie,
+ postId: 'p13',
+ },
+ ),
+ ),
)
await Promise.all(
- [...Array(5).keys()].map(() => {
- return factory.create('Comment', {
- author: louie,
- postId: 'p13',
- })
- }),
+ [...Array(45).keys()].map(() =>
+ Factory.build(
+ 'post',
+ {
+ image: faker.image.unsplash.people(),
+ },
+ {
+ categoryIds: ['cat1'],
+ author: bobDerBaumeister,
+ },
+ ),
+ ),
)
await Promise.all(
- [...Array(45).keys()].map(() => {
- return factory.create('Post', {
- author: bobDerBaumeister,
- image: faker.image.unsplash.people(),
- })
- }),
+ [...Array(2).keys()].map(() =>
+ Factory.build(
+ 'comment',
+ {},
+ {
+ author: bobDerBaumeister,
+ postId: 'p2',
+ },
+ ),
+ ),
)
await Promise.all(
- [...Array(2).keys()].map(() => {
- return factory.create('Comment', {
- author: bobDerBaumeister,
- postId: 'p2',
- })
- }),
+ [...Array(3).keys()].map(() =>
+ Factory.build(
+ 'comment',
+ {},
+ {
+ author: bobDerBaumeister,
+ postId: 'p12',
+ },
+ ),
+ ),
)
await Promise.all(
- [...Array(3).keys()].map(() => {
- return factory.create('Comment', {
- author: bobDerBaumeister,
- postId: 'p12',
- })
- }),
+ [...Array(7).keys()].map(() =>
+ Factory.build(
+ 'comment',
+ {},
+ {
+ author: bobDerBaumeister,
+ postId: 'p13',
+ },
+ ),
+ ),
)
await Promise.all(
- [...Array(7).keys()].map(() => {
- return factory.create('Comment', {
- author: bobDerBaumeister,
- postId: 'p13',
- })
- }),
+ [...Array(8).keys()].map(() =>
+ Factory.build(
+ 'post',
+ {
+ image: faker.image.unsplash.nature(),
+ },
+ {
+ categoryIds: ['cat1'],
+ author: huey,
+ },
+ ),
+ ),
)
await Promise.all(
- [...Array(8).keys()].map(() => {
- return factory.create('Post', {
- author: huey,
- image: faker.image.unsplash.nature(),
- })
- }),
+ [...Array(6).keys()].map(() =>
+ Factory.build(
+ 'comment',
+ {},
+ {
+ author: huey,
+ postId: 'p0',
+ },
+ ),
+ ),
)
await Promise.all(
- [...Array(6).keys()].map(() => {
- return factory.create('Comment', {
- author: huey,
- postId: 'p0',
- })
- }),
+ [...Array(8).keys()].map(() =>
+ Factory.build(
+ 'comment',
+ {},
+ {
+ author: huey,
+ postId: 'p13',
+ },
+ ),
+ ),
)
await Promise.all(
- [...Array(8).keys()].map(() => {
- return factory.create('Comment', {
- author: huey,
- postId: 'p13',
- })
- }),
+ [...Array(8).keys()].map(() =>
+ Factory.build(
+ 'comment',
+ {},
+ {
+ author: huey,
+ postId: 'p15',
+ },
+ ),
+ ),
)
- await Promise.all(
- [...Array(9).keys()].map(() => {
- return factory.create('Comment', {
- author: huey,
- postId: 'p15',
- })
- }),
- )
-
- await factory.create('Donations')
+ await Factory.build('donations')
/* eslint-disable-next-line no-console */
console.log('Seeded Data...')
+ await driver.close()
+ await neode.close()
process.exit(0)
} catch (err) {
/* eslint-disable-next-line no-console */
diff --git a/backend/src/factories/badges.js b/backend/src/factories/badges.js
deleted file mode 100644
index 5f0482460..000000000
--- a/backend/src/factories/badges.js
+++ /dev/null
@@ -1,15 +0,0 @@
-export default function create() {
- return {
- factory: async ({ args, neodeInstance }) => {
- const defaults = {
- type: 'crowdfunding',
- status: 'permanent',
- }
- args = {
- ...defaults,
- ...args,
- }
- return neodeInstance.create('Badge', args)
- },
- }
-}
diff --git a/backend/src/factories/categories.js b/backend/src/factories/categories.js
deleted file mode 100644
index d3f5fed21..000000000
--- a/backend/src/factories/categories.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import uuid from 'uuid/v4'
-
-export default function create() {
- return {
- factory: async ({ args, neodeInstance }) => {
- const defaults = {
- id: uuid(),
- icon: 'img/badges/fundraisingbox_de_airship.svg',
- name: 'Some category name',
- }
- args = {
- ...defaults,
- ...args,
- }
- return neodeInstance.create('Category', args)
- },
- }
-}
diff --git a/backend/src/factories/comments.js b/backend/src/factories/comments.js
deleted file mode 100644
index de3390e1a..000000000
--- a/backend/src/factories/comments.js
+++ /dev/null
@@ -1,38 +0,0 @@
-import faker from 'faker'
-import uuid from 'uuid/v4'
-
-export default function create() {
- return {
- factory: async ({ args, neodeInstance, factoryInstance }) => {
- const defaults = {
- id: uuid(),
- content: [faker.lorem.sentence(), faker.lorem.sentence()].join('. '),
- }
- args = {
- ...defaults,
- ...args,
- }
- args.contentExcerpt = args.contentExcerpt || args.content
-
- let { post, postId } = args
- delete args.post
- delete args.postId
- if (post && postId) throw new Error('You provided both post and postId')
- if (postId) post = await neodeInstance.find('Post', postId)
- post = post || (await factoryInstance.create('Post'))
-
- let { author, authorId } = args
- delete args.author
- delete args.authorId
- if (author && authorId) throw new Error('You provided both author and authorId')
- if (authorId) author = await neodeInstance.find('User', authorId)
- author = author || (await factoryInstance.create('User'))
-
- delete args.author
- const comment = await neodeInstance.create('Comment', args)
- await comment.relateTo(post, 'post')
- await comment.relateTo(author, 'author')
- return comment
- },
- }
-}
diff --git a/backend/src/factories/donations.js b/backend/src/factories/donations.js
deleted file mode 100644
index e22cdb6d7..000000000
--- a/backend/src/factories/donations.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import uuid from 'uuid/v4'
-
-export default function create() {
- return {
- factory: async ({ args, neodeInstance }) => {
- const defaults = {
- id: uuid(),
- goal: 15000,
- progress: 0,
- }
- args = {
- ...defaults,
- ...args,
- }
- return neodeInstance.create('Donations', args)
- },
- }
-}
diff --git a/backend/src/factories/emailAddresses.js b/backend/src/factories/emailAddresses.js
deleted file mode 100644
index 41b1fe96c..000000000
--- a/backend/src/factories/emailAddresses.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import faker from 'faker'
-
-export function defaults({ args }) {
- const defaults = {
- email: faker.internet.email(),
- verifiedAt: new Date().toISOString(),
- }
- args = {
- ...defaults,
- ...args,
- }
- return args
-}
-
-export default function create() {
- return {
- factory: async ({ args, neodeInstance }) => {
- args = defaults({ args })
- return neodeInstance.create('EmailAddress', args)
- },
- }
-}
diff --git a/backend/src/factories/index.js b/backend/src/factories/index.js
deleted file mode 100644
index c3ab14f64..000000000
--- a/backend/src/factories/index.js
+++ /dev/null
@@ -1,63 +0,0 @@
-import { getDriver, getNeode } from '../db/neo4j'
-
-const factories = {
- Badge: require('./badges.js').default,
- User: require('./users.js').default,
- Post: require('./posts.js').default,
- Comment: require('./comments.js').default,
- Category: require('./categories.js').default,
- Tag: require('./tags.js').default,
- SocialMedia: require('./socialMedia.js').default,
- Location: require('./locations.js').default,
- EmailAddress: require('./emailAddresses.js').default,
- UnverifiedEmailAddress: require('./unverifiedEmailAddresses.js').default,
- Donations: require('./donations.js').default,
- Report: require('./reports.js').default,
-}
-
-export const cleanDatabase = async (options = {}) => {
- const { driver = getDriver() } = options
- const session = driver.session()
- try {
- await session.writeTransaction(transaction => {
- return transaction.run(
- `
- MATCH (everything)
- DETACH DELETE everything
- `,
- )
- })
- } finally {
- session.close()
- }
-}
-
-export default function Factory(options = {}) {
- const { neo4jDriver = getDriver(), neodeInstance = getNeode() } = options
-
- const result = {
- neo4jDriver,
- factories,
- lastResponse: null,
- neodeInstance,
- async create(node, args = {}) {
- const { factory } = this.factories[node](args)
- this.lastResponse = await factory({
- args,
- neodeInstance,
- factoryInstance: this,
- })
- return this.lastResponse
- },
-
- async cleanDatabase() {
- this.lastResponse = await cleanDatabase({
- driver: this.neo4jDriver,
- })
- return this
- },
- }
- result.create.bind(result)
- result.cleanDatabase.bind(result)
- return result
-}
diff --git a/backend/src/factories/locations.js b/backend/src/factories/locations.js
deleted file mode 100644
index 99b666de8..000000000
--- a/backend/src/factories/locations.js
+++ /dev/null
@@ -1,24 +0,0 @@
-export default function create() {
- return {
- factory: async ({ args, neodeInstance }) => {
- const defaults = {
- name: 'Germany',
- namePT: 'Alemanha',
- nameDE: 'Deutschland',
- nameES: 'Alemania',
- nameNL: 'Duitsland',
- namePL: 'Niemcy',
- nameFR: 'Allemagne',
- nameIT: 'Germania',
- nameEN: 'Germany',
- id: 'country.10743216036480410',
- type: 'country',
- }
- args = {
- ...defaults,
- ...args,
- }
- return neodeInstance.create('Location', args)
- },
- }
-}
diff --git a/backend/src/factories/posts.js b/backend/src/factories/posts.js
deleted file mode 100644
index d997b738f..000000000
--- a/backend/src/factories/posts.js
+++ /dev/null
@@ -1,89 +0,0 @@
-import faker from 'faker'
-import slugify from 'slug'
-import uuid from 'uuid/v4'
-
-export default function create() {
- return {
- factory: async ({ args, neodeInstance, factoryInstance }) => {
- const defaults = {
- id: uuid(),
- title: faker.lorem.sentence(),
- content: [
- faker.lorem.sentence(),
- faker.lorem.sentence(),
- faker.lorem.sentence(),
- faker.lorem.sentence(),
- faker.lorem.sentence(),
- ].join('. '),
- image: faker.image.unsplash.imageUrl(),
- visibility: 'public',
- deleted: false,
- categoryIds: [],
- imageBlurred: false,
- imageAspectRatio: 1.333,
- pinned: null,
- }
- args = {
- ...defaults,
- ...args,
- }
- // Convert false to null
- args.pinned = args.pinned || null
-
- args.slug = args.slug || slugify(args.title, { lower: true })
- args.contentExcerpt = args.contentExcerpt || args.content
-
- let { categories, categoryIds } = args
- delete args.categories
- delete args.categoryIds
- if (categories && categoryIds) throw new Error('You provided both categories and categoryIds')
- if (categoryIds)
- categories = await Promise.all(categoryIds.map(id => neodeInstance.find('Category', id)))
- categories = categories || (await Promise.all([factoryInstance.create('Category')]))
- const { tagIds = [] } = args
- delete args.tags
- const tags = await Promise.all(
- tagIds.map(t => {
- return neodeInstance.find('Tag', t)
- }),
- )
-
- let { author, authorId } = args
- delete args.author
- delete args.authorId
- if (author && authorId) throw new Error('You provided both author and authorId')
- if (authorId) author = await neodeInstance.find('User', authorId)
- author = author || (await factoryInstance.create('User'))
- const post = await neodeInstance.create('Post', args)
-
- const { commentContent } = args
- let comment
- delete args.commentContent
- if (commentContent)
- comment = await factoryInstance.create('Comment', {
- contentExcerpt: commentContent,
- post,
- author,
- })
-
- await post.relateTo(author, 'author')
- if (comment) await post.relateTo(comment, 'comments')
-
- if (args.pinned) {
- args.pinnedAt = args.pinnedAt || new Date().toISOString()
- if (!args.pinnedBy) {
- const admin = await factoryInstance.create('User', {
- role: 'admin',
- updatedAt: new Date().toISOString(),
- })
- await admin.relateTo(post, 'pinned')
- args.pinnedBy = admin
- }
- }
-
- await Promise.all(categories.map(c => c.relateTo(post, 'post')))
- await Promise.all(tags.map(t => t.relateTo(post, 'post')))
- return post
- },
- }
-}
diff --git a/backend/src/factories/reports.js b/backend/src/factories/reports.js
deleted file mode 100644
index e2d5ec4dc..000000000
--- a/backend/src/factories/reports.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function create() {
- return {
- factory: async ({ args, neodeInstance }) => {
- return neodeInstance.create('Report', args)
- },
- }
-}
diff --git a/backend/src/factories/socialMedia.js b/backend/src/factories/socialMedia.js
deleted file mode 100644
index 49a237cef..000000000
--- a/backend/src/factories/socialMedia.js
+++ /dev/null
@@ -1,14 +0,0 @@
-export default function create() {
- return {
- factory: async ({ args, neodeInstance }) => {
- const defaults = {
- url: 'https://mastodon.social/@Gargron',
- }
- args = {
- ...defaults,
- ...args,
- }
- return neodeInstance.create('SocialMedia', args)
- },
- }
-}
diff --git a/backend/src/factories/tags.js b/backend/src/factories/tags.js
deleted file mode 100644
index 9005d1406..000000000
--- a/backend/src/factories/tags.js
+++ /dev/null
@@ -1,12 +0,0 @@
-export default function create() {
- return {
- factory: async ({ args, neodeInstance }) => {
- const defaults = { name: '#human-connection' }
- args = {
- ...defaults,
- ...args,
- }
- return neodeInstance.create('Tag', args)
- },
- }
-}
diff --git a/backend/src/factories/unverifiedEmailAddresses.js b/backend/src/factories/unverifiedEmailAddresses.js
deleted file mode 100644
index 94e32af6e..000000000
--- a/backend/src/factories/unverifiedEmailAddresses.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import { defaults } from './emailAddresses.js'
-
-export default function create() {
- return {
- factory: async ({ args, neodeInstance }) => {
- args = defaults({ args })
- return neodeInstance.create('UnverifiedEmailAddress', args)
- },
- }
-}
diff --git a/backend/src/factories/users.js b/backend/src/factories/users.js
deleted file mode 100644
index 57f69b76b..000000000
--- a/backend/src/factories/users.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import faker from 'faker'
-import uuid from 'uuid/v4'
-import encryptPassword from '../helpers/encryptPassword'
-import slugify from 'slug'
-
-export default function create() {
- return {
- factory: async ({ args, neodeInstance, factoryInstance }) => {
- const defaults = {
- id: uuid(),
- name: faker.name.findName(),
- email: faker.internet.email(),
- password: '1234',
- role: 'user',
- avatar: faker.internet.avatar(),
- about: faker.lorem.paragraph(),
- termsAndConditionsAgreedVersion: '0.0.1',
- termsAndConditionsAgreedAt: '2019-08-01T10:47:19.212Z',
- allowEmbedIframes: false,
- showShoutsPublicly: false,
- locale: 'en',
- }
- defaults.slug = slugify(defaults.name, { lower: true })
- args = {
- ...defaults,
- ...args,
- }
- args = await encryptPassword(args)
- const user = await neodeInstance.create('User', args)
-
- let email
- if (typeof args.email === 'object') {
- // probably a neode node
- email = args.email
- } else {
- email = await factoryInstance.create('EmailAddress', { email: args.email })
- }
-
- await user.relateTo(email, 'primaryEmail')
- await email.relateTo(user, 'belongsTo')
- return user
- },
- }
-}
diff --git a/backend/src/index.js b/backend/src/index.js
index 98354dc1f..59718dad1 100644
--- a/backend/src/index.js
+++ b/backend/src/index.js
@@ -1,9 +1,11 @@
import createServer from './server'
import CONFIG from './config'
-const { app } = createServer()
+const { server, httpServer } = createServer()
const url = new URL(CONFIG.GRAPHQL_URI)
-app.listen({ port: url.port }, () => {
+httpServer.listen({ port: url.port }, () => {
/* eslint-disable-next-line no-console */
- console.log(`GraphQLServer ready at ${CONFIG.GRAPHQL_URI} 🚀`)
+ console.log(`🚀 Server ready at http://localhost:${url.port}${server.graphqlPath}`)
+ /* eslint-disable-next-line no-console */
+ console.log(`🚀 Subscriptions ready at ws://localhost:${url.port}${server.subscriptionsPath}`)
})
diff --git a/backend/src/jwt/decode.spec.js b/backend/src/jwt/decode.spec.js
index 71444a3e5..aa8ff0674 100644
--- a/backend/src/jwt/decode.spec.js
+++ b/backend/src/jwt/decode.spec.js
@@ -1,8 +1,7 @@
-import Factory from '../factories/index'
+import Factory, { cleanDatabase } from '../db/factories'
import { getDriver, getNeode } from '../db/neo4j'
import decode from './decode'
-const factory = Factory()
const driver = getDriver()
const neode = getNeode()
@@ -26,7 +25,7 @@ export const validAuthorizationHeader =
'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoidXNlciIsImxvY2F0aW9uTmFtZSI6bnVsbCwibmFtZSI6Ikplbm55IFJvc3RvY2siLCJhYm91dCI6bnVsbCwiYXZhdGFyIjoiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL3VpZmFjZXMvZmFjZXMvdHdpdHRlci9zYXNoYV9zaGVzdGFrb3YvMTI4LmpwZyIsImlkIjoidTMiLCJlbWFpbCI6InVzZXJAZXhhbXBsZS5vcmciLCJzbHVnIjoiamVubnktcm9zdG9jayIsImlhdCI6MTU1MDg0NjY4MCwiZXhwIjoxNjM3MjQ2NjgwLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjMwMDAiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjQwMDAiLCJzdWIiOiJ1MyJ9.eZ_mVKas4Wzoc_JrQTEWXyRn7eY64cdIg4vqQ-F_7Jc'
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('decode', () => {
@@ -65,14 +64,19 @@ describe('decode', () => {
describe('and corresponding user in the database', () => {
let user
beforeEach(async () => {
- user = await factory.create('User', {
- role: 'user',
- name: 'Jenny Rostock',
- avatar: 'https://s3.amazonaws.com/uifaces/faces/twitter/sasha_shestakov/128.jpg',
- id: 'u3',
- email: 'user@example.org',
- slug: 'jenny-rostock',
- })
+ user = await Factory.build(
+ 'user',
+ {
+ role: 'user',
+ name: 'Jenny Rostock',
+ avatar: 'https://s3.amazonaws.com/uifaces/faces/twitter/sasha_shestakov/128.jpg',
+ id: 'u3',
+ slug: 'jenny-rostock',
+ },
+ {
+ email: 'user@example.org',
+ },
+ )
})
it('returns user object except email', async () => {
diff --git a/backend/src/jwt/encode.js b/backend/src/jwt/encode.js
index f2547e30e..9126f2577 100644
--- a/backend/src/jwt/encode.js
+++ b/backend/src/jwt/encode.js
@@ -3,14 +3,12 @@ import CONFIG from './../config'
// Generate an Access Token for the given User ID
export default function encode(user) {
- const token = jwt.sign(user, CONFIG.JWT_SECRET, {
+ const { id, name, slug } = user
+ const token = jwt.sign({ id, name, slug }, CONFIG.JWT_SECRET, {
expiresIn: '1d',
issuer: CONFIG.GRAPHQL_URI,
audience: CONFIG.CLIENT_URI,
subject: user.id.toString(),
})
- // jwt.verifySignature(token, CONFIG.JWT_SECRET, (err, data) => {
- // console.log('token verification:', err, data)
- // })
return token
}
diff --git a/backend/src/jwt/encode.spec.js b/backend/src/jwt/encode.spec.js
new file mode 100644
index 000000000..21ebdffec
--- /dev/null
+++ b/backend/src/jwt/encode.spec.js
@@ -0,0 +1,62 @@
+import encode from './encode'
+import jwt from 'jsonwebtoken'
+import CONFIG from './../config'
+
+describe('encode', () => {
+ let payload
+ beforeEach(() => {
+ payload = {
+ name: 'Some body',
+ slug: 'some-body',
+ id: 'some-id',
+ }
+ })
+
+ it('encodes a valided JWT bearer token', () => {
+ const token = encode(payload)
+ expect(token.split('.')).toHaveLength(3)
+ const decoded = jwt.verify(token, CONFIG.JWT_SECRET)
+ expect(decoded).toEqual({
+ name: 'Some body',
+ slug: 'some-body',
+ id: 'some-id',
+ sub: 'some-id',
+ aud: expect.any(String),
+ iss: expect.any(String),
+ iat: expect.any(Number),
+ exp: expect.any(Number),
+ })
+ })
+
+ describe('given sensitive data', () => {
+ beforeEach(() => {
+ payload = {
+ ...payload,
+ email: 'none-of-your-business@example.org',
+ password: 'topsecret',
+ }
+ })
+
+ it('does not encode sensitive data', () => {
+ const token = encode(payload)
+ expect(payload).toEqual({
+ email: 'none-of-your-business@example.org',
+ password: 'topsecret',
+ name: 'Some body',
+ slug: 'some-body',
+ id: 'some-id',
+ })
+ const decoded = jwt.verify(token, CONFIG.JWT_SECRET)
+ expect(decoded).toEqual({
+ name: 'Some body',
+ slug: 'some-body',
+ id: 'some-id',
+ sub: 'some-id',
+ aud: expect.any(String),
+ iss: expect.any(String),
+ iat: expect.any(Number),
+ exp: expect.any(Number),
+ })
+ })
+ })
+})
diff --git a/backend/src/middleware/hashtags/hashtagsMiddleware.spec.js b/backend/src/middleware/hashtags/hashtagsMiddleware.spec.js
index 2247e692d..be9039a6f 100644
--- a/backend/src/middleware/hashtags/hashtagsMiddleware.spec.js
+++ b/backend/src/middleware/hashtags/hashtagsMiddleware.spec.js
@@ -1,5 +1,5 @@
import { gql } from '../../helpers/jest'
-import Factory from '../../factories'
+import { cleanDatabase } from '../../db/factories'
import { createTestClient } from 'apollo-server-testing'
import { getNeode, getDriver } from '../../db/neo4j'
import createServer from '../../server'
@@ -9,7 +9,6 @@ let query
let mutate
let hashtagingUser
let authenticatedUser
-const factory = Factory()
const driver = getDriver()
const neode = getNeode()
const categoryIds = ['cat9']
@@ -48,13 +47,18 @@ beforeAll(() => {
})
beforeEach(async () => {
- hashtagingUser = await neode.create('User', {
- id: 'you',
- name: 'Al Capone',
- slug: 'al-capone',
- email: 'test@example.org',
- password: '1234',
- })
+ hashtagingUser = await neode.create(
+ 'User',
+ {
+ id: 'you',
+ name: 'Al Capone',
+ slug: 'al-capone',
+ },
+ {
+ password: '1234',
+ email: 'test@example.org',
+ },
+ )
await neode.create('Category', {
id: 'cat9',
name: 'Democracy & Politics',
@@ -63,7 +67,7 @@ beforeEach(async () => {
})
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('hashtags', () => {
diff --git a/backend/src/middleware/notifications/notificationsMiddleware.js b/backend/src/middleware/notifications/notificationsMiddleware.js
index e0b831b59..4636b8e9f 100644
--- a/backend/src/middleware/notifications/notificationsMiddleware.js
+++ b/backend/src/middleware/notifications/notificationsMiddleware.js
@@ -1,5 +1,6 @@
import extractMentionedUsers from './mentions/extractMentionedUsers'
import { validateNotifyUsers } from '../validation/validationMiddleware'
+import { pubsub, NOTIFICATION_ADDED } from '../../server'
const handleContentDataOfPost = async (resolve, root, args, context, resolveInfo) => {
const idsOfUsers = extractMentionedUsers(args.content)
@@ -52,34 +53,48 @@ const notifyUsersOfMention = async (label, id, idsOfUsers, reason, context) => {
WHERE user.id in $idsOfUsers
AND NOT (user)-[:BLOCKED]-(author)
MERGE (post)-[notification:NOTIFIED {reason: $reason}]->(user)
+ WITH post AS resource, notification, user
`
break
}
case 'mentioned_in_comment': {
mentionedCypher = `
- MATCH (postAuthor: User)-[:WROTE]->(post: Post)<-[:COMMENTS]-(comment: Comment { id: $id })<-[:WROTE]-(author: User)
+ MATCH (postAuthor: User)-[:WROTE]->(post: Post)<-[:COMMENTS]-(comment: Comment { id: $id })<-[:WROTE]-(commenter: User)
MATCH (user: User)
WHERE user.id in $idsOfUsers
- AND NOT (user)-[:BLOCKED]-(author)
+ AND NOT (user)-[:BLOCKED]-(commenter)
AND NOT (user)-[:BLOCKED]-(postAuthor)
MERGE (comment)-[notification:NOTIFIED {reason: $reason}]->(user)
+ WITH comment AS resource, notification, user
`
break
}
}
mentionedCypher += `
+ WITH notification, user, resource,
+ [(resource)<-[:WROTE]-(author:User) | author {.*}] AS authors,
+ [(resource)-[:COMMENTS]->(post:Post)<-[:WROTE]-(author:User) | post{.*, author: properties(author)} ] AS posts
+ WITH resource, user, notification, authors, posts,
+ resource {.*, __typename: labels(resource)[0], author: authors[0], post: posts[0]} AS finalResource
SET notification.read = FALSE
- SET (
- CASE
- WHEN notification.createdAt IS NULL
- THEN notification END ).createdAt = toString(datetime())
+ SET notification.createdAt = COALESCE(notification.createdAt, toString(datetime()))
SET notification.updatedAt = toString(datetime())
+ RETURN notification {.*, from: finalResource, to: properties(user)}
`
const session = context.driver.session()
- try {
- await session.writeTransaction(transaction => {
- return transaction.run(mentionedCypher, { id, idsOfUsers, reason })
+ const writeTxResultPromise = session.writeTransaction(async transaction => {
+ const notificationTransactionResponse = await transaction.run(mentionedCypher, {
+ id,
+ idsOfUsers,
+ reason,
})
+ return notificationTransactionResponse.records.map(record => record.get('notification'))
+ })
+ try {
+ const [notification] = await writeTxResultPromise
+ return pubsub.publish(NOTIFICATION_ADDED, { notificationAdded: notification })
+ } catch (error) {
+ throw new Error(error)
} finally {
session.close()
}
@@ -88,24 +103,26 @@ const notifyUsersOfMention = async (label, id, idsOfUsers, reason, context) => {
const notifyUsersOfComment = async (label, commentId, postAuthorId, reason, context) => {
await validateNotifyUsers(label, reason)
const session = context.driver.session()
-
+ const writeTxResultPromise = await session.writeTransaction(async transaction => {
+ const notificationTransactionResponse = await transaction.run(
+ `
+ MATCH (postAuthor:User {id: $postAuthorId})-[:WROTE]->(post:Post)<-[:COMMENTS]-(comment:Comment { id: $commentId })<-[:WROTE]-(commenter:User)
+ WHERE NOT (postAuthor)-[:BLOCKED]-(commenter)
+ MERGE (comment)-[notification:NOTIFIED {reason: $reason}]->(postAuthor)
+ SET notification.read = FALSE
+ SET notification.createdAt = COALESCE(notification.createdAt, toString(datetime()))
+ SET notification.updatedAt = toString(datetime())
+ WITH notification, postAuthor, post,
+ comment {.*, __typename: labels(comment)[0], author: properties(commenter), post: post {.*, author: properties(postAuthor) } } AS finalResource
+ RETURN notification {.*, from: finalResource, to: properties(postAuthor)}
+ `,
+ { commentId, postAuthorId, reason },
+ )
+ return notificationTransactionResponse.records.map(record => record.get('notification'))
+ })
try {
- await session.writeTransaction(async transaction => {
- await transaction.run(
- `
- MATCH (postAuthor:User {id: $postAuthorId})-[:WROTE]->(post:Post)<-[:COMMENTS]-(comment:Comment { id: $commentId })<-[:WROTE]-(commenter:User)
- WHERE NOT (postAuthor)-[:BLOCKED]-(commenter)
- MERGE (comment)-[notification:NOTIFIED {reason: $reason}]->(postAuthor)
- SET notification.read = FALSE
- SET (
- CASE
- WHEN notification.createdAt IS NULL
- THEN notification END ).createdAt = toString(datetime())
- SET notification.updatedAt = toString(datetime())
- `,
- { commentId, postAuthorId, reason },
- )
- })
+ const [notification] = await writeTxResultPromise
+ return pubsub.publish(NOTIFICATION_ADDED, { notificationAdded: notification })
} finally {
session.close()
}
diff --git a/backend/src/middleware/notifications/notificationsMiddleware.spec.js b/backend/src/middleware/notifications/notificationsMiddleware.spec.js
index 136388b88..95c0037b8 100644
--- a/backend/src/middleware/notifications/notificationsMiddleware.spec.js
+++ b/backend/src/middleware/notifications/notificationsMiddleware.spec.js
@@ -1,11 +1,10 @@
import { gql } from '../../helpers/jest'
-import Factory from '../../factories'
+import { cleanDatabase } from '../../db/factories'
import { createTestClient } from 'apollo-server-testing'
import { getNeode, getDriver } from '../../db/neo4j'
import createServer from '../../server'
let server, query, mutate, notifiedUser, authenticatedUser
-const factory = Factory()
const driver = getDriver()
const neode = getNeode()
const categoryIds = ['cat9']
@@ -36,7 +35,7 @@ const createCommentMutation = gql`
`
beforeAll(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
const createServerResult = createServer({
context: () => {
return {
@@ -53,13 +52,18 @@ beforeAll(async () => {
})
beforeEach(async () => {
- notifiedUser = await neode.create('User', {
- id: 'you',
- name: 'Al Capone',
- slug: 'al-capone',
- email: 'test@example.org',
- password: '1234',
- })
+ notifiedUser = await neode.create(
+ 'User',
+ {
+ id: 'you',
+ name: 'Al Capone',
+ slug: 'al-capone',
+ },
+ {
+ email: 'test@example.org',
+ password: '1234',
+ },
+ )
await neode.create('Category', {
id: 'cat9',
name: 'Democracy & Politics',
@@ -68,7 +72,7 @@ beforeEach(async () => {
})
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('notifications', () => {
@@ -143,13 +147,18 @@ describe('notifications', () => {
describe('commenter is not me', () => {
beforeEach(async () => {
commentContent = 'Commenters comment.'
- commentAuthor = await neode.create('User', {
- id: 'commentAuthor',
- name: 'Mrs Comment',
- slug: 'mrs-comment',
- email: 'commentauthor@example.org',
- password: '1234',
- })
+ commentAuthor = await neode.create(
+ 'User',
+ {
+ id: 'commentAuthor',
+ name: 'Mrs Comment',
+ slug: 'mrs-comment',
+ },
+ {
+ email: 'commentauthor@example.org',
+ password: '1234',
+ },
+ )
})
it('sends me a notification', async () => {
@@ -224,13 +233,18 @@ describe('notifications', () => {
})
beforeEach(async () => {
- postAuthor = await neode.create('User', {
- id: 'postAuthor',
- name: 'Mrs Post',
- slug: 'mrs-post',
- email: 'post-author@example.org',
- password: '1234',
- })
+ postAuthor = await neode.create(
+ 'User',
+ {
+ id: 'postAuthor',
+ name: 'Mrs Post',
+ slug: 'mrs-post',
+ },
+ {
+ email: 'post-author@example.org',
+ password: '1234',
+ },
+ )
})
describe('mentions me in a post', () => {
@@ -428,23 +442,33 @@ describe('notifications', () => {
beforeEach(async () => {
commentContent =
'One mention about me with @al-capone.'
- commentAuthor = await neode.create('User', {
- id: 'commentAuthor',
- name: 'Mrs Comment',
- slug: 'mrs-comment',
- email: 'comment-author@example.org',
- password: '1234',
- })
+ commentAuthor = await neode.create(
+ 'User',
+ {
+ id: 'commentAuthor',
+ name: 'Mrs Comment',
+ slug: 'mrs-comment',
+ },
+ {
+ email: 'comment-author@example.org',
+ password: '1234',
+ },
+ )
})
it('sends only one notification with reason mentioned_in_comment', async () => {
- postAuthor = await neode.create('User', {
- id: 'MrPostAuthor',
- name: 'Mr Author',
- slug: 'mr-author',
- email: 'post-author@example.org',
- password: '1234',
- })
+ postAuthor = await neode.create(
+ 'User',
+ {
+ id: 'MrPostAuthor',
+ name: 'Mr Author',
+ slug: 'mr-author',
+ },
+ {
+ email: 'post-author@example.org',
+ password: '1234',
+ },
+ )
await createCommentOnPostAction()
const expected = expect.objectContaining({
@@ -514,13 +538,18 @@ describe('notifications', () => {
await postAuthor.relateTo(notifiedUser, 'blocked')
commentContent =
'One mention about me with @al-capone.'
- commentAuthor = await neode.create('User', {
- id: 'commentAuthor',
- name: 'Mrs Comment',
- slug: 'mrs-comment',
- email: 'comment-author@example.org',
- password: '1234',
- })
+ commentAuthor = await neode.create(
+ 'User',
+ {
+ id: 'commentAuthor',
+ name: 'Mrs Comment',
+ slug: 'mrs-comment',
+ },
+ {
+ email: 'comment-author@example.org',
+ password: '1234',
+ },
+ )
})
it('sends no notification', async () => {
diff --git a/backend/src/middleware/orderByMiddleware.spec.js b/backend/src/middleware/orderByMiddleware.spec.js
index 8d92a5b5d..91caa1f54 100644
--- a/backend/src/middleware/orderByMiddleware.spec.js
+++ b/backend/src/middleware/orderByMiddleware.spec.js
@@ -1,10 +1,9 @@
import { gql } from '../helpers/jest'
-import Factory from '../factories'
+import { cleanDatabase } from '../db/factories'
import { getNeode, getDriver } from '../db/neo4j'
import { createTestClient } from 'apollo-server-testing'
import createServer from '../server'
-const factory = Factory()
const neode = getNeode()
const driver = getDriver()
@@ -27,7 +26,7 @@ beforeEach(async () => {
})
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('Query', () => {
diff --git a/backend/src/middleware/permissionsMiddleware.spec.js b/backend/src/middleware/permissionsMiddleware.spec.js
index a4f13ea0c..3c307348d 100644
--- a/backend/src/middleware/permissionsMiddleware.spec.js
+++ b/backend/src/middleware/permissionsMiddleware.spec.js
@@ -1,10 +1,9 @@
import { createTestClient } from 'apollo-server-testing'
import createServer from '../server'
-import Factory from '../factories'
+import Factory, { cleanDatabase } from '../db/factories'
import { gql } from '../helpers/jest'
import { getDriver, getNeode } from '../db/neo4j'
-const factory = Factory()
const instance = getNeode()
const driver = getDriver()
@@ -20,7 +19,7 @@ const userQuery = gql`
describe('authorization', () => {
beforeAll(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
const { server } = createServer({
context: () => ({
driver,
@@ -34,34 +33,54 @@ describe('authorization', () => {
describe('given two existing users', () => {
beforeEach(async () => {
;[owner, anotherRegularUser, administrator, moderator] = await Promise.all([
- factory.create('User', {
- email: 'owner@example.org',
- name: 'Owner',
- password: 'iamtheowner',
- }),
- factory.create('User', {
- email: 'another.regular.user@example.org',
- name: 'Another Regular User',
- password: 'else',
- }),
- factory.create('User', {
- email: 'admin@example.org',
- name: 'Admin',
- password: 'admin',
- role: 'admin',
- }),
- factory.create('User', {
- email: 'moderator@example.org',
- name: 'Moderator',
- password: 'moderator',
- role: 'moderator',
- }),
+ Factory.build(
+ 'user',
+ {
+ name: 'Owner',
+ },
+ {
+ email: 'owner@example.org',
+ password: 'iamtheowner',
+ },
+ ),
+ Factory.build(
+ 'user',
+ {
+ name: 'Another Regular User',
+ },
+ {
+ email: 'another.regular.user@example.org',
+ password: 'else',
+ },
+ ),
+ Factory.build(
+ 'user',
+ {
+ name: 'Admin',
+ role: 'admin',
+ },
+ {
+ email: 'admin@example.org',
+ password: 'admin',
+ },
+ ),
+ Factory.build(
+ 'user',
+ {
+ name: 'Moderator',
+ role: 'moderator',
+ },
+ {
+ email: 'moderator@example.org',
+ password: 'moderator',
+ },
+ ),
])
variables = {}
})
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('access email address', () => {
diff --git a/backend/src/middleware/slugifyMiddleware.spec.js b/backend/src/middleware/slugifyMiddleware.spec.js
index cf9f0941c..e522136d6 100644
--- a/backend/src/middleware/slugifyMiddleware.spec.js
+++ b/backend/src/middleware/slugifyMiddleware.spec.js
@@ -1,11 +1,9 @@
-import Factory from '../factories'
+import Factory, { cleanDatabase } from '../db/factories'
import { gql } from '../helpers/jest'
import { getNeode, getDriver } from '../db/neo4j'
import createServer from '../server'
import { createTestClient } from 'apollo-server-testing'
-const factory = Factory()
-
let mutate
let authenticatedUser
let variables
@@ -28,14 +26,18 @@ beforeAll(() => {
beforeEach(async () => {
variables = {}
- const admin = await factory.create('User', {
+ const admin = await Factory.build('user', {
role: 'admin',
})
- await factory.create('User', {
- email: 'someone@example.org',
- password: '1234',
- })
- await factory.create('Category', {
+ await Factory.build(
+ 'user',
+ {},
+ {
+ email: 'someone@example.org',
+ password: '1234',
+ },
+ )
+ await Factory.build('category', {
id: 'cat9',
name: 'Democracy & Politics',
icon: 'university',
@@ -44,7 +46,7 @@ beforeEach(async () => {
})
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('slugifyMiddleware', () => {
@@ -84,12 +86,17 @@ describe('slugifyMiddleware', () => {
describe('if slug exists', () => {
beforeEach(async () => {
- await factory.create('Post', {
- title: 'Pre-existing post',
- slug: 'pre-existing-post',
- content: 'as Someone else content',
- categoryIds,
- })
+ await Factory.build(
+ 'post',
+ {
+ title: 'Pre-existing post',
+ slug: 'pre-existing-post',
+ content: 'as Someone else content',
+ },
+ {
+ categoryIds,
+ },
+ )
})
it('chooses another slug', async () => {
@@ -190,7 +197,7 @@ describe('slugifyMiddleware', () => {
describe('given a user has signed up with their email address', () => {
beforeEach(async () => {
- await factory.create('EmailAddress', {
+ await Factory.build('emailAddress', {
email: '123@example.org',
nonce: '123456',
verifiedAt: null,
@@ -214,7 +221,7 @@ describe('slugifyMiddleware', () => {
describe('if slug exists', () => {
beforeEach(async () => {
- await factory.create('User', {
+ await Factory.build('user', {
name: 'I am a user',
slug: 'i-am-a-user',
})
diff --git a/backend/src/middleware/softDelete/softDeleteMiddleware.spec.js b/backend/src/middleware/softDelete/softDeleteMiddleware.spec.js
index 6e1735af2..de5626d14 100644
--- a/backend/src/middleware/softDelete/softDeleteMiddleware.spec.js
+++ b/backend/src/middleware/softDelete/softDeleteMiddleware.spec.js
@@ -1,10 +1,9 @@
-import Factory from '../../factories'
+import Factory, { cleanDatabase } from '../../db/factories'
import { gql } from '../../helpers/jest'
import { getNeode, getDriver } from '../../db/neo4j'
import createServer from '../../server'
import { createTestClient } from 'apollo-server-testing'
-const factory = Factory()
const neode = getNeode()
const driver = getDriver()
@@ -18,13 +17,18 @@ const action = () => {
beforeAll(async () => {
// For performance reasons we do this only once
const users = await Promise.all([
- factory.create('User', { id: 'u1', role: 'user' }),
- factory.create('User', {
- id: 'm1',
- role: 'moderator',
- password: '1234',
- }),
- factory.create('User', {
+ Factory.build('user', { id: 'u1', role: 'user' }),
+ Factory.build(
+ 'user',
+ {
+ id: 'm1',
+ role: 'moderator',
+ },
+ {
+ password: '1234',
+ },
+ ),
+ Factory.build('user', {
id: 'u2',
role: 'user',
name: 'Offensive Name',
@@ -45,48 +49,73 @@ beforeAll(async () => {
await Promise.all([
user.relateTo(troll, 'following'),
- factory.create('Post', {
- author: user,
- id: 'p1',
- title: 'Deleted post',
- slug: 'deleted-post',
- deleted: true,
- categoryIds,
- }),
- factory.create('Post', {
- author: user,
- id: 'p3',
- title: 'Publicly visible post',
- slug: 'publicly-visible-post',
- deleted: false,
- categoryIds,
- }),
+ Factory.build(
+ 'post',
+ {
+ id: 'p1',
+ title: 'Deleted post',
+ slug: 'deleted-post',
+ deleted: true,
+ },
+ {
+ author: user,
+ categoryIds,
+ },
+ ),
+ Factory.build(
+ 'post',
+ {
+ id: 'p3',
+ title: 'Publicly visible post',
+ slug: 'publicly-visible-post',
+ deleted: false,
+ },
+ {
+ author: user,
+ categoryIds,
+ },
+ ),
])
const resources = await Promise.all([
- factory.create('Comment', {
- author: user,
- id: 'c2',
- postId: 'p3',
- content: 'Enabled comment on public post',
- }),
- factory.create('Post', {
- id: 'p2',
- author: troll,
- title: 'Disabled post',
- content: 'This is an offensive post content',
- contentExcerpt: 'This is an offensive post content',
- image: '/some/offensive/image.jpg',
- deleted: false,
- categoryIds,
- }),
- factory.create('Comment', {
- id: 'c1',
- author: troll,
- postId: 'p3',
- content: 'Disabled comment',
- contentExcerpt: 'Disabled comment',
- }),
+ Factory.build(
+ 'comment',
+ {
+ id: 'c2',
+ content: 'Enabled comment on public post',
+ },
+ {
+ author: user,
+ postId: 'p3',
+ },
+ ),
+ Factory.build(
+ 'post',
+ {
+ id: 'p2',
+ title: 'Disabled post',
+ content: 'This is an offensive post content',
+ contentExcerpt: 'This is an offensive post content',
+ image: '/some/offensive/image.jpg',
+ deleted: false,
+ },
+ {
+ author: troll,
+ categoryIds,
+ },
+ ),
+ Factory.build(
+ 'comment',
+ {
+ id: 'c1',
+ content: 'Disabled comment',
+ contentExcerpt: 'Disabled comment',
+ },
+ {
+ author: troll,
+ postId: 'p3',
+ },
+ ),
])
const { server } = createServer({
@@ -105,9 +134,9 @@ beforeAll(async () => {
const trollingComment = resources[2]
const reports = await Promise.all([
- factory.create('Report'),
- factory.create('Report'),
- factory.create('Report'),
+ Factory.build('report'),
+ Factory.build('report'),
+ Factory.build('report'),
])
const reportAgainstTroll = reports[0]
const reportAgainstTrollingPost = reports[1]
@@ -154,7 +183,7 @@ beforeAll(async () => {
})
afterAll(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('softDeleteMiddleware', () => {
diff --git a/backend/src/middleware/validation/validationMiddleware.spec.js b/backend/src/middleware/validation/validationMiddleware.spec.js
index 38cd010b4..b2c669369 100644
--- a/backend/src/middleware/validation/validationMiddleware.spec.js
+++ b/backend/src/middleware/validation/validationMiddleware.spec.js
@@ -1,10 +1,9 @@
import { gql } from '../../helpers/jest'
-import Factory from '../../factories'
+import Factory, { cleanDatabase } from '../../db/factories'
import { getNeode, getDriver } from '../../db/neo4j'
import { createTestClient } from 'apollo-server-testing'
import createServer from '../../server'
-const factory = Factory()
const neode = getNeode()
const driver = getDriver()
let authenticatedUser,
@@ -94,14 +93,14 @@ beforeAll(() => {
beforeEach(async () => {
users = await Promise.all([
- factory.create('User', {
+ Factory.build('user', {
id: 'reporting-user',
}),
- factory.create('User', {
+ Factory.build('user', {
id: 'moderating-user',
role: 'moderator',
}),
- factory.create('User', {
+ Factory.build('user', {
id: 'commenting-user',
}),
])
@@ -119,20 +118,30 @@ beforeEach(async () => {
moderatingUser = users[1]
commentingUser = users[2]
const posts = await Promise.all([
- factory.create('Post', {
- id: 'offensive-post',
- authorId: 'moderating-user',
- }),
- factory.create('Post', {
- id: 'post-4-commenting',
- authorId: 'commenting-user',
- }),
+ Factory.build(
+ 'post',
+ {
+ id: 'offensive-post',
+ },
+ {
+ authorId: 'moderating-user',
+ },
+ ),
+ Factory.build(
+ 'post',
+ {
+ id: 'post-4-commenting',
+ },
+ {
+ authorId: 'commenting-user',
+ },
+ ),
])
offensivePost = posts[0]
})
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('validateCreateComment', () => {
@@ -182,10 +191,15 @@ describe('validateCreateComment', () => {
describe('validateUpdateComment', () => {
let updateCommentVariables
beforeEach(async () => {
- await factory.create('Comment', {
- id: 'comment-id',
- authorId: 'commenting-user',
- })
+ await Factory.build(
+ 'comment',
+ {
+ id: 'comment-id',
+ },
+ {
+ authorId: 'commenting-user',
+ },
+ )
updateCommentVariables = {
id: 'whatever',
content: '',
@@ -328,7 +342,7 @@ describe('validateReport', () => {
describe('validateReview', () => {
beforeEach(async () => {
- const reportAgainstModerator = await factory.create('Report')
+ const reportAgainstModerator = await Factory.build('report')
await Promise.all([
reportAgainstModerator.relateTo(reportingUser, 'filed', {
...reportVariables,
@@ -370,7 +384,7 @@ describe('validateReview', () => {
})
it('throws an error if a moderator tries to review their own resource(Post|Comment)', async () => {
- const reportAgainstOffensivePost = await factory.create('Report')
+ const reportAgainstOffensivePost = await Factory.build('report')
await Promise.all([
reportAgainstOffensivePost.relateTo(reportingUser, 'filed', {
...reportVariables,
@@ -389,7 +403,7 @@ describe('validateReview', () => {
describe('moderate a resource that is not a (Comment|Post|User) ', () => {
beforeEach(async () => {
- await Promise.all([factory.create('Tag', { id: 'tag-id' })])
+ await Promise.all([Factory.build('tag', { id: 'tag-id' })])
})
it('returns null', async () => {
@@ -419,7 +433,7 @@ describe('validateReview', () => {
id: 'updating-user',
name: 'John Doughnut',
}
- updatingUser = await factory.create('User', userParams)
+ updatingUser = await Factory.build('user', userParams)
authenticatedUser = await updatingUser.toJson()
})
diff --git a/backend/src/models/Post.js b/backend/src/models/Post.js
index 154456cf1..63a36d3a2 100644
--- a/backend/src/models/Post.js
+++ b/backend/src/models/Post.js
@@ -52,5 +52,4 @@ export default {
},
},
pinned: { type: 'boolean', default: null, valid: [null, true] },
- pinnedAt: { type: 'string', isoDate: true },
}
diff --git a/backend/src/models/User.spec.js b/backend/src/models/User.spec.js
index 7bdde7014..f448cbf08 100644
--- a/backend/src/models/User.spec.js
+++ b/backend/src/models/User.spec.js
@@ -1,11 +1,10 @@
-import Factory from '../factories'
+import { cleanDatabase } from '../db/factories'
import { getNeode } from '../db/neo4j'
-const factory = Factory()
const neode = getNeode()
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('role', () => {
diff --git a/backend/src/schema/resolvers/comments.spec.js b/backend/src/schema/resolvers/comments.spec.js
index 9877161db..9f633c8b0 100644
--- a/backend/src/schema/resolvers/comments.spec.js
+++ b/backend/src/schema/resolvers/comments.spec.js
@@ -1,4 +1,4 @@
-import Factory from '../../factories'
+import Factory, { cleanDatabase } from '../../db/factories'
import { gql } from '../../helpers/jest'
import { createTestClient } from 'apollo-server-testing'
import createServer from '../../server'
@@ -6,12 +6,11 @@ import { getNeode, getDriver } from '../../db/neo4j'
const driver = getDriver()
const neode = getNeode()
-const factory = Factory()
let variables, mutate, authenticatedUser, commentAuthor, newlyCreatedComment
beforeAll(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
const { server } = createServer({
context: () => {
return {
@@ -33,7 +32,7 @@ beforeEach(async () => {
})
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
const createCommentMutation = gql`
@@ -48,18 +47,28 @@ const createCommentMutation = gql`
}
`
const setupPostAndComment = async () => {
- commentAuthor = await factory.create('User')
- await factory.create('Post', {
- id: 'p1',
- content: 'Post to be commented',
- categoryIds: ['cat9'],
- })
- newlyCreatedComment = await factory.create('Comment', {
- id: 'c456',
- postId: 'p1',
- author: commentAuthor,
- content: 'Comment to be deleted',
- })
+ commentAuthor = await Factory.build('user')
+ await Factory.build(
+ 'post',
+ {
+ id: 'p1',
+ content: 'Post to be commented',
+ },
+ {
+ categoryIds: ['cat9'],
+ },
+ )
+ newlyCreatedComment = await Factory.build(
+ 'comment',
+ {
+ id: 'c456',
+ content: 'Comment to be deleted',
+ },
+ {
+ postId: 'p1',
+ author: commentAuthor,
+ },
+ )
variables = {
...variables,
id: 'c456',
@@ -88,7 +97,7 @@ describe('CreateComment', () => {
describe('given a post', () => {
beforeEach(async () => {
- await factory.create('Post', { categoryIds: ['cat9'], id: 'p1' })
+ await Factory.build('post', { id: 'p1' }, { categoryIds: ['cat9'] })
variables = {
...variables,
postId: 'p1',
@@ -141,7 +150,7 @@ describe('UpdateComment', () => {
describe('authenticated but not the author', () => {
beforeEach(async () => {
- const randomGuy = await factory.create('User')
+ const randomGuy = await Factory.build('user')
authenticatedUser = await randomGuy.toJson()
})
@@ -233,7 +242,7 @@ describe('DeleteComment', () => {
describe('authenticated but not the author', () => {
beforeEach(async () => {
- const randomGuy = await factory.create('User')
+ const randomGuy = await Factory.build('user')
authenticatedUser = await randomGuy.toJson()
})
diff --git a/backend/src/schema/resolvers/donations.spec.js b/backend/src/schema/resolvers/donations.spec.js
index c382eb475..ea5ee4e09 100644
--- a/backend/src/schema/resolvers/donations.spec.js
+++ b/backend/src/schema/resolvers/donations.spec.js
@@ -1,11 +1,10 @@
import { createTestClient } from 'apollo-server-testing'
-import Factory from '../../factories'
+import Factory, { cleanDatabase } from '../../db/factories'
import { gql } from '../../helpers/jest'
import { getNeode, getDriver } from '../../db/neo4j'
import createServer from '../../server'
let mutate, query, authenticatedUser, variables
-const factory = Factory()
const instance = getNeode()
const driver = getDriver()
@@ -33,7 +32,7 @@ const donationsQuery = gql`
describe('donations', () => {
let currentUser, newlyCreatedDonations
beforeAll(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
authenticatedUser = undefined
const { server } = createServer({
context: () => {
@@ -50,11 +49,11 @@ describe('donations', () => {
beforeEach(async () => {
variables = {}
- newlyCreatedDonations = await factory.create('Donations')
+ newlyCreatedDonations = await Factory.build('donations')
})
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('query for donations', () => {
@@ -68,7 +67,7 @@ describe('donations', () => {
describe('authenticated', () => {
beforeEach(async () => {
- currentUser = await factory.create('User', {
+ currentUser = await Factory.build('user', {
id: 'normal-user',
role: 'user',
})
@@ -102,7 +101,7 @@ describe('donations', () => {
describe('authenticated', () => {
describe('as a normal user', () => {
beforeEach(async () => {
- currentUser = await factory.create('User', {
+ currentUser = await Factory.build('user', {
id: 'normal-user',
role: 'user',
})
@@ -121,7 +120,7 @@ describe('donations', () => {
describe('as a moderator', () => {
beforeEach(async () => {
- currentUser = await factory.create('User', {
+ currentUser = await Factory.build('user', {
id: 'moderator',
role: 'moderator',
})
@@ -140,7 +139,7 @@ describe('donations', () => {
describe('as an admin', () => {
beforeEach(async () => {
- currentUser = await factory.create('User', {
+ currentUser = await Factory.build('user', {
id: 'admin',
role: 'admin',
})
diff --git a/backend/src/schema/resolvers/emails.spec.js b/backend/src/schema/resolvers/emails.spec.js
index 97a1f0c29..94e7ede31 100644
--- a/backend/src/schema/resolvers/emails.spec.js
+++ b/backend/src/schema/resolvers/emails.spec.js
@@ -1,10 +1,9 @@
-import Factory from '../../factories'
+import Factory, { cleanDatabase } from '../../db/factories'
import { gql } from '../../helpers/jest'
import { getDriver, getNeode } from '../../db/neo4j'
import createServer from '../../server'
import { createTestClient } from 'apollo-server-testing'
-const factory = Factory()
const neode = getNeode()
let mutate
@@ -31,7 +30,7 @@ beforeAll(() => {
})
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('AddEmailAddress', () => {
@@ -63,7 +62,7 @@ describe('AddEmailAddress', () => {
describe('authenticated', () => {
beforeEach(async () => {
- user = await factory.create('User', { id: '567', email: 'user@example.org' })
+ user = await Factory.build('user', { id: '567' }, { email: 'user@example.org' })
authenticatedUser = await user.toJson()
})
@@ -110,7 +109,7 @@ describe('AddEmailAddress', () => {
describe('if another `UnverifiedEmailAddress` node already exists with that email', () => {
it('throws no unique constraint violation error', async () => {
- await factory.create('UnverifiedEmailAddress', {
+ await Factory.build('unverifiedEmailAddress', {
createdAt: '2019-09-24T14:00:01.565Z',
email: 'new-email@example.org',
})
@@ -128,7 +127,7 @@ describe('AddEmailAddress', () => {
describe('but if another user owns an `EmailAddress` already with that email', () => {
it('throws UserInputError because of unique constraints', async () => {
- await factory.create('User', { email: 'new-email@example.org' })
+ await Factory.build('user', {}, { email: 'new-email@example.org' })
await expect(mutate({ mutation, variables })).resolves.toMatchObject({
data: { AddEmailAddress: null },
errors: [{ message: 'A user account with this email already exists.' }],
@@ -169,7 +168,7 @@ describe('VerifyEmailAddress', () => {
describe('authenticated', () => {
beforeEach(async () => {
- user = await factory.create('User', { id: '567', email: 'user@example.org' })
+ user = await Factory.build('user', { id: '567' }, { email: 'user@example.org' })
authenticatedUser = await user.toJson()
})
@@ -185,7 +184,7 @@ describe('VerifyEmailAddress', () => {
describe('given a `UnverifiedEmailAddress`', () => {
let emailAddress
beforeEach(async () => {
- emailAddress = await factory.create('UnverifiedEmailAddress', {
+ emailAddress = await Factory.build('unverifiedEmailAddress', {
nonce: 'abcdef',
verifiedAt: null,
createdAt: new Date().toISOString(),
@@ -281,7 +280,7 @@ describe('VerifyEmailAddress', () => {
describe('Edge case: In the meantime someone created an `EmailAddress` node with the given email', () => {
beforeEach(async () => {
- await factory.create('EmailAddress', { email: 'to-be-verified@example.org' })
+ await Factory.build('emailAddress', { email: 'to-be-verified@example.org' })
})
it('throws UserInputError because of unique constraints', async () => {
diff --git a/backend/src/schema/resolvers/fileUpload/index.js b/backend/src/schema/resolvers/fileUpload/index.js
index 960dde7f9..df0145057 100644
--- a/backend/src/schema/resolvers/fileUpload/index.js
+++ b/backend/src/schema/resolvers/fileUpload/index.js
@@ -1,24 +1,27 @@
import { createWriteStream } from 'fs'
import path from 'path'
import slug from 'slug'
+import uuid from 'uuid/v4'
-const storeUpload = ({ createReadStream, fileLocation }) =>
- new Promise((resolve, reject) =>
+const localFileUpload = async ({ createReadStream, uniqueFilename }) => {
+ await new Promise((resolve, reject) =>
createReadStream()
- .pipe(createWriteStream(`public${fileLocation}`))
+ .pipe(createWriteStream(`public${uniqueFilename}`))
.on('finish', resolve)
.on('error', reject),
)
+ return uniqueFilename
+}
-export default async function fileUpload(params, { file, url }, uploadCallback = storeUpload) {
+export default async function fileUpload(params, { file, url }, uploadCallback = localFileUpload) {
const upload = params[file]
if (upload) {
const { createReadStream, filename } = await upload
- const { name } = path.parse(filename)
- const fileLocation = `/uploads/${Date.now()}-${slug(name)}`
- await uploadCallback({ createReadStream, fileLocation })
+ const { name, ext } = path.parse(filename)
+ const uniqueFilename = `/uploads/${uuid()}-${slug(name)}${ext}`
+ const location = await uploadCallback({ createReadStream, uniqueFilename })
delete params[file]
- params[url] = fileLocation
+ params[url] = location
}
return params
diff --git a/backend/src/schema/resolvers/fileUpload/spec.js b/backend/src/schema/resolvers/fileUpload/spec.js
index 5767d6457..fee0bf81b 100644
--- a/backend/src/schema/resolvers/fileUpload/spec.js
+++ b/backend/src/schema/resolvers/fileUpload/spec.js
@@ -1,5 +1,7 @@
import fileUpload from '.'
+const uuid = '[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}'
+
describe('fileUpload', () => {
let params
let uploadCallback
@@ -13,7 +15,7 @@ describe('fileUpload', () => {
createReadStream: jest.fn(),
},
}
- uploadCallback = jest.fn()
+ uploadCallback = jest.fn(({ uniqueFilename }) => uniqueFilename)
})
it('calls uploadCallback', async () => {
@@ -24,20 +26,13 @@ describe('fileUpload', () => {
describe('file name', () => {
it('saves the upload url in params[url]', async () => {
await fileUpload(params, { file: 'uploadAttribute', url: 'attribute' }, uploadCallback)
- expect(params.attribute).toMatch(/^\/uploads\/\d+-avatar$/)
- })
-
- it('uses the name without file ending', async () => {
- params.uploadAttribute.filename = 'somePng.png'
- await fileUpload(params, { file: 'uploadAttribute', url: 'attribute' }, uploadCallback)
- expect(params.attribute).toMatch(/^\/uploads\/\d+-somePng/)
+ expect(params.attribute).toMatch(new RegExp(`^/uploads/${uuid}-avatar.jpg`))
})
it('creates a url safe name', async () => {
- params.uploadAttribute.filename =
- '/path/to/awkward?/ file-location/?foo- bar-avatar.jpg?foo- bar'
+ params.uploadAttribute.filename = '/path/to/awkward?/ file-location/?foo- bar-avatar.jpg'
await fileUpload(params, { file: 'uploadAttribute', url: 'attribute' }, uploadCallback)
- expect(params.attribute).toMatch(/^\/uploads\/\d+-foo-bar-avatar$/)
+ expect(params.attribute).toMatch(new RegExp(`/uploads/${uuid}-foo-bar-avatar.jpg$`))
})
describe('in case of duplicates', () => {
@@ -50,7 +45,6 @@ describe('fileUpload', () => {
uploadCallback,
)
- await new Promise(resolve => setTimeout(resolve, 1000))
const { attribute: second } = await fileUpload(
{
...params,
diff --git a/backend/src/schema/resolvers/follow.spec.js b/backend/src/schema/resolvers/follow.spec.js
index ad836a461..953a26d65 100644
--- a/backend/src/schema/resolvers/follow.spec.js
+++ b/backend/src/schema/resolvers/follow.spec.js
@@ -1,10 +1,9 @@
import { createTestClient } from 'apollo-server-testing'
-import Factory from '../../factories'
+import Factory, { cleanDatabase } from '../../db/factories'
import { getDriver, getNeode } from '../../db/neo4j'
import createServer from '../../server'
import { gql } from '../../helpers/jest'
-const factory = Factory()
const driver = getDriver()
const neode = getNeode()
@@ -54,7 +53,7 @@ const userQuery = gql`
`
beforeAll(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
const { server } = createServer({
context: () => ({
driver,
@@ -72,29 +71,35 @@ beforeAll(async () => {
})
beforeEach(async () => {
- user1 = await factory
- .create('User', {
+ user1 = await Factory.build(
+ 'user',
+ {
id: 'u1',
name: 'user1',
+ },
+ {
email: 'test@example.org',
password: '1234',
- })
- .then(user => user.toJson())
- user2 = await factory
- .create('User', {
+ },
+ ).then(user => user.toJson())
+ user2 = await Factory.build(
+ 'user',
+ {
id: 'u2',
name: 'user2',
+ },
+ {
email: 'test2@example.org',
password: '1234',
- })
- .then(user => user.toJson())
+ },
+ ).then(user => user.toJson())
authenticatedUser = user1
variables = { id: user2.id }
})
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('follow', () => {
diff --git a/backend/src/schema/resolvers/locations.spec.js b/backend/src/schema/resolvers/locations.spec.js
index aba11f9bc..34d0f2e9d 100644
--- a/backend/src/schema/resolvers/locations.spec.js
+++ b/backend/src/schema/resolvers/locations.spec.js
@@ -1,11 +1,9 @@
-import Factory from '../../factories'
+import Factory, { cleanDatabase } from '../../db/factories'
import { gql } from '../../helpers/jest'
import { getNeode, getDriver } from '../../db/neo4j'
import createServer from '../../server'
import { createTestClient } from 'apollo-server-testing'
-const factory = Factory()
-
let mutate, authenticatedUser
const driver = getDriver()
@@ -25,7 +23,7 @@ beforeAll(() => {
})
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('resolvers', () => {
@@ -49,16 +47,16 @@ describe('resolvers', () => {
id: 'u47',
name: 'John Doughnut',
}
- const Paris = await factory.create('Location', {
+ const Paris = await Factory.build('location', {
id: 'region.9397217726497330',
name: 'Paris',
type: 'region',
- lat: 2.35183,
- lng: 48.85658,
+ lng: 2.35183,
+ lat: 48.85658,
nameEN: 'Paris',
})
- const user = await factory.create('User', {
+ const user = await Factory.build('user', {
id: 'u47',
name: 'John Doe',
})
diff --git a/backend/src/schema/resolvers/moderation.spec.js b/backend/src/schema/resolvers/moderation.spec.js
index cd502be75..b62d35ee8 100644
--- a/backend/src/schema/resolvers/moderation.spec.js
+++ b/backend/src/schema/resolvers/moderation.spec.js
@@ -1,10 +1,9 @@
import { createTestClient } from 'apollo-server-testing'
-import Factory from '../../factories'
+import Factory, { cleanDatabase } from '../../db/factories'
import { gql } from '../../helpers/jest'
import { getNeode, getDriver } from '../../db/neo4j'
import createServer from '../../server'
-const factory = Factory()
const neode = getNeode()
const driver = getDriver()
@@ -54,7 +53,7 @@ const reviewMutation = gql`
describe('moderate resources', () => {
beforeAll(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
authenticatedUser = undefined
const { server } = createServer({
context: () => {
@@ -80,23 +79,33 @@ describe('moderate resources', () => {
closed: false,
}
authenticatedUser = null
- moderator = await factory.create('User', {
- id: 'moderator-id',
- name: 'Moderator',
- email: 'moderator@example.org',
- password: '1234',
- role: 'moderator',
- })
- nonModerator = await factory.create('User', {
- id: 'non-moderator',
- name: 'Non Moderator',
- email: 'non.moderator@example.org',
- password: '1234',
- })
+ moderator = await Factory.build(
+ 'user',
+ {
+ id: 'moderator-id',
+ name: 'Moderator',
+ role: 'moderator',
+ },
+ {
+ email: 'moderator@example.org',
+ password: '1234',
+ },
+ )
+ nonModerator = await Factory.build(
+ 'user',
+ {
+ id: 'non-moderator',
+ name: 'Non Moderator',
+ },
+ {
+ email: 'non.moderator@example.org',
+ password: '1234',
+ },
+ )
})
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('review to close report, leaving resource enabled', () => {
@@ -127,10 +136,10 @@ describe('moderate resources', () => {
describe('moderator', () => {
beforeEach(async () => {
authenticatedUser = await moderator.toJson()
- const questionablePost = await factory.create('Post', {
+ const questionablePost = await Factory.build('post', {
id: 'should-i-be-disabled',
})
- const reportAgainstQuestionablePost = await factory.create('Report')
+ const reportAgainstQuestionablePost = await Factory.build('report')
await Promise.all([
reportAgainstQuestionablePost.relateTo(nonModerator, 'filed', {
resourceId: 'should-i-be-disabled',
@@ -229,10 +238,10 @@ describe('moderate resources', () => {
describe('moderate a comment', () => {
beforeEach(async () => {
- const trollingComment = await factory.create('Comment', {
+ const trollingComment = await Factory.build('comment', {
id: 'comment-id',
})
- const reportAgainstTrollingComment = await factory.create('Report')
+ const reportAgainstTrollingComment = await Factory.build('report')
await Promise.all([
reportAgainstTrollingComment.relateTo(nonModerator, 'filed', {
resourceId: 'comment-id',
@@ -307,10 +316,10 @@ describe('moderate resources', () => {
describe('moderate a post', () => {
beforeEach(async () => {
- const trollingPost = await factory.create('Post', {
+ const trollingPost = await Factory.build('post', {
id: 'post-id',
})
- const reportAgainstTrollingPost = await factory.create('Report')
+ const reportAgainstTrollingPost = await Factory.build('report')
await Promise.all([
reportAgainstTrollingPost.relateTo(nonModerator, 'filed', {
resourceId: 'post-id',
@@ -387,10 +396,10 @@ describe('moderate resources', () => {
describe('moderate a user', () => {
beforeEach(async () => {
- const troll = await factory.create('User', {
+ const troll = await Factory.build('user', {
id: 'user-id',
})
- const reportAgainstTroll = await factory.create('Report')
+ const reportAgainstTroll = await Factory.build('report')
await Promise.all([
reportAgainstTroll.relateTo(nonModerator, 'filed', {
resourceId: 'user-id',
@@ -504,10 +513,10 @@ describe('moderate resources', () => {
describe('moderate a comment', () => {
beforeEach(async () => {
- const trollingComment = await factory.create('Comment', {
+ const trollingComment = await Factory.build('comment', {
id: 'comment-id',
})
- const reportAgainstTrollingComment = await factory.create('Report')
+ const reportAgainstTrollingComment = await Factory.build('report')
await Promise.all([
reportAgainstTrollingComment.relateTo(nonModerator, 'filed', {
resourceId: 'comment-id',
@@ -568,10 +577,10 @@ describe('moderate resources', () => {
describe('moderate a post', () => {
beforeEach(async () => {
- const trollingPost = await factory.create('Post', {
+ const trollingPost = await Factory.build('post', {
id: 'post-id',
})
- const reportAgainstTrollingPost = await factory.create('Report')
+ const reportAgainstTrollingPost = await Factory.build('report')
await Promise.all([
reportAgainstTrollingPost.relateTo(nonModerator, 'filed', {
resourceId: 'post-id',
@@ -633,10 +642,10 @@ describe('moderate resources', () => {
describe('moderate a user', () => {
beforeEach(async () => {
- const troll = await factory.create('User', {
+ const troll = await Factory.build('user', {
id: 'user-id',
})
- const reportAgainstTroll = await factory.create('Report')
+ const reportAgainstTroll = await Factory.build('report')
await Promise.all([
reportAgainstTroll.relateTo(nonModerator, 'filed', {
resourceId: 'user-id',
diff --git a/backend/src/schema/resolvers/notifications.js b/backend/src/schema/resolvers/notifications.js
index 31369a8c7..cf35fa8a1 100644
--- a/backend/src/schema/resolvers/notifications.js
+++ b/backend/src/schema/resolvers/notifications.js
@@ -1,21 +1,18 @@
import log from './helpers/databaseLogger'
-
-const resourceTypes = ['Post', 'Comment']
-
-const transformReturnType = record => {
- return {
- ...record.get('notification').properties,
- from: {
- __typename: record.get('resource').labels.find(l => resourceTypes.includes(l)),
- ...record.get('resource').properties,
- },
- to: {
- ...record.get('user').properties,
- },
- }
-}
+import { withFilter } from 'graphql-subscriptions'
+import { pubsub, NOTIFICATION_ADDED } from '../../server'
export default {
+ Subscription: {
+ notificationAdded: {
+ subscribe: withFilter(
+ () => pubsub.asyncIterator(NOTIFICATION_ADDED),
+ (payload, variables) => {
+ return payload.notificationAdded.to.id === variables.userId
+ },
+ ),
+ },
+ },
Query: {
notifications: async (_parent, args, context, _resolveInfo) => {
const { user: currentUser } = context
@@ -51,10 +48,10 @@ export default {
MATCH (resource {deleted: false, disabled: false})-[notification:NOTIFIED]->(user:User {id:$id})
${whereClause}
WITH user, notification, resource,
- [(resource)<-[:WROTE]-(author:User) | author {.*}] as authors,
- [(resource)-[:COMMENTS]->(post:Post)<-[:WROTE]-(author:User) | post{.*, author: properties(author)} ] as posts
+ [(resource)<-[:WROTE]-(author:User) | author {.*}] AS authors,
+ [(resource)-[:COMMENTS]->(post:Post)<-[:WROTE]-(author:User) | post{.*, author: properties(author)} ] AS posts
WITH resource, user, notification, authors, posts,
- resource {.*, __typename: labels(resource)[0], author: authors[0], post: posts[0]} as finalResource
+ resource {.*, __typename: labels(resource)[0], author: authors[0], post: posts[0]} AS finalResource
RETURN notification {.*, from: finalResource, to: properties(user)}
${orderByClause}
${offset} ${limit}
@@ -81,12 +78,19 @@ export default {
`
MATCH (resource {id: $resourceId})-[notification:NOTIFIED {read: FALSE}]->(user:User {id:$id})
SET notification.read = TRUE
- RETURN resource, notification, user
+ WITH user, notification, resource,
+ [(resource)<-[:WROTE]-(author:User) | author {.*}] AS authors,
+ [(resource)-[:COMMENTS]->(post:Post)<-[:WROTE]-(author:User) | post{.*, author: properties(author)} ] AS posts
+ WITH resource, user, notification, authors, posts,
+ resource {.*, __typename: labels(resource)[0], author: authors[0], post: posts[0]} AS finalResource
+ RETURN notification {.*, from: finalResource, to: properties(user)}
`,
{ resourceId: args.id, id: currentUser.id },
)
log(markNotificationAsReadTransactionResponse)
- return markNotificationAsReadTransactionResponse.records.map(transformReturnType)
+ return markNotificationAsReadTransactionResponse.records.map(record =>
+ record.get('notification'),
+ )
})
try {
const [notifications] = await writeTxResultPromise
diff --git a/backend/src/schema/resolvers/notifications.spec.js b/backend/src/schema/resolvers/notifications.spec.js
index a5c46e930..9d7795dd4 100644
--- a/backend/src/schema/resolvers/notifications.spec.js
+++ b/backend/src/schema/resolvers/notifications.spec.js
@@ -1,10 +1,9 @@
-import Factory from '../../factories'
+import Factory, { cleanDatabase } from '../../db/factories'
import { gql } from '../../helpers/jest'
import { getDriver } from '../../db/neo4j'
import { createTestClient } from 'apollo-server-testing'
import createServer from '../.././server'
-const factory = Factory()
const driver = getDriver()
let authenticatedUser
let user
@@ -32,52 +31,77 @@ beforeEach(async () => {
})
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('given some notifications', () => {
beforeEach(async () => {
const categoryIds = ['cat1']
- author = await factory.create('User', { id: 'author' })
- user = await factory.create('User', { id: 'you' })
+ author = await Factory.build('user', { id: 'author' })
+ user = await Factory.build('user', { id: 'you' })
const [neighbor] = await Promise.all([
- factory.create('User', { id: 'neighbor' }),
- factory.create('Category', { id: 'cat1' }),
+ Factory.build('user', { id: 'neighbor' }),
+ Factory.build('category', { id: 'cat1' }),
])
const [post1, post2, post3] = await Promise.all([
- factory.create('Post', { author, id: 'p1', categoryIds, content: 'Not for you' }),
- factory.create('Post', {
- author,
- id: 'p2',
- categoryIds,
- content: 'Already seen post mention',
- }),
- factory.create('Post', {
- author,
- id: 'p3',
- categoryIds,
- content: 'You have been mentioned in a post',
- }),
+ Factory.build('post', { id: 'p1', content: 'Not for you' }, { author, categoryIds }),
+ Factory.build(
+ 'post',
+ {
+ id: 'p2',
+ content: 'Already seen post mention',
+ },
+ {
+ author,
+ categoryIds,
+ },
+ ),
+ Factory.build(
+ 'post',
+ {
+ id: 'p3',
+ content: 'You have been mentioned in a post',
+ },
+ {
+ author,
+ categoryIds,
+ },
+ ),
])
const [comment1, comment2, comment3] = await Promise.all([
- factory.create('Comment', {
- author,
- postId: 'p3',
- id: 'c1',
- content: 'You have seen this comment mentioning already',
- }),
- factory.create('Comment', {
- author,
- postId: 'p3',
- id: 'c2',
- content: 'You have been mentioned in a comment',
- }),
- factory.create('Comment', {
- author,
- postId: 'p3',
- id: 'c3',
- content: 'Somebody else was mentioned in a comment',
- }),
+ Factory.build(
+ 'comment',
+ {
+ id: 'c1',
+ content: 'You have seen this comment mentioning already',
+ },
+ {
+ author,
+ postId: 'p3',
+ },
+ ),
+ Factory.build(
+ 'comment',
+ {
+ id: 'c2',
+ content: 'You have been mentioned in a comment',
+ },
+ {
+ author,
+ postId: 'p3',
+ },
+ ),
+ Factory.build(
+ 'comment',
+ {
+ id: 'c3',
+ content: 'Somebody else was mentioned in a comment',
+ },
+ {
+ author,
+ postId: 'p3',
+ },
+ ),
])
await Promise.all([
post1.relateTo(neighbor, 'notified', {
diff --git a/backend/src/schema/resolvers/passwordReset.spec.js b/backend/src/schema/resolvers/passwordReset.spec.js
index d7b3a0157..b48498ee7 100644
--- a/backend/src/schema/resolvers/passwordReset.spec.js
+++ b/backend/src/schema/resolvers/passwordReset.spec.js
@@ -1,4 +1,4 @@
-import Factory from '../../factories'
+import Factory, { cleanDatabase } from '../../db/factories'
import { gql } from '../../helpers/jest'
import { getNeode, getDriver } from '../../db/neo4j'
import createPasswordReset from './helpers/createPasswordReset'
@@ -7,7 +7,6 @@ import { createTestClient } from 'apollo-server-testing'
const neode = getNeode()
const driver = getDriver()
-const factory = Factory()
let mutate
let authenticatedUser
@@ -39,15 +38,19 @@ beforeAll(() => {
})
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('passwordReset', () => {
describe('given a user', () => {
beforeEach(async () => {
- await factory.create('User', {
- email: 'user@example.org',
- })
+ await Factory.build(
+ 'user',
+ {},
+ {
+ email: 'user@example.org',
+ },
+ )
})
describe('requestPasswordReset', () => {
@@ -123,11 +126,16 @@ describe('resetPassword', () => {
describe('given a user', () => {
beforeEach(async () => {
- await factory.create('User', {
- email: 'user@example.org',
- role: 'user',
- password: '1234',
- })
+ await Factory.build(
+ 'user',
+ {
+ role: 'user',
+ },
+ {
+ email: 'user@example.org',
+ password: '1234',
+ },
+ )
})
describe('invalid email', () => {
diff --git a/backend/src/schema/resolvers/posts.spec.js b/backend/src/schema/resolvers/posts.spec.js
index 56a47afa7..88a09843d 100644
--- a/backend/src/schema/resolvers/posts.spec.js
+++ b/backend/src/schema/resolvers/posts.spec.js
@@ -1,11 +1,10 @@
import { createTestClient } from 'apollo-server-testing'
-import Factory from '../../factories'
+import Factory, { cleanDatabase } from '../../db/factories'
import { gql } from '../../helpers/jest'
import { getNeode, getDriver } from '../../db/neo4j'
import createServer from '../../server'
const driver = getDriver()
-const factory = Factory()
const neode = getNeode()
let query
@@ -40,7 +39,7 @@ const createPostMutation = gql`
`
beforeAll(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
const { server } = createServer({
context: () => {
return {
@@ -56,12 +55,17 @@ beforeAll(async () => {
beforeEach(async () => {
variables = {}
- user = await factory.create('User', {
- id: 'current-user',
- name: 'TestUser',
- email: 'test@example.org',
- password: '1234',
- })
+ user = await Factory.build(
+ 'user',
+ {
+ id: 'current-user',
+ name: 'TestUser',
+ },
+ {
+ email: 'test@example.org',
+ password: '1234',
+ },
+ )
await Promise.all([
neode.create('Category', {
id: 'cat9',
@@ -88,7 +92,7 @@ beforeEach(async () => {
})
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('Post', () => {
@@ -96,21 +100,31 @@ describe('Post', () => {
let followedUser, happyPost, cryPost
beforeEach(async () => {
;[followedUser] = await Promise.all([
- factory.create('User', {
- id: 'followed-by-me',
- email: 'followed@example.org',
- name: 'Followed User',
- password: '1234',
- }),
+ Factory.build(
+ 'user',
+ {
+ id: 'followed-by-me',
+ name: 'Followed User',
+ },
+ {
+ email: 'followed@example.org',
+ password: '1234',
+ },
+ ),
])
;[happyPost, cryPost] = await Promise.all([
- factory.create('Post', { id: 'happy-post', categoryIds: ['cat4'] }),
- factory.create('Post', { id: 'cry-post', categoryIds: ['cat15'] }),
- factory.create('Post', {
- id: 'post-by-followed-user',
- categoryIds: ['cat9'],
- author: followedUser,
- }),
+ Factory.build('post', { id: 'happy-post' }, { categoryIds: ['cat4'] }),
+ Factory.build('post', { id: 'cry-post' }, { categoryIds: ['cat15'] }),
+ Factory.build(
+ 'post',
+ {
+ id: 'post-by-followed-user',
+ },
+ {
+ categoryIds: ['cat9'],
+ author: followedUser,
+ },
+ ),
])
})
@@ -340,14 +354,19 @@ describe('UpdatePost', () => {
}
`
beforeEach(async () => {
- author = await factory.create('User', { slug: 'the-author' })
- newlyCreatedPost = await factory.create('Post', {
- author,
- id: 'p9876',
- title: 'Old title',
- content: 'Old content',
- categoryIds,
- })
+ author = await Factory.build('user', { slug: 'the-author' })
+ newlyCreatedPost = await Factory.build(
+ 'post',
+ {
+ id: 'p9876',
+ title: 'Old title',
+ content: 'Old content',
+ },
+ {
+ author,
+ categoryIds,
+ },
+ )
variables = {
id: 'p9876',
@@ -529,10 +548,15 @@ describe('UpdatePost', () => {
describe('are allowed to pin posts', () => {
beforeEach(async () => {
- await factory.create('Post', {
- id: 'created-and-pinned-by-same-admin',
- author: admin,
- })
+ await Factory.build(
+ 'post',
+ {
+ id: 'created-and-pinned-by-same-admin',
+ },
+ {
+ author: admin,
+ },
+ )
variables = { ...variables, id: 'created-and-pinned-by-same-admin' }
})
@@ -589,15 +613,20 @@ describe('UpdatePost', () => {
describe('post created by another admin', () => {
let otherAdmin
beforeEach(async () => {
- otherAdmin = await factory.create('User', {
+ otherAdmin = await Factory.build('user', {
role: 'admin',
name: 'otherAdmin',
})
authenticatedUser = await otherAdmin.toJson()
- await factory.create('Post', {
- id: 'created-by-one-admin-pinned-by-different-one',
- author: otherAdmin,
- })
+ await Factory.build(
+ 'post',
+ {
+ id: 'created-by-one-admin-pinned-by-different-one',
+ },
+ {
+ author: otherAdmin,
+ },
+ )
})
it('responds with the updated Post', async () => {
@@ -654,10 +683,15 @@ describe('UpdatePost', () => {
describe('pinned post already exists', () => {
let pinnedPost
beforeEach(async () => {
- await factory.create('Post', {
- id: 'only-pinned-post',
- author: admin,
- })
+ await Factory.build(
+ 'post',
+ {
+ id: 'only-pinned-post',
+ },
+ {
+ author: admin,
+ },
+ )
await mutate({ mutation: pinPostMutation, variables })
})
@@ -683,12 +717,12 @@ describe('UpdatePost', () => {
describe('PostOrdering', () => {
beforeEach(async () => {
- await factory.create('Post', {
+ await Factory.build('post', {
id: 'im-a-pinned-post',
createdAt: '2019-11-22T17:26:29.070Z',
pinned: true,
})
- await factory.create('Post', {
+ await Factory.build('post', {
id: 'i-was-created-before-pinned-post',
// fairly old, so this should be 3rd
createdAt: '2019-10-22T17:26:29.070Z',
@@ -807,7 +841,7 @@ describe('UpdatePost', () => {
describe('admin can unpin posts', () => {
let admin, pinnedPost
beforeEach(async () => {
- pinnedPost = await factory.create('Post', { id: 'post-to-be-unpinned' })
+ pinnedPost = await Factory.build('post', { id: 'post-to-be-unpinned' })
admin = await user.update({
role: 'admin',
name: 'Admin',
@@ -874,15 +908,20 @@ describe('DeletePost', () => {
`
beforeEach(async () => {
- author = await factory.create('User')
- await factory.create('Post', {
- id: 'p4711',
- author,
- title: 'I will be deleted',
- content: 'To be deleted',
- image: 'path/to/some/image',
- categoryIds,
- })
+ author = await Factory.build('user')
+ await Factory.build(
+ 'post',
+ {
+ id: 'p4711',
+ title: 'I will be deleted',
+ content: 'To be deleted',
+ image: 'path/to/some/image',
+ },
+ {
+ author,
+ categoryIds,
+ },
+ )
variables = { ...variables, id: 'p4711' }
})
@@ -929,11 +968,16 @@ describe('DeletePost', () => {
describe('if there are comments on the post', () => {
beforeEach(async () => {
- await factory.create('Comment', {
- postId: 'p4711',
- content: 'to be deleted comment content',
- contentExcerpt: 'to be deleted comment content',
- })
+ await Factory.build(
+ 'comment',
+ {
+ content: 'to be deleted comment content',
+ contentExcerpt: 'to be deleted comment content',
+ },
+ {
+ postId: 'p4711',
+ },
+ )
})
it('marks the comments as deleted', async () => {
@@ -988,11 +1032,16 @@ describe('emotions', () => {
beforeEach(async () => {
author = await neode.create('User', { id: 'u257' })
- postToEmote = await factory.create('Post', {
- author,
- id: 'p1376',
- categoryIds,
- })
+ postToEmote = await Factory.build(
+ 'post',
+ {
+ id: 'p1376',
+ },
+ {
+ author,
+ categoryIds,
+ },
+ )
variables = {
...variables,
diff --git a/backend/src/schema/resolvers/registration.spec.js b/backend/src/schema/resolvers/registration.spec.js
index 23b1f9d2a..63dc35519 100644
--- a/backend/src/schema/resolvers/registration.spec.js
+++ b/backend/src/schema/resolvers/registration.spec.js
@@ -1,10 +1,9 @@
-import Factory from '../../factories'
+import Factory, { cleanDatabase } from '../../db/factories'
import { gql } from '../../helpers/jest'
import { getDriver, getNeode } from '../../db/neo4j'
import createServer from '../../server'
import { createTestClient } from 'apollo-server-testing'
-const factory = Factory()
const neode = getNeode()
let mutate
@@ -30,7 +29,7 @@ beforeAll(() => {
})
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('Signup', () => {
@@ -58,11 +57,16 @@ describe('Signup', () => {
describe('as admin', () => {
beforeEach(async () => {
- const admin = await factory.create('User', {
- role: 'admin',
- email: 'admin@example.org',
- password: '1234',
- })
+ const admin = await Factory.build(
+ 'user',
+ {
+ role: 'admin',
+ },
+ {
+ email: 'admin@example.org',
+ password: '1234',
+ },
+ )
authenticatedUser = await admin.toJson()
})
@@ -90,9 +94,9 @@ describe('Signup', () => {
})
describe('if the email already exists', () => {
- let email
+ let emailAddress
beforeEach(async () => {
- email = await factory.create('EmailAddress', {
+ emailAddress = await Factory.build('emailAddress', {
email: 'someuser@example.org',
verifiedAt: null,
})
@@ -100,7 +104,8 @@ describe('Signup', () => {
describe('and the user has registered already', () => {
beforeEach(async () => {
- await factory.create('User', { email })
+ const user = await Factory.build('userWithoutEmailAddress')
+ await emailAddress.relateTo(user, 'belongsTo')
})
it('throws UserInputError error because of unique constraint violation', async () => {
diff --git a/backend/src/schema/resolvers/reports.spec.js b/backend/src/schema/resolvers/reports.spec.js
index 7f827b111..0e690c19e 100644
--- a/backend/src/schema/resolvers/reports.spec.js
+++ b/backend/src/schema/resolvers/reports.spec.js
@@ -1,10 +1,9 @@
import { createTestClient } from 'apollo-server-testing'
import createServer from '../.././server'
-import Factory from '../../factories'
+import Factory, { cleanDatabase } from '../../db/factories'
import { gql } from '../../helpers/jest'
import { getDriver, getNeode } from '../../db/neo4j'
-const factory = Factory()
const instance = getNeode()
const driver = getDriver()
@@ -53,7 +52,7 @@ describe('file a report on a resource', () => {
}
beforeAll(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
const { server } = createServer({
context: () => {
return {
@@ -68,7 +67,7 @@ describe('file a report on a resource', () => {
})
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('report a resource', () => {
@@ -84,24 +83,39 @@ describe('file a report on a resource', () => {
describe('authenticated', () => {
beforeEach(async () => {
- currentUser = await factory.create('User', {
- id: 'current-user-id',
- role: 'user',
- email: 'test@example.org',
- password: '1234',
- })
- otherReportingUser = await factory.create('User', {
- id: 'other-reporting-user-id',
- role: 'user',
- email: 'reporting@example.org',
- password: '1234',
- })
- await factory.create('User', {
- id: 'abusive-user-id',
- role: 'user',
- name: 'abusive-user',
- email: 'abusive-user@example.org',
- })
+ currentUser = await Factory.build(
+ 'user',
+ {
+ id: 'current-user-id',
+ role: 'user',
+ },
+ {
+ email: 'test@example.org',
+ password: '1234',
+ },
+ )
+ otherReportingUser = await Factory.build(
+ 'user',
+ {
+ id: 'other-reporting-user-id',
+ role: 'user',
+ },
+ {
+ email: 'reporting@example.org',
+ password: '1234',
+ },
+ )
+ await Factory.build(
+ 'user',
+ {
+ id: 'abusive-user-id',
+ role: 'user',
+ name: 'abusive-user',
+ },
+ {
+ email: 'abusive-user@example.org',
+ },
+ )
await instance.create('Category', {
id: 'cat9',
name: 'Democracy & Politics',
@@ -341,12 +355,17 @@ describe('file a report on a resource', () => {
describe('reported resource is a post', () => {
beforeEach(async () => {
- await factory.create('Post', {
- author: currentUser,
- id: 'post-to-report-id',
- title: 'This is a post that is going to be reported',
- categoryIds,
- })
+ await Factory.build(
+ 'post',
+ {
+ id: 'post-to-report-id',
+ title: 'This is a post that is going to be reported',
+ },
+ {
+ author: currentUser,
+ categoryIds,
+ },
+ )
})
it('returns type "Post"', async () => {
@@ -394,21 +413,30 @@ describe('file a report on a resource', () => {
})
describe('reported resource is a comment', () => {
- let createPostVariables
beforeEach(async () => {
- createPostVariables = {
- id: 'p1',
- title: 'post to comment on',
- content: 'please comment on me',
- categoryIds,
- }
- await factory.create('Post', { ...createPostVariables, author: currentUser })
- await factory.create('Comment', {
- author: currentUser,
- postId: 'p1',
- id: 'comment-to-report-id',
- content: 'Post comment to be reported.',
- })
+ await Factory.build(
+ 'post',
+ {
+ id: 'p1',
+ title: 'post to comment on',
+ content: 'please comment on me',
+ },
+ {
+ categoryIds,
+ author: currentUser,
+ },
+ )
+ await Factory.build(
+ 'comment',
+ {
+ id: 'comment-to-report-id',
+ content: 'Post comment to be reported.',
+ },
+ {
+ author: currentUser,
+ postId: 'p1',
+ },
+ )
})
it('returns type "Comment"', async () => {
@@ -457,7 +485,7 @@ describe('file a report on a resource', () => {
describe('reported resource is a tag', () => {
beforeEach(async () => {
- await factory.create('Tag', {
+ await Factory.build('tag', {
id: 'tag-to-report-id',
})
})
@@ -515,24 +543,39 @@ describe('file a report on a resource', () => {
beforeEach(async () => {
authenticatedUser = null
- moderator = await factory.create('User', {
- id: 'moderator-1',
- role: 'moderator',
- email: 'moderator@example.org',
- password: '1234',
- })
- currentUser = await factory.create('User', {
- id: 'current-user-id',
- role: 'user',
- email: 'current.user@example.org',
- password: '1234',
- })
- abusiveUser = await factory.create('User', {
- id: 'abusive-user-1',
- role: 'user',
- name: 'abusive-user',
- email: 'abusive-user@example.org',
- })
+ moderator = await Factory.build(
+ 'user',
+ {
+ id: 'moderator-1',
+ role: 'moderator',
+ },
+ {
+ email: 'moderator@example.org',
+ password: '1234',
+ },
+ )
+ currentUser = await Factory.build(
+ 'user',
+ {
+ id: 'current-user-id',
+ role: 'user',
+ },
+ {
+ email: 'current.user@example.org',
+ password: '1234',
+ },
+ )
+ abusiveUser = await Factory.build(
+ 'user',
+ {
+ id: 'abusive-user-1',
+ role: 'user',
+ name: 'abusive-user',
+ },
+ {
+ email: 'abusive-user@example.org',
+ },
+ )
await instance.create('Category', {
id: 'cat9',
name: 'Democracy & Politics',
@@ -540,31 +583,51 @@ describe('file a report on a resource', () => {
})
await Promise.all([
- factory.create('Post', {
- author: abusiveUser,
- id: 'abusive-post-1',
- categoryIds,
- content: 'Interesting Knowledge',
- }),
- factory.create('Post', {
- author: moderator,
- id: 'post-2',
- categoryIds,
- content: 'More things to do …',
- }),
- factory.create('Post', {
- author: currentUser,
- id: 'post-3',
- categoryIds,
- content: 'I am at school …',
- }),
+ Factory.build(
+ 'post',
+ {
+ id: 'abusive-post-1',
+ content: 'Interesting Knowledge',
+ },
+ {
+ categoryIds,
+ author: abusiveUser,
+ },
+ ),
+ Factory.build(
+ 'post',
+ {
+ id: 'post-2',
+ content: 'More things to do …',
+ },
+ {
+ author: moderator,
+ categoryIds,
+ },
+ ),
+ Factory.build(
+ 'post',
+ {
+ id: 'post-3',
+ content: 'I am at school …',
+ },
+ {
+ categoryIds,
+ author: currentUser,
+ },
+ ),
])
await Promise.all([
- factory.create('Comment', {
- author: currentUser,
- id: 'abusive-comment-1',
- postId: 'post-1',
- }),
+ Factory.build(
+ 'comment',
+ {
+ id: 'abusive-comment-1',
+ },
+ {
+ postId: 'post-2',
+ author: currentUser,
+ },
+ ),
])
authenticatedUser = await currentUser.toJson()
await Promise.all([
diff --git a/backend/src/schema/resolvers/rewards.spec.js b/backend/src/schema/resolvers/rewards.spec.js
index fe2807f25..a20472243 100644
--- a/backend/src/schema/resolvers/rewards.spec.js
+++ b/backend/src/schema/resolvers/rewards.spec.js
@@ -1,10 +1,9 @@
import { createTestClient } from 'apollo-server-testing'
-import Factory from '../../factories'
+import Factory, { cleanDatabase } from '../../db/factories'
import { gql } from '../../helpers/jest'
import { getNeode, getDriver } from '../../db/neo4j'
import createServer from '../../server'
-const factory = Factory()
const driver = getDriver()
const instance = getNeode()
@@ -31,23 +30,38 @@ describe('rewards', () => {
})
beforeEach(async () => {
- regularUser = await factory.create('User', {
- id: 'regular-user-id',
- role: 'user',
- email: 'user@example.org',
- password: '1234',
- })
- moderator = await factory.create('User', {
- id: 'moderator-id',
- role: 'moderator',
- email: 'moderator@example.org',
- })
- administrator = await factory.create('User', {
- id: 'admin-id',
- role: 'admin',
- email: 'admin@example.org',
- })
- badge = await factory.create('Badge', {
+ regularUser = await Factory.build(
+ 'user',
+ {
+ id: 'regular-user-id',
+ role: 'user',
+ },
+ {
+ email: 'user@example.org',
+ password: '1234',
+ },
+ )
+ moderator = await Factory.build(
+ 'user',
+ {
+ id: 'moderator-id',
+ role: 'moderator',
+ },
+ {
+ email: 'moderator@example.org',
+ },
+ )
+ administrator = await Factory.build(
+ 'user',
+ {
+ id: 'admin-id',
+ role: 'admin',
+ },
+ {
+ email: 'admin@example.org',
+ },
+ )
+ badge = await Factory.build('badge', {
id: 'indiegogo_en_rhino',
type: 'crowdfunding',
status: 'permanent',
@@ -56,7 +70,7 @@ describe('rewards', () => {
})
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('reward', () => {
@@ -130,7 +144,7 @@ describe('rewards', () => {
})
it('rewards a second different badge to same user', async () => {
- await factory.create('Badge', {
+ await Factory.build('badge', {
id: 'indiegogo_en_racoon',
icon: '/img/badges/indiegogo_en_racoon.svg',
})
@@ -172,10 +186,15 @@ describe('rewards', () => {
},
errors: undefined,
}
- await factory.create('User', {
- id: 'regular-user-2-id',
- email: 'regular2@email.com',
- })
+ await Factory.build(
+ 'user',
+ {
+ id: 'regular-user-2-id',
+ },
+ {
+ email: 'regular2@email.com',
+ },
+ )
await mutate({
mutation: rewardMutation,
variables,
diff --git a/backend/src/schema/resolvers/shout.spec.js b/backend/src/schema/resolvers/shout.spec.js
index 104a28399..f5ec8f5fd 100644
--- a/backend/src/schema/resolvers/shout.spec.js
+++ b/backend/src/schema/resolvers/shout.spec.js
@@ -1,11 +1,10 @@
import { createTestClient } from 'apollo-server-testing'
-import Factory from '../../factories'
+import Factory, { cleanDatabase } from '../../db/factories'
import { gql } from '../../helpers/jest'
import { getNeode, getDriver } from '../../db/neo4j'
import createServer from '../../server'
let mutate, query, authenticatedUser, variables
-const factory = Factory()
const instance = getNeode()
const driver = getDriver()
@@ -47,22 +46,32 @@ describe('shout and unshout posts', () => {
query = createTestClient(server).query
})
beforeEach(async () => {
- currentUser = await factory.create('User', {
- id: 'current-user-id',
- name: 'Current User',
- email: 'current.user@example.org',
- password: '1234',
- })
+ currentUser = await Factory.build(
+ 'user',
+ {
+ id: 'current-user-id',
+ name: 'Current User',
+ },
+ {
+ email: 'current.user@example.org',
+ password: '1234',
+ },
+ )
- postAuthor = await factory.create('User', {
- id: 'id-of-another-user',
- name: 'Another User',
- email: 'another.user@example.org',
- password: '1234',
- })
+ postAuthor = await Factory.build(
+ 'user',
+ {
+ id: 'id-of-another-user',
+ name: 'Another User',
+ },
+ {
+ email: 'another.user@example.org',
+ password: '1234',
+ },
+ )
})
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('shout', () => {
@@ -78,16 +87,26 @@ describe('shout and unshout posts', () => {
describe('authenticated', () => {
beforeEach(async () => {
authenticatedUser = await currentUser.toJson()
- await factory.create('Post', {
- name: 'Other user post',
- id: 'another-user-post-id',
- author: postAuthor,
- })
- await factory.create('Post', {
- name: 'current user post',
- id: 'current-user-post-id',
- author: currentUser,
- })
+ await Factory.build(
+ 'post',
+ {
+ name: 'Other user post',
+ id: 'another-user-post-id',
+ },
+ {
+ author: postAuthor,
+ },
+ )
+ await Factory.build(
+ 'post',
+ {
+ name: 'current user post',
+ id: 'current-user-post-id',
+ },
+ {
+ author: currentUser,
+ },
+ )
variables = {}
})
@@ -144,11 +163,16 @@ describe('shout and unshout posts', () => {
describe('authenticated', () => {
beforeEach(async () => {
authenticatedUser = await currentUser.toJson()
- await factory.create('Post', {
- name: 'Posted By Another User',
- id: 'posted-by-another-user',
- author: postAuthor,
- })
+ await Factory.build(
+ 'post',
+ {
+ name: 'Posted By Another User',
+ id: 'posted-by-another-user',
+ },
+ {
+ author: postAuthor,
+ },
+ )
await mutate({
mutation: mutationShoutPost,
variables: { id: 'posted-by-another-user' },
diff --git a/backend/src/schema/resolvers/socialMedia.spec.js b/backend/src/schema/resolvers/socialMedia.spec.js
index f292b58a0..898174199 100644
--- a/backend/src/schema/resolvers/socialMedia.spec.js
+++ b/backend/src/schema/resolvers/socialMedia.spec.js
@@ -1,41 +1,46 @@
import { createTestClient } from 'apollo-server-testing'
import createServer from '../../server'
-import Factory from '../../factories'
+import Factory, { cleanDatabase } from '../../db/factories'
import { gql } from '../../helpers/jest'
-import { getNeode, getDriver } from '../../db/neo4j'
+import { getDriver } from '../../db/neo4j'
const driver = getDriver()
-const factory = Factory()
-const neode = getNeode()
describe('SocialMedia', () => {
let socialMediaAction, someUser, ownerNode, owner
- const ownerParams = {
- email: 'pippi@example.com',
- password: '1234',
- name: 'Pippi Langstrumpf',
- }
-
- const userParams = {
- email: 'kalle@example.com',
- password: 'abcd',
- name: 'Kalle Blomqvist',
- }
-
const url = 'https://twitter.com/pippi-langstrumpf'
const newUrl = 'https://twitter.com/bullerby'
const setUpSocialMedia = async () => {
- const socialMediaNode = await neode.create('SocialMedia', { url })
+ const socialMediaNode = await Factory.build('socialMedia', { url })
await socialMediaNode.relateTo(ownerNode, 'ownedBy')
return socialMediaNode.toJson()
}
beforeEach(async () => {
- const someUserNode = await neode.create('User', userParams)
+ const someUserNode = await Factory.build(
+ 'user',
+ {
+ name: 'Kalle Blomqvist',
+ },
+ {
+ email: 'kalle@example.com',
+ password: 'abcd',
+ },
+ )
+
someUser = await someUserNode.toJson()
- ownerNode = await neode.create('User', ownerParams)
+ ownerNode = await Factory.build(
+ 'user',
+ {
+ name: 'Pippi Langstrumpf',
+ },
+ {
+ email: 'pippi@example.com',
+ password: '1234',
+ },
+ )
owner = await ownerNode.toJson()
socialMediaAction = async (user, mutation, variables) => {
@@ -57,7 +62,7 @@ describe('SocialMedia', () => {
})
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('create social media', () => {
diff --git a/backend/src/schema/resolvers/statistics.spec.js b/backend/src/schema/resolvers/statistics.spec.js
index e2b9dafe4..c5bb5f88b 100644
--- a/backend/src/schema/resolvers/statistics.spec.js
+++ b/backend/src/schema/resolvers/statistics.spec.js
@@ -1,11 +1,10 @@
import { createTestClient } from 'apollo-server-testing'
-import Factory from '../../factories'
+import Factory, { cleanDatabase } from '../../db/factories'
import { gql } from '../../helpers/jest'
import { getNeode, getDriver } from '../../db/neo4j'
import createServer from '../../server'
let query, authenticatedUser
-const factory = Factory()
const instance = getNeode()
const driver = getDriver()
@@ -37,7 +36,7 @@ beforeAll(() => {
})
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('statistics', () => {
@@ -45,7 +44,7 @@ describe('statistics', () => {
beforeEach(async () => {
await Promise.all(
[...Array(6).keys()].map(() => {
- return factory.create('User')
+ return Factory.build('user')
}),
)
})
@@ -62,7 +61,7 @@ describe('statistics', () => {
beforeEach(async () => {
await Promise.all(
[...Array(3).keys()].map(() => {
- return factory.create('Post')
+ return Factory.build('post')
}),
)
})
@@ -79,7 +78,7 @@ describe('statistics', () => {
beforeEach(async () => {
await Promise.all(
[...Array(2).keys()].map(() => {
- return factory.create('Comment')
+ return Factory.build('comment')
}),
)
})
@@ -97,7 +96,7 @@ describe('statistics', () => {
beforeEach(async () => {
users = await Promise.all(
[...Array(2).keys()].map(() => {
- return factory.create('User')
+ return Factory.build('user')
}),
)
await users[0].relateTo(users[1], 'following')
@@ -116,12 +115,12 @@ describe('statistics', () => {
beforeEach(async () => {
users = await Promise.all(
[...Array(2).keys()].map(() => {
- return factory.create('User')
+ return Factory.build('user')
}),
)
posts = await Promise.all(
[...Array(3).keys()].map(() => {
- return factory.create('Post')
+ return Factory.build('post')
}),
)
await Promise.all([
diff --git a/backend/src/schema/resolvers/user_management.spec.js b/backend/src/schema/resolvers/user_management.spec.js
index 5e7043e74..1e295638d 100644
--- a/backend/src/schema/resolvers/user_management.spec.js
+++ b/backend/src/schema/resolvers/user_management.spec.js
@@ -1,20 +1,19 @@
import jwt from 'jsonwebtoken'
import CONFIG from './../../config'
-import Factory from '../../factories'
+import Factory, { cleanDatabase } from '../../db/factories'
import { gql } from '../../helpers/jest'
import { createTestClient } from 'apollo-server-testing'
import createServer, { context } from '../../server'
import encode from '../../jwt/encode'
import { getNeode } from '../../db/neo4j'
-const factory = Factory()
const neode = getNeode()
let query, mutate, variables, req, user
const disable = async id => {
- const moderator = await factory.create('User', { id: 'u2', role: 'moderator' })
+ const moderator = await Factory.build('user', { id: 'u2', role: 'moderator' })
const user = await neode.find('User', id)
- const reportAgainstUser = await factory.create('Report')
+ const reportAgainstUser = await Factory.build('report')
await Promise.all([
reportAgainstUser.relateTo(moderator, 'filed', {
resourceId: id,
@@ -48,7 +47,7 @@ beforeAll(() => {
})
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('isLoggedIn', () => {
@@ -69,7 +68,7 @@ describe('isLoggedIn', () => {
describe('authenticated', () => {
beforeEach(async () => {
- user = await factory.create('User', { id: 'u3' })
+ user = await Factory.build('user', { id: 'u3' })
const userBearerToken = encode({ id: 'u3' })
req = { headers: { authorization: `Bearer ${userBearerToken}` } }
})
@@ -127,15 +126,20 @@ describe('currentUser', () => {
describe('authenticated', () => {
describe('and corresponding user in the database', () => {
beforeEach(async () => {
- await factory.create('User', {
- id: 'u3',
- // the `id` is the only thing that has to match the decoded JWT bearer token
- avatar: 'https://s3.amazonaws.com/uifaces/faces/twitter/jimmuirhead/128.jpg',
- email: 'test@example.org',
- name: 'Matilde Hermiston',
- slug: 'matilde-hermiston',
- role: 'user',
- })
+ await Factory.build(
+ 'user',
+ {
+ id: 'u3',
+ // the `id` is the only thing that has to match the decoded JWT bearer token
+ avatar: 'https://s3.amazonaws.com/uifaces/faces/twitter/jimmuirhead/128.jpg',
+ name: 'Matilde Hermiston',
+ slug: 'matilde-hermiston',
+ role: 'user',
+ },
+ {
+ email: 'test@example.org',
+ },
+ )
const userBearerToken = encode({ id: 'u3' })
req = { headers: { authorization: `Bearer ${userBearerToken}` } }
})
@@ -172,10 +176,13 @@ describe('login', () => {
beforeEach(async () => {
variables = { email: 'test@example.org', password: '1234' }
- user = await factory.create('User', {
- ...variables,
- id: 'acb2d923-f3af-479e-9f00-61b12e864666',
- })
+ user = await Factory.build(
+ 'user',
+ {
+ id: 'acb2d923-f3af-479e-9f00-61b12e864666',
+ },
+ variables,
+ )
})
describe('ask for a `token`', () => {
@@ -185,7 +192,9 @@ describe('login', () => {
data: { login: token },
} = await mutate({ mutation: loginMutation, variables })
jwt.verify(token, CONFIG.JWT_SECRET, (err, data) => {
- expect(data.email).toEqual('test@example.org')
+ expect(data).toMatchObject({
+ id: 'acb2d923-f3af-479e-9f00-61b12e864666',
+ })
expect(err).toBeNull()
done()
})
@@ -295,7 +304,7 @@ describe('change password', () => {
describe('authenticated', () => {
beforeEach(async () => {
- await factory.create('User', { id: 'u3' })
+ await Factory.build('user', { id: 'u3' })
const userBearerToken = encode({ id: 'u3' })
req = { headers: { authorization: `Bearer ${userBearerToken}` } }
})
diff --git a/backend/src/schema/resolvers/users.js b/backend/src/schema/resolvers/users.js
index d1d9111b6..cbdc683e8 100644
--- a/backend/src/schema/resolvers/users.js
+++ b/backend/src/schema/resolvers/users.js
@@ -252,9 +252,11 @@ export default {
followedByCurrentUser:
'MATCH (this)<-[:FOLLOWS]-(u:User {id: $cypherParams.currentUserId}) RETURN COUNT(u) >= 1',
blocked:
- 'MATCH (this)<-[:BLOCKED]-(u:User {id: $cypherParams.currentUserId}) RETURN COUNT(u) >= 1',
+ 'MATCH (this)-[:BLOCKED]-(u:User {id: $cypherParams.currentUserId}) RETURN COUNT(u) >= 1',
isMuted:
'MATCH (this)<-[:MUTED]-(u:User {id: $cypherParams.currentUserId}) RETURN COUNT(u) >= 1',
+ isBlocked:
+ 'MATCH (this)<-[:BLOCKED]-(u:User {id: $cypherParams.currentUserId}) RETURN COUNT(u) >= 1',
},
count: {
contributionsCount:
diff --git a/backend/src/schema/resolvers/users.spec.js b/backend/src/schema/resolvers/users.spec.js
index cfd84fcf7..9e24b8082 100644
--- a/backend/src/schema/resolvers/users.spec.js
+++ b/backend/src/schema/resolvers/users.spec.js
@@ -1,10 +1,9 @@
-import Factory from '../../factories'
+import Factory, { cleanDatabase } from '../../db/factories'
import { gql } from '../../helpers/jest'
import { getNeode, getDriver } from '../../db/neo4j'
import createServer from '../../server'
import { createTestClient } from 'apollo-server-testing'
-const factory = Factory()
const categoryIds = ['cat9']
let user
@@ -31,13 +30,13 @@ beforeAll(() => {
})
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('User', () => {
describe('query by email address', () => {
beforeEach(async () => {
- await factory.create('User', { name: 'Johnny', email: 'any-email-address@example.org' })
+ await Factory.build('user', { name: 'Johnny' }, { email: 'any-email-address@example.org' })
})
const userQuery = gql`
@@ -57,11 +56,16 @@ describe('User', () => {
describe('as admin', () => {
beforeEach(async () => {
- const admin = await factory.create('User', {
- role: 'admin',
- email: 'admin@example.org',
- password: '1234',
- })
+ const admin = await Factory.build(
+ 'user',
+ {
+ role: 'admin',
+ },
+ {
+ email: 'admin@example.org',
+ password: '1234',
+ },
+ )
authenticatedUser = await admin.toJson()
})
@@ -91,19 +95,9 @@ describe('User', () => {
})
describe('UpdateUser', () => {
- let userParams, variables
+ let variables
beforeEach(async () => {
- userParams = {
- email: 'user@example.org',
- password: '1234',
- id: 'u47',
- name: 'John Doe',
- termsAndConditionsAgreedVersion: null,
- termsAndConditionsAgreedAt: null,
- allowEmbedIframes: false,
- }
-
variables = {
id: 'u47',
name: 'John Doughnut',
@@ -133,18 +127,33 @@ describe('UpdateUser', () => {
`
beforeEach(async () => {
- user = await factory.create('User', userParams)
+ user = await Factory.build(
+ 'user',
+ {
+ id: 'u47',
+ name: 'John Doe',
+ termsAndConditionsAgreedVersion: null,
+ termsAndConditionsAgreedAt: null,
+ allowEmbedIframes: false,
+ },
+ {
+ email: 'user@example.org',
+ },
+ )
})
describe('as another user', () => {
beforeEach(async () => {
- const someoneElseParams = {
- email: 'someone-else@example.org',
- password: '1234',
- name: 'James Doe',
- }
+ const someoneElse = await Factory.build(
+ 'user',
+ {
+ name: 'James Doe',
+ },
+ {
+ email: 'someone-else@example.org',
+ },
+ )
- const someoneElse = await factory.create('User', someoneElseParams)
authenticatedUser = await someoneElse.toJson()
})
@@ -267,16 +276,20 @@ describe('DeleteUser', () => {
beforeEach(async () => {
variables = { id: ' u343', resource: [] }
- user = await factory.create('User', {
+ user = await Factory.build('user', {
name: 'My name should be deleted',
about: 'along with my about',
id: 'u343',
})
- await factory.create('User', {
- email: 'friends-account@example.org',
- password: '1234',
- id: 'not-my-account',
- })
+ await Factory.build(
+ 'user',
+ {
+ id: 'not-my-account',
+ },
+ {
+ email: 'friends-account@example.org',
+ },
+ )
})
describe('unauthenticated', () => {
@@ -309,27 +322,42 @@ describe('DeleteUser', () => {
describe('given posts and comments', () => {
beforeEach(async () => {
- await factory.create('Category', {
+ await Factory.build('category', {
id: 'cat9',
name: 'Democracy & Politics',
icon: 'university',
})
- await factory.create('Post', {
- author: user,
- id: 'p139',
- content: 'Post by user u343',
- categoryIds,
- })
- await factory.create('Comment', {
- author: user,
- id: 'c155',
- content: 'Comment by user u343',
- })
- await factory.create('Comment', {
- postId: 'p139',
- id: 'c156',
- content: "A comment by someone else on user u343's post",
- })
+ await Factory.build(
+ 'post',
+ {
+ id: 'p139',
+ content: 'Post by user u343',
+ },
+ {
+ author: user,
+ categoryIds,
+ },
+ )
+ await Factory.build(
+ 'comment',
+ {
+ id: 'c155',
+ content: 'Comment by user u343',
+ },
+ {
+ author: user,
+ },
+ )
+ await Factory.build(
+ 'comment',
+ {
+ id: 'c156',
+ content: "A comment by someone else on user u343's post",
+ },
+ {
+ postId: 'p139',
+ },
+ )
})
it("deletes my account, but doesn't delete posts or comments by default", async () => {
@@ -527,7 +555,7 @@ describe('DeleteUser', () => {
describe('connected `SocialMedia` nodes', () => {
beforeEach(async () => {
- const socialMedia = await factory.create('SocialMedia')
+ const socialMedia = await Factory.build('socialMedia')
await socialMedia.relateTo(user, 'ownedBy')
})
diff --git a/backend/src/schema/resolvers/users/location.js b/backend/src/schema/resolvers/users/location.js
index 3f3638bf5..cc00d9e0a 100644
--- a/backend/src/schema/resolvers/users/location.js
+++ b/backend/src/schema/resolvers/users/location.js
@@ -34,8 +34,8 @@ const createLocation = async (session, mapboxData) => {
namePL: mapboxData.text_pl,
nameRU: mapboxData.text_ru,
type: mapboxData.id.split('.')[0].toLowerCase(),
- lat: mapboxData.center && mapboxData.center.length ? mapboxData.center[0] : null,
- lng: mapboxData.center && mapboxData.center.length ? mapboxData.center[1] : null,
+ lng: mapboxData.center && mapboxData.center.length ? mapboxData.center[0] : null,
+ lat: mapboxData.center && mapboxData.center.length ? mapboxData.center[1] : null,
}
let mutation =
diff --git a/backend/src/schema/resolvers/users/location.spec.js b/backend/src/schema/resolvers/users/location.spec.js
index f7315174c..04216dcb5 100644
--- a/backend/src/schema/resolvers/users/location.spec.js
+++ b/backend/src/schema/resolvers/users/location.spec.js
@@ -1,10 +1,9 @@
import { gql } from '../../../helpers/jest'
-import Factory from '../../../factories'
+import Factory, { cleanDatabase } from '../../../db/factories'
import { getNeode, getDriver } from '../../../db/neo4j'
import { createTestClient } from 'apollo-server-testing'
import createServer from '../../../server'
-const factory = Factory()
const neode = getNeode()
const driver = getDriver()
let authenticatedUser, mutate, variables
@@ -42,7 +41,7 @@ const updateUserMutation = gql`
let newlyCreatedNodesWithLocales = [
{
city: {
- lng: 41.1534,
+ lat: 41.1534,
nameES: 'Hamburg',
nameFR: 'Hamburg',
nameIT: 'Hamburg',
@@ -55,7 +54,7 @@ let newlyCreatedNodesWithLocales = [
name: 'Hamburg',
namePL: 'Hamburg',
id: 'place.5977106083398860',
- lat: -74.5763,
+ lng: -74.5763,
},
state: {
namePT: 'Nova Jérsia',
@@ -107,7 +106,7 @@ beforeEach(() => {
})
afterEach(() => {
- factory.cleanDatabase()
+ cleanDatabase()
})
describe('userMiddleware', () => {
@@ -146,12 +145,12 @@ describe('userMiddleware', () => {
})
describe('UpdateUser', () => {
- let user, userParams
+ let user
beforeEach(async () => {
newlyCreatedNodesWithLocales = [
{
city: {
- lng: 53.55,
+ lat: 53.55,
nameES: 'Hamburgo',
nameFR: 'Hambourg',
nameIT: 'Amburgo',
@@ -164,7 +163,7 @@ describe('userMiddleware', () => {
namePL: 'Hamburg',
name: 'Hamburg',
id: 'region.10793468240398860',
- lat: 10,
+ lng: 10,
},
country: {
namePT: 'Alemanha',
@@ -182,10 +181,9 @@ describe('userMiddleware', () => {
},
},
]
- userParams = {
+ user = await Factory.build('user', {
id: 'updating-user',
- }
- user = await factory.create('User', userParams)
+ })
authenticatedUser = await user.toJson()
})
diff --git a/backend/src/schema/resolvers/users/mutedUsers.spec.js b/backend/src/schema/resolvers/users/mutedUsers.spec.js
index 130df08ce..cdc7c81b3 100644
--- a/backend/src/schema/resolvers/users/mutedUsers.spec.js
+++ b/backend/src/schema/resolvers/users/mutedUsers.spec.js
@@ -1,11 +1,10 @@
import { createTestClient } from 'apollo-server-testing'
import createServer from '../../../server'
-import Factory from '../../../factories'
+import { cleanDatabase } from '../../../db/factories'
import { gql } from '../../../helpers/jest'
import { getNeode, getDriver } from '../../../db/neo4j'
const driver = getDriver()
-const factory = Factory()
const neode = getNeode()
let currentUser
@@ -30,7 +29,7 @@ beforeEach(() => {
})
afterEach(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
describe('mutedUsers', () => {
diff --git a/backend/src/schema/types/type/NOTIFIED.gql b/backend/src/schema/types/type/NOTIFIED.gql
index af91460f7..88ecd3882 100644
--- a/backend/src/schema/types/type/NOTIFIED.gql
+++ b/backend/src/schema/types/type/NOTIFIED.gql
@@ -30,3 +30,7 @@ type Query {
type Mutation {
markAsRead(id: ID!): NOTIFIED
}
+
+type Subscription {
+ notificationAdded(userId: ID!): NOTIFIED
+}
diff --git a/backend/src/schema/types/type/User.gql b/backend/src/schema/types/type/User.gql
index 71cc1edb0..baefc9d29 100644
--- a/backend/src/schema/types/type/User.gql
+++ b/backend/src/schema/types/type/User.gql
@@ -68,7 +68,12 @@ type User {
RETURN COUNT(u) >= 1
"""
)
-
+ isBlocked: Boolean! @cypher(
+ statement: """
+ MATCH (this)<-[:BLOCKED]-(user:User {id: $cypherParams.currentUserId})
+ RETURN COUNT(user) >= 1
+ """
+ )
blocked: Boolean! @cypher(
statement: """
MATCH (this)-[:BLOCKED]-(user:User {id: $cypherParams.currentUserId})
diff --git a/backend/src/server.js b/backend/src/server.js
index 02e166b71..4df73559d 100644
--- a/backend/src/server.js
+++ b/backend/src/server.js
@@ -1,4 +1,5 @@
import express from 'express'
+import http from 'http'
import helmet from 'helmet'
import { ApolloServer } from 'apollo-server-express'
import CONFIG from './config'
@@ -7,11 +8,35 @@ import { getNeode, getDriver } from './db/neo4j'
import decode from './jwt/decode'
import schema from './schema'
import webfinger from './activitypub/routes/webfinger'
+import { RedisPubSub } from 'graphql-redis-subscriptions'
+import { PubSub } from 'graphql-subscriptions'
+import Redis from 'ioredis'
+import bodyParser from 'body-parser'
+export const NOTIFICATION_ADDED = 'NOTIFICATION_ADDED'
+const { REDIS_DOMAIN, REDIS_PORT, REDIS_PASSWORD } = CONFIG
+let prodPubsub, devPubsub
+const options = {
+ host: REDIS_DOMAIN,
+ port: REDIS_PORT,
+ password: REDIS_PASSWORD,
+ retryStrategy: times => {
+ return Math.min(times * 50, 2000)
+ },
+}
+if (options.host && options.port && options.password) {
+ prodPubsub = new RedisPubSub({
+ publisher: new Redis(options),
+ subscriber: new Redis(options),
+ })
+} else {
+ devPubsub = new PubSub()
+}
+export const pubsub = prodPubsub || devPubsub
const driver = getDriver()
const neode = getNeode()
-export const context = async ({ req }) => {
+const getContext = async req => {
const user = await decode(driver, req.headers.authorization)
return {
driver,
@@ -23,11 +48,24 @@ export const context = async ({ req }) => {
},
}
}
+export const context = async options => {
+ const { connection, req } = options
+ if (connection) {
+ return connection.context
+ } else {
+ return getContext(req)
+ }
+}
const createServer = options => {
const defaults = {
context,
schema: middleware(schema),
+ subscriptions: {
+ onConnect: (connectionParams, webSocket) => {
+ return getContext(connectionParams)
+ },
+ },
debug: !!CONFIG.DEBUG,
tracing: !!CONFIG.DEBUG,
formatError: error => {
@@ -45,9 +83,13 @@ const createServer = options => {
app.use(helmet())
app.use('/.well-known/', webfinger())
app.use(express.static('public'))
+ app.use(bodyParser.json({ limit: '10mb' }))
+ app.use(bodyParser.urlencoded({ limit: '10mb', extended: true }))
server.applyMiddleware({ app, path: '/' })
+ const httpServer = http.createServer(app)
+ server.installSubscriptionHandlers(httpServer)
- return { server, app }
+ return { server, httpServer, app }
}
export default createServer
diff --git a/backend/test/features/support/steps.js b/backend/test/features/support/steps.js
index 70802f4e2..e15801f83 100644
--- a/backend/test/features/support/steps.js
+++ b/backend/test/features/support/steps.js
@@ -3,18 +3,18 @@ import { Given, When, Then, AfterAll } from 'cucumber'
import { expect } from 'chai'
// import { client } from '../../../src/activitypub/apollo-client'
import { GraphQLClient } from 'graphql-request'
-import Factory from '../../../src/factories'
+import Factory from '../../../src/db/factories'
const debug = require('debug')('ea:test:steps')
-const factory = Factory()
const client = new GraphQLClient(host)
function createUser (slug) {
debug(`creating user ${slug}`)
- return factory.create('User', {
+ return Factory.build('user', {
name: slug,
+ }, {
+ password: '1234',
email: 'example@test.org',
- password: '1234'
})
// await login({ email: 'example@test.org', password: '1234' })
}
diff --git a/backend/yarn.lock b/backend/yarn.lock
index 7fa0acb92..8bc2e7c00 100644
--- a/backend/yarn.lock
+++ b/backend/yarn.lock
@@ -1175,13 +1175,13 @@
url-regex "~4.1.1"
video-extensions "~1.1.0"
-"@metascraper/helpers@^5.10.6":
- version "5.10.6"
- resolved "https://registry.yarnpkg.com/@metascraper/helpers/-/helpers-5.10.6.tgz#0b786607212925a577926fd0cd0313a49de3499c"
- integrity sha512-/jvhlM3RKGYMoUK8D8S1r3tN03/EYizCqWF7zDx0aBMC8Ihp33DRGs9oNdsgkgwzVF7O/YpDm55l9K+qVJlsyQ==
+"@metascraper/helpers@^5.10.7", "@metascraper/helpers@^5.11.1":
+ version "5.11.1"
+ resolved "https://registry.yarnpkg.com/@metascraper/helpers/-/helpers-5.11.1.tgz#227fdd0caf1d33f4b24a85298a355ce7ebb451df"
+ integrity sha512-oES/e6bwKBlT7WGa2ni3xbJMDx2rbFxSzbUhRX8D+Kylb8H2ThP07c7f+VXMPXWx5CPrNMai/Oyp5IczCf3v8g==
dependencies:
audio-extensions "0.0.0"
- chrono-node "~1.4.2"
+ chrono-node "~1.4.3"
condense-whitespace "~2.0.0"
entities "~2.0.0"
file-extension "~4.0.5"
@@ -1194,7 +1194,7 @@
lodash "~4.17.15"
memoize-one "~5.1.1"
mime-types "~2.1.26"
- normalize-url "~4.5.0"
+ normalize-url "~5.0.0"
smartquotes "~2.3.1"
title "~3.4.1"
truncate "~2.1.0"
@@ -1275,83 +1275,83 @@
resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=
-"@sentry/apm@5.11.2":
- version "5.11.2"
- resolved "https://registry.yarnpkg.com/@sentry/apm/-/apm-5.11.2.tgz#35961b9d2319ad21ae91f1b697998a8c523f1919"
- integrity sha512-qn4HiSZ+6b1Gg+DlXdHVpiPPEbRu4IicGSbI8HTJLzrlsjoaBQPPkDwtuQUBVq21tU3RYXnTwrl9m45KuX6alA==
+"@sentry/apm@5.12.3":
+ version "5.12.3"
+ resolved "https://registry.yarnpkg.com/@sentry/apm/-/apm-5.12.3.tgz#23a5e9c771a8748f59426a1d0f8b1fbb9b72a717"
+ integrity sha512-OSGEeo4b1Gsu/TUcWMx9vmgSnQvR+zM+1Iwq5xFQAK2ET3Y4gBFqZ1iRt2hxlzr8KCQmQTQc1mao1X0tmidFQg==
dependencies:
- "@sentry/browser" "5.11.2"
- "@sentry/hub" "5.11.2"
- "@sentry/minimal" "5.11.2"
- "@sentry/types" "5.11.0"
- "@sentry/utils" "5.11.1"
+ "@sentry/browser" "5.12.1"
+ "@sentry/hub" "5.12.0"
+ "@sentry/minimal" "5.12.0"
+ "@sentry/types" "5.12.0"
+ "@sentry/utils" "5.12.0"
tslib "^1.9.3"
-"@sentry/browser@5.11.2":
- version "5.11.2"
- resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.11.2.tgz#f0b19bd97e9f09a20e9f93a9835339ed9ab1f5a4"
- integrity sha512-ls6ARX5m+23ld8OsuoPnR+kehjR5ketYWRcDYlmJDX2VOq5K4EzprujAo8waDB0o5a92yLXQ0ZSoK/zzAV2VoA==
+"@sentry/browser@5.12.1":
+ version "5.12.1"
+ resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.12.1.tgz#dc1f268595269fb7277f55eb625c7e92d76dc01b"
+ integrity sha512-Zl7VdppUxctyaoqMSEhnDJp2rrupx8n8N2n3PSooH74yhB2Z91nt84mouczprBsw3JU1iggGyUw9seRFzDI1hw==
dependencies:
- "@sentry/core" "5.11.2"
- "@sentry/types" "5.11.0"
- "@sentry/utils" "5.11.1"
+ "@sentry/core" "5.12.0"
+ "@sentry/types" "5.12.0"
+ "@sentry/utils" "5.12.0"
tslib "^1.9.3"
-"@sentry/core@5.11.2":
- version "5.11.2"
- resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.11.2.tgz#f2d9d37940d291dbcb9a9e4a012f76919474bdf6"
- integrity sha512-IFCXGy7ebqIq/Kb8RVryCo/SjwhPcrfBmOjkicr4+DxN1UybLre2N3p9bejQMPIteOfDVHlySLYeipjTf+mxZw==
+"@sentry/core@5.12.0":
+ version "5.12.0"
+ resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.12.0.tgz#d6380c4ef7beee5f418ac1d0e5be86a2de2af449"
+ integrity sha512-wY4rsoX71QsGpcs9tF+OxKgDPKzIFMRvFiSRcJoPMfhFsTilQ/CBMn/c3bDtWQd9Bnr/ReQIL6NbnIjUsPHA4Q==
dependencies:
- "@sentry/hub" "5.11.2"
- "@sentry/minimal" "5.11.2"
- "@sentry/types" "5.11.0"
- "@sentry/utils" "5.11.1"
+ "@sentry/hub" "5.12.0"
+ "@sentry/minimal" "5.12.0"
+ "@sentry/types" "5.12.0"
+ "@sentry/utils" "5.12.0"
tslib "^1.9.3"
-"@sentry/hub@5.11.2":
- version "5.11.2"
- resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.11.2.tgz#a3b7ec27cd4cea2cddd75c372fbf1b4bc04c6aae"
- integrity sha512-5BiDin6ZPsaiTm29rCC41MAjP1vOaKniqfjtXHVPm7FeOBA2bpHm95ncjLkshKGJTPfPZHXTpX/1IZsHrfGVEA==
+"@sentry/hub@5.12.0":
+ version "5.12.0"
+ resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.12.0.tgz#5e8c8f249f5bdbeb8cc4ec02c2ccc53a67f2cc02"
+ integrity sha512-3k7yE8BEVJsKx8mR4LcI4IN0O8pngmq44OcJ/fRUUBAPqsT38jsJdP2CaWhdlM1jiNUzUDB1ktBv6/lY+VgcoQ==
dependencies:
- "@sentry/types" "5.11.0"
- "@sentry/utils" "5.11.1"
+ "@sentry/types" "5.12.0"
+ "@sentry/utils" "5.12.0"
tslib "^1.9.3"
-"@sentry/minimal@5.11.2":
- version "5.11.2"
- resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.11.2.tgz#ae417699342266ecd109a97e53cd9519c0893b21"
- integrity sha512-oNuJuz3EZhVtamzABmPdr6lcYo06XHLWb2LvgnoNaYcMD1ExUSvhepOSyZ2h5STCMbmVgGVfXBNPV9RUTp8GZg==
+"@sentry/minimal@5.12.0":
+ version "5.12.0"
+ resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.12.0.tgz#2611e2aa520c1edb7999e6de51bd65ec66341757"
+ integrity sha512-fk73meyz4k4jCg9yzbma+WkggsfEIQWI2e2TWfYsRGcrV3RnlSrXyM4D91/A8Bjx10SNezHPUFHjasjlHXOkyA==
dependencies:
- "@sentry/hub" "5.11.2"
- "@sentry/types" "5.11.0"
+ "@sentry/hub" "5.12.0"
+ "@sentry/types" "5.12.0"
tslib "^1.9.3"
-"@sentry/node@^5.11.2":
- version "5.11.2"
- resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.11.2.tgz#575c320b624c218d2155183f6bbe82b732bfb1f2"
- integrity sha512-jYq9u76BdAbOKPuYg39Xh/+797MevzjMkCIC9cw/bQxAm6nHc3FXeKqd79O33jO4Jag0JL+Bz/0JidgrKgKgXg==
+"@sentry/node@^5.12.3":
+ version "5.12.3"
+ resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.12.3.tgz#4a4934b04c5163fc340312eaf0d152990aa7140f"
+ integrity sha512-QwqN+i6IC3/YrNq7kqxH7YiXtZYY8tBuJqFi84WbiMHF7MAqxMSPNQJGfX2GJuMHKHwn6IZdgSE8+FkfN9zGLQ==
dependencies:
- "@sentry/apm" "5.11.2"
- "@sentry/core" "5.11.2"
- "@sentry/hub" "5.11.2"
- "@sentry/types" "5.11.0"
- "@sentry/utils" "5.11.1"
+ "@sentry/apm" "5.12.3"
+ "@sentry/core" "5.12.0"
+ "@sentry/hub" "5.12.0"
+ "@sentry/types" "5.12.0"
+ "@sentry/utils" "5.12.0"
cookie "^0.3.1"
https-proxy-agent "^4.0.0"
lru_map "^0.3.3"
tslib "^1.9.3"
-"@sentry/types@5.11.0":
- version "5.11.0"
- resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.11.0.tgz#40f0f3174362928e033ddd9725d55e7c5cb7c5b6"
- integrity sha512-1Uhycpmeo1ZK2GLvrtwZhTwIodJHcyIS6bn+t4IMkN9MFoo6ktbAfhvexBDW/IDtdLlCGJbfm8nIZerxy0QUpg==
+"@sentry/types@5.12.0":
+ version "5.12.0"
+ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.12.0.tgz#5367e53c74261beea01502e3f7b6f3d822682a31"
+ integrity sha512-aZbBouBLrKB8wXlztriIagZNmsB+wegk1Jkl6eprqRW/w24Sl/47tiwH8c5S4jYTxdAiJk+SAR10AAuYmIN3zg==
-"@sentry/utils@5.11.1":
- version "5.11.1"
- resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.11.1.tgz#aa19fcc234cf632257b2281261651d2fac967607"
- integrity sha512-O0Zl4R2JJh8cTkQ8ZL2cDqGCmQdpA5VeXpuBbEl1v78LQPkBDISi35wH4mKmLwMsLBtTVpx2UeUHBj0KO5aLlA==
+"@sentry/utils@5.12.0":
+ version "5.12.0"
+ resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.12.0.tgz#62967f934a3ee6d21472eac0219084e37225933e"
+ integrity sha512-fYUadGLbfTCbs4OG5hKCOtv2jrNE4/8LHNABy9DwNJ/t5DVtGqWAZBnxsC+FG6a3nVqCpxjFI9AHlYsJ2wsf7Q==
dependencies:
- "@sentry/types" "5.11.0"
+ "@sentry/types" "5.12.0"
tslib "^1.9.3"
"@sindresorhus/is@^0.14.0":
@@ -1607,10 +1607,10 @@
dependencies:
"@types/yargs-parser" "*"
-"@types/yup@0.26.29":
- version "0.26.29"
- resolved "https://registry.yarnpkg.com/@types/yup/-/yup-0.26.29.tgz#5a533ad6f74e442436698e20b1441c68a7a1c931"
- integrity sha512-M81oZOgLap0b0I/BySnpLwHjOj1BFxUKV1ytG2Kqj3jmkh8F3H11PEnk658UniftpjTXdueloOL+KZYn+SMQ9w==
+"@types/yup@0.26.30":
+ version "0.26.30"
+ resolved "https://registry.yarnpkg.com/@types/yup/-/yup-0.26.30.tgz#0d6066505bb67e7b9b161b2082c4cdfcdafd6a6b"
+ integrity sha512-b/uklO68T/eShWnxjlgwOJlEFOQ11ib3i1wQQiLmHqFJTxDMvz+tb4XzThGQISzOcelMnoSdb1Po4s69YkEQeg==
"@types/zen-observable@^0.8.0":
version "0.8.0"
@@ -1845,10 +1845,10 @@ apollo-client@~2.6.8:
tslib "^1.10.0"
zen-observable "^0.8.0"
-apollo-datasource@^0.6.4:
- version "0.6.4"
- resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-0.6.4.tgz#c0d1604b1a97e004844d4b61bd819a9a6b0a409f"
- integrity sha512-u4eu6Q94q6KuZacZfdo4vCevA81F4QWeTYEXUvoksQMJpiacPHHe0DJrofKVKvxngUp5kCi1RnPXSc6kBY+/oA==
+apollo-datasource@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-0.7.0.tgz#2a6d82edb2eba21b4ddf21877009ba39ff821945"
+ integrity sha512-Yja12BgNQhzuFGG/5Nw2MQe0hkuQy2+9er09HxeEyAf2rUDIPnhPrn1MDoZTB8MU7UGfjwITC+1ofzKkkrZobA==
dependencies:
apollo-server-caching "^0.5.1"
apollo-server-env "^2.4.3"
@@ -1860,13 +1860,13 @@ apollo-engine-reporting-protobuf@^0.4.4:
dependencies:
"@apollo/protobufjs" "^1.0.3"
-apollo-engine-reporting@^1.4.14:
- version "1.4.14"
- resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-1.4.14.tgz#71a6509ebe86385da43df500cd0940525a3e8674"
- integrity sha512-cCG9qDOPwbh87ZjQGHgmnP3oPqhqjIZcNmm/lNtWkWXGTlxV/jmUEqpVi+wsDbE5gR7d1OFk6GqSy2ZQh+S+Bw==
+apollo-engine-reporting@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-1.5.0.tgz#6e3746de14fc87e14c289c0776a2d350e6f50918"
+ integrity sha512-Pe2DelijZ2QHqkqv8E97iOb32l+FIMT2nxpQsuH+nWi+96cCFJJJHjm3RLAPEUuvGOgW9dFYQP3J91EyC5O0tQ==
dependencies:
apollo-engine-reporting-protobuf "^0.4.4"
- apollo-graphql "^0.3.7"
+ apollo-graphql "^0.4.0"
apollo-server-caching "^0.5.1"
apollo-server-env "^2.4.3"
apollo-server-errors "^2.3.4"
@@ -1892,10 +1892,10 @@ apollo-errors@^1.9.0:
assert "^1.4.1"
extendable-error "^0.1.5"
-apollo-graphql@^0.3.7:
- version "0.3.7"
- resolved "https://registry.yarnpkg.com/apollo-graphql/-/apollo-graphql-0.3.7.tgz#533232ed48b0b6dbcf5635f65e66cf8677a5b768"
- integrity sha512-ghW16xx9tRcyL38Pw6G5OidMnYn+CNUGZWmvqQgEO2nRy4T0ONPZZBOvGrIMtJQ70oEykNMKGm0zm6PdHdxd8Q==
+apollo-graphql@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/apollo-graphql/-/apollo-graphql-0.4.0.tgz#dd0afe31a6241b8e2ded20b906c9ee8dfbe03497"
+ integrity sha512-abCHcKln1EGbzSItW087EjBI5wnluikyUqEn4VsdeWHCtdENWpHCn/MnM0+jJa1prNasxN7tCukp4nMpJYYVqg==
dependencies:
apollo-env "^0.6.1"
lodash.sortby "^4.7.0"
@@ -1943,18 +1943,18 @@ apollo-server-caching@^0.5.1:
dependencies:
lru-cache "^5.0.0"
-apollo-server-core@^2.9.16:
- version "2.9.16"
- resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.9.16.tgz#b4c869a6babfa6906fbbf1e6facf3b7231dbf777"
- integrity sha512-4ftdjSfs/3aEare9QNTVSF0yUvXETxiohuDLZ7gmMIQxNnZhUjVXiZL1rYKuIZ12uH7xLvh/DwkXRt6nLG/lZA==
+apollo-server-core@^2.10.0:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.10.0.tgz#b8d51bdffe6529f0e3ca670ee8f1238765cfade4"
+ integrity sha512-x/UK6XvU307W8D/pzTclU04JIjRarcbg5mFPe0nVmO4OTc26uQgKi1WlZkcewXsAUnn+nDwKVn2c2G3dHEgXzQ==
dependencies:
"@apollographql/apollo-tools" "^0.4.3"
"@apollographql/graphql-playground-html" "1.6.24"
"@types/graphql-upload" "^8.0.0"
"@types/ws" "^6.0.0"
apollo-cache-control "^0.8.11"
- apollo-datasource "^0.6.4"
- apollo-engine-reporting "^1.4.14"
+ apollo-datasource "^0.7.0"
+ apollo-engine-reporting "^1.5.0"
apollo-server-caching "^0.5.1"
apollo-server-env "^2.4.3"
apollo-server-errors "^2.3.4"
@@ -1983,10 +1983,10 @@ apollo-server-errors@^2.3.4:
resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.3.4.tgz#b70ef01322f616cbcd876f3e0168a1a86b82db34"
integrity sha512-Y0PKQvkrb2Kd18d1NPlHdSqmlr8TgqJ7JQcNIfhNDgdb45CnqZlxL1abuIRhr8tiw8OhVOcFxz2KyglBi8TKdA==
-apollo-server-express@^2.9.16:
- version "2.9.16"
- resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.9.16.tgz#4c30b1769426c010b37943c0fb7766e5825973a0"
- integrity sha512-ZDc7GP+piUm67alJ0DIE9f36tHcCiNm3PHMLIVJlVE/rcGwzRjV5rardRqeslljQiO2J+1IwXKwJ0/kRrZ4JvQ==
+apollo-server-express@^2.10.0, apollo-server-express@^2.9.16:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.10.0.tgz#7d87ff54e378cdcb135eb3d093f20fca7fc0d1bc"
+ integrity sha512-adDQts4QmkX2ENU7JibV1EwRl3ESnpnpImXIMvg8Cm7kX2wSbzwm8LecQNujwWJtkAPTCEAcnPBDyKwWjTQ6/g==
dependencies:
"@apollographql/graphql-playground-html" "1.6.24"
"@types/accepts" "^1.3.5"
@@ -1994,7 +1994,7 @@ apollo-server-express@^2.9.16:
"@types/cors" "^2.8.4"
"@types/express" "4.17.2"
accepts "^1.3.5"
- apollo-server-core "^2.9.16"
+ apollo-server-core "^2.10.0"
apollo-server-types "^0.2.10"
body-parser "^1.18.3"
cors "^2.8.4"
@@ -2012,12 +2012,12 @@ apollo-server-plugin-base@^0.6.10:
dependencies:
apollo-server-types "^0.2.10"
-apollo-server-testing@~2.9.16:
- version "2.9.16"
- resolved "https://registry.yarnpkg.com/apollo-server-testing/-/apollo-server-testing-2.9.16.tgz#35e9b0b102a11bac8db2fce04281cb43e7993d45"
- integrity sha512-CLfYZY2Htwzw6iPlFO32/SNXNstWQsvGd5/FQ8KEwRpNfYM4g0rAE98y/THEQTvTh0xPH+qWxA7CVQcc7/FMbQ==
+apollo-server-testing@~2.10.0:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/apollo-server-testing/-/apollo-server-testing-2.10.0.tgz#c8d7fc2d4e6eaf84232aaa7c125d9fae691fbcf4"
+ integrity sha512-wBJ/CT3ZN5nmSySMqgpAFwX/I3yzsQhRGR8MCK/16MjhEZH6svNaJWzoif6gaocj0NyVBJvOIijuMTecG9+6vg==
dependencies:
- apollo-server-core "^2.9.16"
+ apollo-server-core "^2.10.0"
apollo-server-types@^0.2.10:
version "0.2.10"
@@ -2028,13 +2028,13 @@ apollo-server-types@^0.2.10:
apollo-server-caching "^0.5.1"
apollo-server-env "^2.4.3"
-apollo-server@~2.9.16:
- version "2.9.16"
- resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-2.9.16.tgz#c0054ed70ecb637cb3f585ff46fb4a060730076f"
- integrity sha512-dqB1shkjl9ne7DfSHXDH5sT70llr9zswLL+/g/4zt4/H+k+2pkD1BShQkNIK7PBYcVa8KvRAHXiHTXZ36GCspA==
+apollo-server@~2.10.0:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-2.10.0.tgz#93b924b089f7c4070e88aa29a8b9472c1d5d0f82"
+ integrity sha512-ITXkklSgrNfohFh4juvHWrtLz/82iw9CkBUW+G5T8NxHaqxm1Lpus1Ck2VsXmCgNplYi6mODRjUl087qdlU2Rw==
dependencies:
- apollo-server-core "^2.9.16"
- apollo-server-express "^2.9.16"
+ apollo-server-core "^2.10.0"
+ apollo-server-express "^2.10.0"
express "^4.0.0"
graphql-subscriptions "^1.0.0"
graphql-tools "^4.0.0"
@@ -2691,10 +2691,10 @@ chrono-node@~1.3.11:
dependencies:
moment "2.21.0"
-chrono-node@~1.4.2:
- version "1.4.2"
- resolved "https://registry.yarnpkg.com/chrono-node/-/chrono-node-1.4.2.tgz#0c7fc1f264e60a660c2b2dab753a3f285dbfd8c9"
- integrity sha512-fsb82wPDHVZl3xtche8k4ZZtNwf81/ZMueil2ANpSfogUAEa3BuzZAar7ObLXi1ptMjBzdzA6ys/bFq1oBjO8w==
+chrono-node@~1.4.3:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/chrono-node/-/chrono-node-1.4.3.tgz#4c8e24643ec5e576f6f8fe0429370c3b554491b4"
+ integrity sha512-ZyKcnTcr8i7Mt9p4+ixMHEuR6+eMTrjYCL9Rm9TZHviLleCtcZoVzmr2uSc+Vg8MX1YbNCnPbEd4rfV8WvzLcw==
dependencies:
dayjs "^1.8.19"
@@ -2774,6 +2774,11 @@ clone-response@^1.0.2:
dependencies:
mimic-response "^1.0.0"
+cluster-key-slot@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz#30474b2a981fb12172695833052bc0d01336d10d"
+ integrity sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==
+
co@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
@@ -3254,6 +3259,11 @@ delegates@^1.0.0:
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
+denque@^1.1.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/denque/-/denque-1.4.1.tgz#6744ff7641c148c3f8a69c307e51235c1f4a37cf"
+ integrity sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==
+
depd@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
@@ -3625,10 +3635,10 @@ eslint-plugin-es@^3.0.0:
eslint-utils "^2.0.0"
regexpp "^3.0.0"
-eslint-plugin-import@~2.20.0:
- version "2.20.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.0.tgz#d749a7263fb6c29980def8e960d380a6aa6aecaa"
- integrity sha512-NK42oA0mUc8Ngn4kONOPsPB1XhbUvNHqF+g307dPV28aknPoiNnKLFd9em4nkswwepdF5ouieqv5Th/63U7YJQ==
+eslint-plugin-import@~2.20.1:
+ version "2.20.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz#802423196dcb11d9ce8435a5fc02a6d3b46939b3"
+ integrity sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw==
dependencies:
array-includes "^3.0.3"
array.prototype.flat "^1.2.1"
@@ -3643,13 +3653,12 @@ eslint-plugin-import@~2.20.0:
read-pkg-up "^2.0.0"
resolve "^1.12.0"
-eslint-plugin-jest@~23.6.0:
- version "23.6.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.6.0.tgz#508b32f80d44058c8c01257c0ee718cfbd521e9d"
- integrity sha512-GH8AhcFXspOLqak7fqnddLXEJsrFyvgO8Bm60SexvKSn1+3rWYESnCiWUOCUcBTprNSDSE4CtAZdM4EyV6gPPw==
+eslint-plugin-jest@~23.7.0:
+ version "23.7.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.7.0.tgz#84d5603b6e745b59898cb6750df6a44782a39b04"
+ integrity sha512-zkiyGlvJeHNjAEz8FaIxTXNblJJ/zj3waNbYbgflK7K6uy0cpE5zJBt/JpJtOBGM/UGkC6BqsQ4n0y7kQ2HA8w==
dependencies:
"@typescript-eslint/experimental-utils" "^2.5.0"
- micromatch "^4.0.2"
eslint-plugin-node@~11.0.0:
version "11.0.0"
@@ -4202,10 +4211,10 @@ fresh@0.5.2:
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
-fs-capacitor@^2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-2.0.4.tgz#5a22e72d40ae5078b4fe64fe4d08c0d3fc88ad3c"
- integrity sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA==
+fs-capacitor@6.0.0, fs-capacitor@^2.0.4:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-6.0.0.tgz#b4b89e3281d61df1c573e788d9ee6ec4c7c94da4"
+ integrity sha512-I+jZLV2q+ivQK/+Mu5FIYAECHgjoo8GBYJsBBQbNeU0aW1m25LU4E+MkLNq0kcJBjrp8Z6fhxpSeS8SyJyGkrw==
fs-minipass@^1.2.5:
version "1.2.6"
@@ -4476,12 +4485,21 @@ graphql-middleware@~4.0.2:
dependencies:
graphql-tools "^4.0.5"
-graphql-shield@~7.0.9:
- version "7.0.9"
- resolved "https://registry.yarnpkg.com/graphql-shield/-/graphql-shield-7.0.9.tgz#8248916e9636a7e3c05719a52fd13f2d37ccaeb2"
- integrity sha512-2Dfddd2hcObCSqAj64c/Aaxvs7gaoD2QU14crj7H486QjS8jIAtEPUyLVyv8SmJ1ZD7jT6wqx6wrB15Npn5Sgw==
+graphql-redis-subscriptions@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/graphql-redis-subscriptions/-/graphql-redis-subscriptions-2.1.2.tgz#9c1b744bace0c6ba99dd0ebafe0148cad1df3301"
+ integrity sha512-l69KbGxyYfVHxvE+Dzv9/hXg/q+Xnjfx1JsrJD6ikePuSsNaCSNxr+MubSTNF3Gt3C/+JZs4FaWImFeK/+X2og==
dependencies:
- "@types/yup" "0.26.29"
+ iterall "^1.2.2"
+ optionalDependencies:
+ ioredis "^4.6.3"
+
+graphql-shield@~7.0.11:
+ version "7.0.11"
+ resolved "https://registry.yarnpkg.com/graphql-shield/-/graphql-shield-7.0.11.tgz#78d49f346326be71090d35d8f5843da9ee8136e2"
+ integrity sha512-iWn/aiom2c8NuOj60euWTmsKKUjX1DB4ynBcDitQOLXG3WrWgss2Iolzr553qooJvkR5czeAFgPlZgI+nUgwsQ==
+ dependencies:
+ "@types/yup" "0.26.30"
object-hash "^2.0.0"
yup "^0.28.0"
@@ -4492,10 +4510,10 @@ graphql-subscriptions@^1.0.0:
dependencies:
iterall "^1.2.1"
-graphql-tag@^2.9.2, graphql-tag@~2.10.1:
- version "2.10.1"
- resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.1.tgz#10aa41f1cd8fae5373eaf11f1f67260a3cad5e02"
- integrity sha512-jApXqWBzNXQ8jYa/HLkZJaVw9jgwNqZkywa2zfFn16Iv1Zb7ELNHkJaXHR7Quvd5SIGsy6Ny7SUKATgnu05uEg==
+graphql-tag@^2.9.2, graphql-tag@~2.10.3:
+ version "2.10.3"
+ resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.3.tgz#ea1baba5eb8fc6339e4c4cf049dabe522b0edf03"
+ integrity sha512-4FOv3ZKfA4WdOKJeHdz6B3F/vxBLSgmBcGeAFPf4n1F64ltJUvOOerNj0rsJxONQGdhUMynQIvd6LzB+1J5oKA==
graphql-tools@^4.0.0, graphql-tools@^4.0.4, graphql-tools@^4.0.5:
version "4.0.5"
@@ -4535,7 +4553,7 @@ har-schema@^2.0.0:
resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
-har-validator@~5.1.0:
+har-validator@~5.1.3:
version "5.1.3"
resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080"
integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==
@@ -4920,6 +4938,21 @@ invariant@^2.2.2, invariant@^2.2.4:
dependencies:
loose-envify "^1.0.0"
+ioredis@^4.14.1, ioredis@^4.6.3:
+ version "4.14.1"
+ resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.14.1.tgz#b73ded95fcf220f106d33125a92ef6213aa31318"
+ integrity sha512-94W+X//GHM+1GJvDk6JPc+8qlM7Dul+9K+lg3/aHixPN7ZGkW6qlvX0DG6At9hWtH2v3B32myfZqWoANUJYGJA==
+ dependencies:
+ cluster-key-slot "^1.1.0"
+ debug "^4.1.1"
+ denque "^1.1.0"
+ lodash.defaults "^4.2.0"
+ lodash.flatten "^4.4.0"
+ redis-commands "1.5.0"
+ redis-errors "^1.2.0"
+ redis-parser "^3.0.0"
+ standard-as-callback "^2.0.1"
+
ip-regex@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd"
@@ -5960,11 +5993,21 @@ lodash.clonedeep@^4.5.0:
resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
+lodash.defaults@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
+ integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=
+
lodash.escaperegexp@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347"
integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=
+lodash.flatten@^4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
+ integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=
+
lodash.includes@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f"
@@ -6154,19 +6197,19 @@ merge2@^1.3.0:
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81"
integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==
-metascraper-audio@^5.10.6:
- version "5.10.6"
- resolved "https://registry.yarnpkg.com/metascraper-audio/-/metascraper-audio-5.10.6.tgz#095892445b90d40bc54e54f69536a80e36fd9e4c"
- integrity sha512-wTVtYK8Ico82caIi6HlkyGgUaBC21X/vhT2aQ4LKcg+gHoOhJcmWNd5me9VhaRJ7gTV/7yKkL5A54fBcjcn8Kg==
+metascraper-audio@^5.10.7:
+ version "5.10.7"
+ resolved "https://registry.yarnpkg.com/metascraper-audio/-/metascraper-audio-5.10.7.tgz#ba9f8333a7b71d388a0bf88dff64fc4f06595566"
+ integrity sha512-VHZlT21bh/TWnHOQMGret3UcMdJOsyWvagK7MG8rLczYmrPEtvxnJjwPhyrEj1oJC+fz2P//bfQ6gyrD4HrmEQ==
dependencies:
- "@metascraper/helpers" "^5.10.6"
+ "@metascraper/helpers" "^5.10.7"
-metascraper-author@^5.10.6:
- version "5.10.6"
- resolved "https://registry.yarnpkg.com/metascraper-author/-/metascraper-author-5.10.6.tgz#1ceaacec776d46629300db25e17657fe35a14a20"
- integrity sha512-L2P/Fp0npaQcowbwi1vHKJbSYc99cio58/yYRm205xGfgMCRMpYOrYB+ecizXgeSSRiv8G8SXLrLXOLJ5K+SdA==
+metascraper-author@^5.10.7:
+ version "5.10.7"
+ resolved "https://registry.yarnpkg.com/metascraper-author/-/metascraper-author-5.10.7.tgz#99b3a2b982b7a63feea41554659be3db7bf7035c"
+ integrity sha512-AdNkcqy+eqs2Eeh+6odhIWArR4pWVlrCx3jMaho0BDY6ZnKgJP44HtlPNkghQpBaueoKX6CycGKraITzwjGj1w==
dependencies:
- "@metascraper/helpers" "^5.10.6"
+ "@metascraper/helpers" "^5.10.7"
lodash "~4.17.15"
metascraper-clearbit-logo@^5.3.0:
@@ -6176,26 +6219,26 @@ metascraper-clearbit-logo@^5.3.0:
dependencies:
got "~9.6.0"
-metascraper-date@^5.10.6:
- version "5.10.6"
- resolved "https://registry.yarnpkg.com/metascraper-date/-/metascraper-date-5.10.6.tgz#dbdc0ddb4f4220ad1ea412b4a686900c1b138cf6"
- integrity sha512-WfZw7WhkMKrrq96ZcAxS01/YjiDBpAPt5e3ggnCfLi2ZzC370w9J0INUo7gAtujaNZvgTTSEcrDD7AbTVMSYKA==
+metascraper-date@^5.10.7:
+ version "5.10.7"
+ resolved "https://registry.yarnpkg.com/metascraper-date/-/metascraper-date-5.10.7.tgz#580891d98f14438658610d951e5454a0658eb5f3"
+ integrity sha512-S1ZsvYrOccS6EGvlAJT7Ph08uRgIE+aYlTRSCR8wG8P0j0Ta/srUKbPySxv+xXqDXuRIChtErSIsBgORg8uNjg==
dependencies:
- "@metascraper/helpers" "^5.10.6"
+ "@metascraper/helpers" "^5.10.7"
-metascraper-description@^5.10.6:
- version "5.10.6"
- resolved "https://registry.yarnpkg.com/metascraper-description/-/metascraper-description-5.10.6.tgz#ebb4459a4e1acdc473534d1b898b7958b1769eb6"
- integrity sha512-d3d6UMsNnD8Dy7gxA05iTOj5QmJrFQTw1+IrW9CiOfdNsYq0H+m265a9lRaXcyJdqkzmGnv/d52C0BtUDOrkRw==
+metascraper-description@^5.11.0:
+ version "5.11.0"
+ resolved "https://registry.yarnpkg.com/metascraper-description/-/metascraper-description-5.11.0.tgz#1f7edfae7ffc353512975cafaa5b862fc5141709"
+ integrity sha512-or62L9EbIwBxjsu6gShTKi1z1XQ4Hvml8MrdydL4tiSUJpwf+lXc6gVOP8+nlKPPRkiAhXt2M9k4mfkGoX0erQ==
dependencies:
- "@metascraper/helpers" "^5.10.6"
+ "@metascraper/helpers" "^5.10.7"
-metascraper-image@^5.10.6:
- version "5.10.6"
- resolved "https://registry.yarnpkg.com/metascraper-image/-/metascraper-image-5.10.6.tgz#b23ec4bfab0467342b294f3d049c7b7e9a1dd071"
- integrity sha512-/+m0VaaqnBgNREun/8jcq+clc4s9Z0FAuMO/TQf/mrz9SbcmpHeTD0WpiGJgEa9zYSbuEQYHdBkxhpw+SdJPCA==
+metascraper-image@^5.11.1:
+ version "5.11.1"
+ resolved "https://registry.yarnpkg.com/metascraper-image/-/metascraper-image-5.11.1.tgz#e63e9ff045441783f9aa8c684e04927cac289e44"
+ integrity sha512-Nz2ZTecj2V0KgK2QE390dOSedppaG2PtUBrTz/oaFLMZEReBtMVrcygYm9VuuTpa6XwkubvuBaouCRah12zdfg==
dependencies:
- "@metascraper/helpers" "^5.10.6"
+ "@metascraper/helpers" "^5.11.1"
metascraper-lang-detector@^4.10.2:
version "4.10.2"
@@ -6206,74 +6249,74 @@ metascraper-lang-detector@^4.10.2:
franc "~4.0.0"
iso-639-3 "~1.1.0"
-metascraper-lang@^5.10.6:
- version "5.10.6"
- resolved "https://registry.yarnpkg.com/metascraper-lang/-/metascraper-lang-5.10.6.tgz#d4130257f6604095e9af8d796a6bde5815f6c667"
- integrity sha512-JDhNbP1iSnPV7d6PklIIdBSzlwqbtvH+n810Isa5/PGuvUkJzNkTAUN+eTM1i6YcTlMp1N2gYsQG9uwfpMwFog==
+metascraper-lang@^5.10.7:
+ version "5.10.7"
+ resolved "https://registry.yarnpkg.com/metascraper-lang/-/metascraper-lang-5.10.7.tgz#fe07c359b757ef3c5ba0a330da97173945196fde"
+ integrity sha512-ulLq7g+X4F9XzoScNflkhwWUuoSycbOqJ8j7vT6E/sHYPid+BdUnw2yaxAqXOdsrsbUEWzkiDwrJiq37XWCpDA==
dependencies:
- "@metascraper/helpers" "^5.10.6"
+ "@metascraper/helpers" "^5.10.7"
-metascraper-logo@^5.10.6:
- version "5.10.6"
- resolved "https://registry.yarnpkg.com/metascraper-logo/-/metascraper-logo-5.10.6.tgz#22223ce79e4017f159b2a9ddc311d2eb636043b5"
- integrity sha512-/uGW+X43T6Oj5DxWqAhANII9BdhQuM+e7O6/Vu116uLqW6cOJ/RDp5qp7ngKF41L0zCLd8Q2Xw2nduHi6tC4Uw==
+metascraper-logo@^5.10.7:
+ version "5.10.7"
+ resolved "https://registry.yarnpkg.com/metascraper-logo/-/metascraper-logo-5.10.7.tgz#335812b9aae5d814b22294cdd402d62fa14a46f1"
+ integrity sha512-Ic9WgvRqm3pUlsMfSirzCK9+qmQ9pbv/u9APn8PM5y66zNJoSCOVWbEIoEA0bVPHbGKGKFvsgrOm3VkMoVUF0Q==
dependencies:
- "@metascraper/helpers" "^5.10.6"
+ "@metascraper/helpers" "^5.10.7"
-metascraper-publisher@^5.10.6:
- version "5.10.6"
- resolved "https://registry.yarnpkg.com/metascraper-publisher/-/metascraper-publisher-5.10.6.tgz#95dde6ecef3c7b890ac625893ab374096bebe1f4"
- integrity sha512-4jTOpbIwXBADl6z39UzQ4DZLeVoj4Q+5dcHbEgGn9MQ9878FgxiJKyrHzYvqfe9fRNd0PcaFMuuwLyhz58haoA==
+metascraper-publisher@^5.10.7:
+ version "5.10.7"
+ resolved "https://registry.yarnpkg.com/metascraper-publisher/-/metascraper-publisher-5.10.7.tgz#7add40be1625a4215e2ec36dedaaaf213c1870e2"
+ integrity sha512-aRws5ksH+gzb49nc41oJdoJS2jG/2vC3GCi68n4Evy/TL7TYCnbZXqcgT5U0ne1kFxCZlHB6rl0DcXkx/JlT5Q==
dependencies:
- "@metascraper/helpers" "^5.10.6"
+ "@metascraper/helpers" "^5.10.7"
-metascraper-soundcloud@^5.10.6:
- version "5.10.6"
- resolved "https://registry.yarnpkg.com/metascraper-soundcloud/-/metascraper-soundcloud-5.10.6.tgz#7aff2e17214b6939719ea726a0f5a5fe2a48c5a5"
- integrity sha512-WO+B81e04Hng4/YOtq4dpNv9CrGWVemrNuZk3iIJU+B+gF3YpzdERxS4aIpM7KHcY/c8xu3xDM3LrSUWXWjM3g==
+metascraper-soundcloud@^5.10.7:
+ version "5.10.7"
+ resolved "https://registry.yarnpkg.com/metascraper-soundcloud/-/metascraper-soundcloud-5.10.7.tgz#64a5518324ea69576ab9c206f29a60160fb89e91"
+ integrity sha512-KPM/g+l1m0tp4YOu8qF1RUT7yondaY1S/0aieUUFck/iE3VA1i3MJTLLygIc+67fcbHqcz60qfPTOvYbl6sIPw==
dependencies:
- "@metascraper/helpers" "^5.10.6"
+ "@metascraper/helpers" "^5.10.7"
tldts "~5.6.3"
-metascraper-title@^5.10.6:
- version "5.10.6"
- resolved "https://registry.yarnpkg.com/metascraper-title/-/metascraper-title-5.10.6.tgz#0fd9a9bed7a0b990663086cdab45d11cd8cd3c7d"
- integrity sha512-x4P8zr0x6Gh3gt26tf2xfjikG9xNS9MC3z4N2VP+OrYNuCc7Vz6TU+DR/DLAeZphsb1flgTd3P4iUfPUcWVTEQ==
+metascraper-title@^5.10.7:
+ version "5.10.7"
+ resolved "https://registry.yarnpkg.com/metascraper-title/-/metascraper-title-5.10.7.tgz#037aaa8cbdc79d1dde186887eb2bba542281315e"
+ integrity sha512-iQYaMdGpBPj6dyk7rbP+zYo7EroC/1yY27jocAqUnMRTfrHXTR7kGucR0vi4y14BiFRLBTLSNbZbM4KAUQsFjg==
dependencies:
- "@metascraper/helpers" "^5.10.6"
+ "@metascraper/helpers" "^5.10.7"
lodash "~4.17.15"
-metascraper-url@^5.10.6:
- version "5.10.6"
- resolved "https://registry.yarnpkg.com/metascraper-url/-/metascraper-url-5.10.6.tgz#45f0ea173fecfe56d60b3cddd3c018f9f4fd9b92"
- integrity sha512-7F6uAsI27iVXxUMwwzXH0ret81CX1jgtoGCMz+TvZkyS0z4aUs0r8QpYRYEQuXrW+JawRVik0up54F/ScslObQ==
+metascraper-url@^5.10.7:
+ version "5.10.7"
+ resolved "https://registry.yarnpkg.com/metascraper-url/-/metascraper-url-5.10.7.tgz#42b71c8540c13baafb7757972ea672721d63e019"
+ integrity sha512-z1LBPTupU5cF36/i/iGe0rzLbO7iGBSdbgEOztLcnIhnMC8Nl9xjvIrlvNciKTMxDyr3JGrvFFWugFzwMzVoQg==
dependencies:
- "@metascraper/helpers" "^5.10.6"
+ "@metascraper/helpers" "^5.10.7"
-metascraper-video@^5.10.6:
- version "5.10.6"
- resolved "https://registry.yarnpkg.com/metascraper-video/-/metascraper-video-5.10.6.tgz#8425d2dfc378b20612e8ef9324989a33bc0341b3"
- integrity sha512-DzWBCe/z86QFv6mN9ZDmvk32FMWv+nPDSkyMEL7RCU6VeQOFFAOjwhDglp2qBMs8Xif358bQ4H/0akLZpDUfvw==
+metascraper-video@^5.10.7:
+ version "5.10.7"
+ resolved "https://registry.yarnpkg.com/metascraper-video/-/metascraper-video-5.10.7.tgz#2892819a3613ddac115ada7fb1b28d74a646f974"
+ integrity sha512-+fjiL/Vq0DGd7dMvBTdFKrOK2YH2myHssSChRZVZLl3gzyo4YEWpnOWBhfuoky0caOcs9+RVAxF9pE1TdTFmbA==
dependencies:
- "@metascraper/helpers" "^5.10.6"
+ "@metascraper/helpers" "^5.10.7"
lodash "~4.17.15"
-metascraper-youtube@^5.10.6:
- version "5.10.6"
- resolved "https://registry.yarnpkg.com/metascraper-youtube/-/metascraper-youtube-5.10.6.tgz#6cacabb1791b06ed98a7da69aa00c1c6c50a2dfe"
- integrity sha512-Yl5kEFawqpSGmVSG2yTVZj7mGfRSFGQ2A4cxpqSbaPIUCGJwG9BUJkMzyUG0m6jGrg0zI5CmeZGNBAXzgKGz4g==
+metascraper-youtube@^5.10.7:
+ version "5.10.7"
+ resolved "https://registry.yarnpkg.com/metascraper-youtube/-/metascraper-youtube-5.10.7.tgz#6c3313563ee57cb71c496fa99c129ad41fe22291"
+ integrity sha512-T4ZawYpW/2lyoVUY9RM92YCxkuyhNDXFxg8XAG9u2hoNZ5elrHLOv67ao5zMHa7IXZY3A7IGDOBd1NfoShnToA==
dependencies:
- "@metascraper/helpers" "^5.10.6"
+ "@metascraper/helpers" "^5.10.7"
get-video-id "~3.1.4"
is-reachable "~4.0.0"
p-locate "~4.1.0"
-metascraper@^5.10.6:
- version "5.10.6"
- resolved "https://registry.yarnpkg.com/metascraper/-/metascraper-5.10.6.tgz#d1249577a768566b86bd099cc2256df45cf05181"
- integrity sha512-mPEDvoyHLWb0AlTE05W43vfKGgBJ99s5AYAhB4IiRgGR9uq8j7/ktTZaS/+pyFopYrEoe71L/k4KbYgNPQRASA==
+metascraper@^5.11.0:
+ version "5.11.0"
+ resolved "https://registry.yarnpkg.com/metascraper/-/metascraper-5.11.0.tgz#bbb25eb055c0ec03992df99c10c48057751ee56b"
+ integrity sha512-IocQqdSQnOpbai0X9Cu37w/AKeSfU513MCfaFzzcvWgI8s6mGQ1DWRFPvkx0ahtixpP0/ifE4t7ycODrtepRxQ==
dependencies:
- "@metascraper/helpers" "^5.10.6"
+ "@metascraper/helpers" "^5.10.7"
cheerio "~1.0.0-rc.3"
cheerio-advanced-selectors "~2.0.1"
lodash "~4.17.15"
@@ -6325,24 +6368,12 @@ migrate@^1.6.2:
mkdirp "^0.5.1"
slug "^0.9.2"
-mime-db@1.40.0:
- version "1.40.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32"
- integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==
-
mime-db@1.43.0:
version "1.43.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58"
integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==
-mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.22, mime-types@~2.1.24:
- version "2.1.24"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81"
- integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==
- dependencies:
- mime-db "1.40.0"
-
-mime-types@~2.1.26:
+mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.22, mime-types@~2.1.24, mime-types@~2.1.26:
version "2.1.26"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06"
integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==
@@ -6702,10 +6733,10 @@ normalize-url@~4.2.0:
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.2.0.tgz#e747f16b58e6d7f391495fd86415fa04ec7c9897"
integrity sha512-n69+KXI+kZApR+sPwSkoAXpGlNkaiYyoHHqKOFPjJWvwZpew/EjKvuPE4+tStNgb42z5yLtdakgZCQI+LalSPg==
-normalize-url@~4.5.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129"
- integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==
+normalize-url@~5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-5.0.0.tgz#f46c9dc20670495e4e18fbd1b4396e41d199f63c"
+ integrity sha512-bAEm2fx8Dq/a35Z6PIRkkBBJvR56BbEJvhpNtvCZ4W9FyORSna77fn+xtYFjqk5JpBS+fMnAOG/wFgkQBmB7hw==
npm-bundled@^1.0.1:
version "1.0.6"
@@ -7328,7 +7359,7 @@ pseudomap@^1.0.2:
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
-psl@^1.1.24, psl@^1.1.28:
+psl@^1.1.28:
version "1.3.0"
resolved "https://registry.yarnpkg.com/psl/-/psl-1.3.0.tgz#e1ebf6a3b5564fa8376f3da2275da76d875ca1bd"
integrity sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==
@@ -7351,11 +7382,6 @@ punycode2@~1.0.0:
resolved "https://registry.yarnpkg.com/punycode2/-/punycode2-1.0.0.tgz#e2b4b9a9a8ff157d0b84438e203181ee7892dfd8"
integrity sha1-4rS5qaj/FX0LhEOOIDGB7niS39g=
-punycode@^1.4.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
- integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
-
punycode@^2.1.0, punycode@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
@@ -7506,6 +7532,23 @@ realpath-native@^1.1.0:
dependencies:
util.promisify "^1.0.0"
+redis-commands@1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.5.0.tgz#80d2e20698fe688f227127ff9e5164a7dd17e785"
+ integrity sha512-6KxamqpZ468MeQC3bkWmCB1fp56XL64D4Kf0zJSwDZbVLLm7KFkoIcHrgRvQ+sk8dnhySs7+yBg94yIkAK7aJg==
+
+redis-errors@^1.0.0, redis-errors@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad"
+ integrity sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=
+
+redis-parser@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4"
+ integrity sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=
+ dependencies:
+ redis-errors "^1.0.0"
+
referrer-policy@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/referrer-policy/-/referrer-policy-1.2.0.tgz#b99cfb8b57090dc454895ef897a4cc35ef67a98e"
@@ -7628,10 +7671,10 @@ request-promise-native@^1.0.7, request-promise-native@^1.0.8:
stealthy-require "^1.1.1"
tough-cookie "^2.3.3"
-request@^2.88.0, request@~2.88.0:
- version "2.88.0"
- resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
- integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
+request@^2.88.0, request@~2.88.2:
+ version "2.88.2"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
+ integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
dependencies:
aws-sign2 "~0.7.0"
aws4 "^1.8.0"
@@ -7640,7 +7683,7 @@ request@^2.88.0, request@~2.88.0:
extend "~3.0.2"
forever-agent "~0.6.1"
form-data "~2.3.2"
- har-validator "~5.1.0"
+ har-validator "~5.1.3"
http-signature "~1.2.0"
is-typedarray "~1.0.0"
isstream "~0.1.2"
@@ -7650,7 +7693,7 @@ request@^2.88.0, request@~2.88.0:
performance-now "^2.1.0"
qs "~6.5.2"
safe-buffer "^5.1.2"
- tough-cookie "~2.4.3"
+ tough-cookie "~2.5.0"
tunnel-agent "^0.6.0"
uuid "^3.3.2"
@@ -7754,6 +7797,11 @@ rimraf@^3.0.0:
dependencies:
glob "^7.1.3"
+rosie@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/rosie/-/rosie-2.0.1.tgz#c250c4787ce450b72aa9eff26509f68589814fa2"
+ integrity sha1-wlDEeHzkULcqqe/yZQn2hYmBT6I=
+
router-ips@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/router-ips/-/router-ips-1.0.0.tgz#44e00858ebebc0133d58e40b2cd8a1fbb04203f5"
@@ -8208,6 +8256,11 @@ stacktrace-js@^2.0.0:
stack-generator "^2.0.1"
stacktrace-gps "^3.0.1"
+standard-as-callback@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.0.1.tgz#ed8bb25648e15831759b6023bdb87e6b60b38126"
+ integrity sha512-NQOxSeB8gOI5WjSaxjBgog2QFw55FV8TkS6Y07BiB3VJ8xNTvUYm0wl0s8ObgQ5NhdpnNfigMIKjgPESzgr4tg==
+
static-extend@^0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
@@ -8673,7 +8726,7 @@ touch@^3.1.0:
dependencies:
nopt "~1.0.10"
-tough-cookie@^2.3.3:
+tough-cookie@^2.3.3, tough-cookie@~2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
@@ -8690,14 +8743,6 @@ tough-cookie@^3.0.1:
psl "^1.1.28"
punycode "^2.1.1"
-tough-cookie@~2.4.3:
- version "2.4.3"
- resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781"
- integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==
- dependencies:
- psl "^1.1.24"
- punycode "^1.4.1"
-
tr46@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
diff --git a/cypress/fixtures/humanconnection.png b/cypress/fixtures/humanconnection.png
new file mode 100644
index 000000000..f0576413f
Binary files /dev/null and b/cypress/fixtures/humanconnection.png differ
diff --git a/cypress/integration/administration/TagsAndCategories.feature b/cypress/integration/administration/TagsAndCategories.feature
index f93cdb59c..516966c6b 100644
--- a/cypress/integration/administration/TagsAndCategories.feature
+++ b/cypress/integration/administration/TagsAndCategories.feature
@@ -14,9 +14,8 @@ Feature: Tags and Categories
looking at the popularity of a tag.
Background:
- Given my user account has the role "admin"
+ Given I am logged in with a "admin" role
And we have a selection of tags and categories as well as posts
- And I am logged in
Scenario: See an overview of categories
When I navigate to the administration dashboard
diff --git a/cypress/integration/common/post.js b/cypress/integration/common/post.js
index 53b204feb..f1380378f 100644
--- a/cypress/integration/common/post.js
+++ b/cypress/integration/common/post.js
@@ -1,5 +1,8 @@
import { When, Then } from "cypress-cucumber-preprocessor/steps";
+import locales from '../../../webapp/locales'
+import orderBy from 'lodash/orderBy'
+const languages = orderBy(locales, 'name')
const narratorAvatar =
"https://s3.amazonaws.com/uifaces/faces/twitter/nerrsoft/128.jpg";
@@ -84,3 +87,82 @@ And("the post with title {string} has a ribbon for pinned posts", (title) => {
Then("I see a toaster with {string}", (title) => {
cy.get(".iziToast-message").should("contain", title);
})
+
+Then("I should be able to {string} a teaser image", condition => {
+ cy.reload()
+ const teaserImageUpload = (condition === 'change') ? "humanconnection.png" : "onourjourney.png";
+ cy.fixture(teaserImageUpload).as('postTeaserImage').then(function() {
+ cy.get("#postdropzone").upload(
+ { fileContent: this.postTeaserImage, fileName: teaserImageUpload, mimeType: "image/png" },
+ { subjectType: "drag-n-drop", force: true }
+ );
+ })
+})
+
+Then('confirm crop', () => {
+ cy.get('.crop-confirm')
+ .click()
+})
+
+Then("I add all required fields", () => {
+ cy.get('input[name="title"]')
+ .type('new post')
+ .get(".editor .ProseMirror")
+ .type('new post content')
+ .get(".categories-select .base-button")
+ .first()
+ .click()
+ .get('.ds-flex-item > .ds-form-item .ds-select ')
+ .click()
+ .get('.ds-select-option')
+ .eq(languages.findIndex(l => l.code === 'en'))
+ .click()
+})
+
+Then("the post was saved successfully with the {string} teaser image", condition => {
+ cy.get(".ds-card-content > .ds-heading")
+ .should("contain", condition === 'updated' ? 'to be updated' : 'new post')
+ .get(".content")
+ .should("contain", condition === 'updated' ? 'successfully updated' : 'new post content')
+ .get('.post-page img')
+ .should("have.attr", "src")
+ .and("contains", condition === 'updated' ? 'humanconnection' : 'onourjourney')
+})
+
+Then("the first image should be removed from the preview", () => {
+ cy.fixture("humanconnection.png").as('postTeaserImage').then(function() {
+ cy.get("#postdropzone")
+ .children()
+ .get('img.thumbnail-preview')
+ .should('have.length', 1)
+ .and('have.attr', 'src')
+ .and('contain', this.postTeaserImage)
+ })
+})
+
+Then('the {string} post was saved successfully without a teaser image', condition => {
+ cy.get(".ds-card-content > .ds-heading")
+ .should("contain", condition === 'updated' ? 'to be updated' : 'new post')
+ .get(".content")
+ .should("contain", condition === 'updated' ? 'successfully updated' : 'new post content')
+ .get('.post-page')
+ .should('exist')
+ .get('.post-page img.ds-card-image')
+ .should('not.exist')
+})
+
+Then('I should be able to remove it', () => {
+ cy.get('.crop-cancel')
+ .click()
+})
+
+When('my post has a teaser image', () => {
+ cy.get('.contribution-image')
+ .should('exist')
+ .and('have.attr', 'src')
+})
+
+Then('I should be able to remove the image', () => {
+ cy.get('.delete-image')
+ .click()
+})
\ No newline at end of file
diff --git a/cypress/integration/common/report.js b/cypress/integration/common/report.js
index 77c97b53b..fe7a31363 100644
--- a/cypress/integration/common/report.js
+++ b/cypress/integration/common/report.js
@@ -30,16 +30,24 @@ Given("I see David Irving's post on the post page", page => {
})
Given('I am logged in with a {string} role', role => {
- cy.factory().create('User', {
+ cy.factory().build('user', {
+ termsAndConditionsAgreedVersion: VERSION,
+ role,
+ name: `${role} is my name`
+ }, {
email: `${role}@example.org`,
password: '1234',
- termsAndConditionsAgreedVersion: VERSION,
- role
- })
- cy.login({
- email: `${role}@example.org`,
- password: '1234'
})
+ cy.neode()
+ .first("User", {
+ name: `${role} is my name`,
+ })
+ .then(user => {
+ return new Cypress.Promise((resolve, reject) => {
+ return user.toJson().then((user) => resolve(user))
+ })
+ })
+ .then(user => cy.login(user))
})
When('I click on "Report Post" from the content menu of the post', () => {
@@ -127,7 +135,7 @@ Given('somebody reported the following posts:', table => {
password: '1234'
}
cy.factory()
- .create('User', submitter)
+ .build('user', {}, submitter)
.authenticateAs(submitter)
.mutate(gql`mutation($resourceId: ID!, $reasonCategory: ReasonCategory!, $reasonDescription: String!) {
fileReport(resourceId: $resourceId, reasonCategory: $reasonCategory, reasonDescription: $reasonDescription) {
@@ -166,8 +174,9 @@ Then('I can visit the post page', () => {
When("they have a post someone has reported", () => {
cy.factory()
- .create("Post", {
- authorId: 'annnoying-user',
+ .build("post", {
title,
+ }, {
+ authorId: 'annnoying-user',
});
})
diff --git a/cypress/integration/common/steps.js b/cypress/integration/common/steps.js
index 42a5a511d..f95f95f21 100644
--- a/cypress/integration/common/steps.js
+++ b/cypress/integration/common/steps.js
@@ -25,7 +25,6 @@ const narratorParams = {
name: "Peter Pan",
slug: "peter-pan",
avatar: "https://s3.amazonaws.com/uifaces/faces/twitter/nerrsoft/128.jpg",
- ...loginCredentials,
...termsAndConditionsAgreedVersion,
};
@@ -33,65 +32,82 @@ const annoyingParams = {
email: "spammy-spammer@example.org",
slug: 'spammy-spammer',
password: "1234",
- ...termsAndConditionsAgreedVersion
};
Given("I am logged in", () => {
- cy.login(loginCredentials);
+ cy.neode()
+ .first("User", {
+ name: narratorParams.name
+ })
+ .then(user => {
+ return new Cypress.Promise((resolve, reject) => {
+ return user.toJson().then((user) => resolve(user))
+ })
+ })
+ .then(user => cy.login(user))
});
+Given("I log in as {string}", name => {
+ cy.logout()
+ cy.neode()
+ .first("User", {
+ name
+ })
+ .then(user => {
+ return new Cypress.Promise((resolve, reject) => {
+ return user.toJson().then((user) => resolve(user))
+ })
+ })
+ .then(user => cy.login(user))
+})
+
Given("the {string} user searches for {string}", (_, postTitle) => {
cy.logout()
- .login({ email: annoyingParams.email, password: '1234' })
- .get(".searchable-input .ds-select input")
+ cy.neode()
+ .first("User", {
+ id: "annoying-user"
+ })
+ .then(user => {
+ return new Cypress.Promise((resolve, reject) => {
+ return user.toJson().then((user) => resolve(user))
+ })
+ })
+ .then(user => cy.login(user))
+ cy.get(".searchable-input .ds-select input")
.focus()
.type(postTitle);
});
Given("we have a selection of categories", () => {
- cy.createCategories("cat0", "just-for-fun");
+ cy.factory().build('category', { id: "cat0", slug: "just-for-fun" });
});
Given("we have a selection of tags and categories as well as posts", () => {
- cy.createCategories("cat12")
- .factory()
- .create("Tag", {
- id: "Ecology"
- })
- .create("Tag", {
- id: "Nature"
- })
- .create("Tag", {
- id: "Democracy"
- });
-
cy.factory()
- .create("User", {
- id: 'a1'
- })
- .create("Post", {
+ .build('category', { id: 'cat12', name: "Just For Fun", icon: "smile", })
+ .build('category', { id: 'cat121', name: "Happiness & Values", icon: "heart-o"})
+ .build('category', { id: 'cat122', name: "Health & Wellbeing", icon: "medkit"})
+ .build("tag", { id: "Ecology" })
+ .build("tag", { id: "Nature" })
+ .build("tag", { id: "Democracy" })
+ .build("user", { id: 'a1' })
+ .build("post", {}, {
authorId: 'a1',
tagIds: ["Ecology", "Nature", "Democracy"],
categoryIds: ["cat12"]
})
- .create("Post", {
+ .build("post", {}, {
authorId: 'a1',
tagIds: ["Nature", "Democracy"],
categoryIds: ["cat121"]
- });
-
- cy.factory()
- .create("User", {
- id: 'a2'
})
- .create("Post", {
+ .build("user", { id: 'a2' })
+ .build("post", {}, {
authorId: 'a2',
tagIds: ['Nature', 'Democracy'],
categoryIds: ["cat12"]
- });
- cy.factory()
- .create("Post", {
- authorId: narratorParams.id,
+ })
+ .build("post", {}, {
tagIds: ['Democracy'],
categoryIds: ["cat122"]
})
@@ -99,23 +115,22 @@ Given("we have a selection of tags and categories as well as posts", () => {
Given("we have the following user accounts:", table => {
table.hashes().forEach(params => {
- cy.factory().create("User", {
+ cy.factory().build("user", {
...params,
...termsAndConditionsAgreedVersion
- });
+ }, params);
});
});
Given("I have a user account", () => {
- cy.factory().create("User", narratorParams);
+ cy.factory().build("user", narratorParams, loginCredentials);
});
Given("my user account has the role {string}", role => {
- cy.factory().create("User", {
+ cy.factory().build("user", {
role,
- ...loginCredentials,
...termsAndConditionsAgreedVersion,
- });
+ }, loginCredentials);
});
When("I log out", cy.logout);
@@ -130,8 +145,17 @@ When("I visit the {string} page", page => {
When("a blocked user visits the post page of one of my authored posts", () => {
cy.logout()
- .login({ email: annoyingParams.email, password: annoyingParams.password })
- .openPage('/post/previously-created-post')
+ cy.neode()
+ .first("User", {
+ name: 'Harassing User'
+ })
+ .then(user => {
+ return new Cypress.Promise((resolve, reject) => {
+ return user.toJson().then((user) => resolve(user))
+ })
+ })
+ .then(user => cy.login(user))
+ cy.openPage('post/previously-created-post')
})
Given("I am on the {string} page", page => {
@@ -139,7 +163,7 @@ Given("I am on the {string} page", page => {
});
When("I fill in my email and password combination and click submit", () => {
- cy.login(loginCredentials);
+ cy.manualLogin(loginCredentials);
});
When(/(?:when )?I refresh the page/, () => {
@@ -203,33 +227,29 @@ When("I press {string}", label => {
cy.contains(label).click();
});
-Given("we have this user in our database:", table => {
- const [firstRow] = table.hashes()
- cy.factory().create('User', firstRow)
-})
-
-Given("we have the following posts in our database:", table => {
- cy.factory().create('Category', {
- id: `cat-456`,
- name: "Just For Fun",
- slug: `just-for-fun`,
- icon: "smile"
- })
-
- table.hashes().forEach(({
- ...postAttributes
- }, i) => {
- postAttributes = {
- ...postAttributes,
- deleted: Boolean(postAttributes.deleted),
- disabled: Boolean(postAttributes.disabled),
- pinned: Boolean(postAttributes.pinned),
- categoryIds: ['cat-456']
- }
- cy.factory().create("Post", postAttributes);
+Given("we have the following comments in our database:", table => {
+ table.hashes().forEach((attributesOrOptions, i) => {
+ cy.factory().build("comment", {
+ ...attributesOrOptions,
+ }, {
+ ...attributesOrOptions,
+ });
})
});
+Given("we have the following posts in our database:", table => {
+ table.hashes().forEach((attributesOrOptions, i) => {
+ cy.factory().build("post", {
+ ...attributesOrOptions,
+ deleted: Boolean(attributesOrOptions.deleted),
+ disabled: Boolean(attributesOrOptions.disabled),
+ pinned: Boolean(attributesOrOptions.pinned),
+ }, {
+ ...attributesOrOptions,
+ });
+ })
+})
+
Then("I see a success message:", message => {
cy.contains(message);
});
@@ -242,15 +262,20 @@ When(
"I click on the big plus icon in the bottom right corner to create post",
() => {
cy.get(".post-add-button").click();
+ cy.location("pathname").should('eq', '/post/create')
}
);
Given("I previously created a post", () => {
- lastPost.authorId = narratorParams.id
- lastPost.title = "previously created post";
- lastPost.content = "with some content";
+ lastPost = {
+ lastPost,
+ title: "previously created post",
+ content: "with some content",
+ };
cy.factory()
- .create("Post", lastPost);
+ .build("post", lastPost, {
+ authorId: narratorParams.id
+ });
});
When("I choose {string} as the title of the post", title => {
@@ -311,17 +336,27 @@ Then(
cy.visit(route, {
failOnStatusCode: false
});
- cy.get(".error").should("contain", message);
+ cy.get(".error-message").should("contain", message);
}
);
-Given("my user account has the following login credentials:", table => {
+Given("I am logged in with these credentials:", table => {
loginCredentials = table.hashes()[0];
cy.debug();
- cy.factory().create("User", {
+ cy.factory().build("user", {
...termsAndConditionsAgreedVersion,
- ...loginCredentials
- });
+ name: loginCredentials.email,
+ }, loginCredentials);
+ cy.neode()
+ .first("User", {
+ name: loginCredentials.email,
+ })
+ .then(user => {
+ return new Cypress.Promise((resolve, reject) => {
+ return user.toJson().then((user) => resolve(user))
+ })
+ })
+ .then(user => cy.login(user))
});
When("I fill the password form with:", table => {
@@ -340,45 +375,16 @@ When("submit the form", () => {
Then("I cannot login anymore with password {string}", password => {
cy.reload();
- const {
- email
- } = loginCredentials;
- cy.visit(`/login`);
- cy.get("input[name=email]")
- .trigger("focus")
- .type(email);
- cy.get("input[name=password]")
- .trigger("focus")
- .type(password);
- cy.get("button[name=submit]")
- .as("submitButton")
- .click();
- cy.get(".iziToast-wrapper").should(
- "contain",
- "Incorrect email address or password."
- );
+ const { email } = loginCredentials
+ cy.manualLogin({ email, password })
+ .get(".iziToast-wrapper").should("contain", "Incorrect email address or password.");
});
Then("I can login successfully with password {string}", password => {
cy.reload();
- cy.login({
- ...loginCredentials,
- ...{
- password
- }
- });
- cy.get(".iziToast-wrapper").should("contain", "You are logged in!");
-});
-
-When("I log in with the following credentials:", table => {
- const {
- email,
- password
- } = table.hashes()[0];
- cy.login({
- email,
- password
- });
+ const { email } = loginCredentials
+ cy.manualLogin({ email, password })
+ .get(".iziToast-wrapper").should("contain", "You are logged in!");
});
When("open the notification menu and click on the first item", () => {
@@ -428,12 +434,11 @@ Then("there are no notifications in the top menu", () => {
});
Given("there is an annoying user called {string}", name => {
- cy.factory().create("User", {
- ...annoyingParams,
+ cy.factory().build("user", {
id: "annoying-user",
name,
...termsAndConditionsAgreedVersion,
- });
+ }, annoyingParams);
});
Given("there is an annoying user who has muted me", () => {
@@ -451,15 +456,15 @@ Given("there is an annoying user who has muted me", () => {
});
Given("I am on the profile page of the annoying user", name => {
- cy.openPage("/profile/annoying-user/spammy-spammer");
+ cy.openPage("profile/annoying-user/spammy-spammer");
});
When("I visit the profile page of the annoying user", name => {
- cy.openPage("/profile/annoying-user");
+ cy.openPage("profile/annoying-user");
});
When("I ", name => {
- cy.openPage("/profile/annoying-user");
+ cy.openPage("profile/annoying-user");
});
When(
@@ -498,12 +503,11 @@ Given("I follow the user {string}", name => {
});
Given('{string} wrote a post {string}', (_, title) => {
- cy.createCategories("cat21")
- .factory()
- .create("Post", {
- authorId: 'annoying-user',
+ cy.factory()
+ .build("post", {
title,
- categoryIds: ["cat21"]
+ }, {
+ authorId: 'annoying-user',
});
});
@@ -521,12 +525,11 @@ Then("I get removed from his follower collection", () => {
});
Given("I wrote a post {string}", title => {
- cy.createCategories(`cat213`, title)
- .factory()
- .create("Post", {
- authorId: narratorParams.id,
+ cy.factory()
+ .build("post", {
title,
- categoryIds: ["cat213"]
+ }, {
+ authorId: narratorParams.id,
});
});
@@ -552,22 +555,24 @@ When("I block the user {string}", name => {
.then(blockedUser => {
cy.neode()
.first("User", {
- name: narratorParams.name
+ id: narratorParams.id
})
.relateTo(blockedUser, "blocked");
});
});
-When("I log in with:", table => {
- const [firstRow] = table.hashes();
- const {
- Email,
- Password
- } = firstRow;
- cy.login({
- email: Email,
- password: Password
- });
+When("a user has blocked me", () => {
+ cy.neode()
+ .first("User", {
+ name: narratorParams.name
+ })
+ .then(blockedUser => {
+ cy.neode()
+ .first("User", {
+ name: 'Harassing User'
+ })
+ .relateTo(blockedUser, "blocked");
+ });
});
Then("I see only one post with the title {string}", title => {
@@ -581,6 +586,27 @@ Then("they should not see the comment from", () => {
cy.get(".base-card").children().should('not.have.class', 'comment-form')
})
-Then("they should see a text explaining commenting is not possible", () => {
+Then("they should see a text explaining why commenting is not possible", () => {
cy.get('.ds-placeholder').should('contain', "Commenting is not possible at this time on this post.")
})
+
+Then("I should see no users in my blocked users list", () => {
+ cy.get('.ds-placeholder')
+ .should('contain', "So far, you have not blocked anybody.")
+})
+
+Then("I {string} see {string} from the content menu in the user info box", (condition, link) => {
+ cy.get(".user-content-menu .base-button").click()
+ cy.get(".popover .ds-menu-item-link")
+ .should(condition === 'should' ? 'contain' : 'not.contain', link)
+})
+
+Then('I should not see {string} button', button => {
+ cy.get('.ds-card-content .action-buttons')
+ .should('have.length', 1)
+})
+
+Then('I should see the {string} button', button => {
+ cy.get('.ds-card-content .action-buttons .base-button')
+ .should('contain', button)
+})
diff --git a/cypress/integration/moderation/ReportContent.feature b/cypress/integration/moderation/ReportContent.feature
index 105bad5e6..be1a07786 100644
--- a/cypress/integration/moderation/ReportContent.feature
+++ b/cypress/integration/moderation/ReportContent.feature
@@ -62,9 +62,8 @@ Feature: Report and Moderate
Given somebody reported the following posts:
| submitterEmail | resourceId | reasonCategory | reasonDescription |
| p2.submitter@example.org | p2 | other | Offensive content |
- And my user account has the role "moderator"
+ And I am logged in with a "moderator" role
And there is an annoying user who has muted me
- And I am logged in
When I click on the avatar menu in the top right corner
And I click on "Moderation"
Then I see all the reported posts including from the user who muted me
diff --git a/cypress/integration/notifications/Mentions.feature b/cypress/integration/notifications/Mentions.feature
index ef2694abc..02dc0abd2 100644
--- a/cypress/integration/notifications/Mentions.feature
+++ b/cypress/integration/notifications/Mentions.feature
@@ -11,9 +11,7 @@ Feature: Notification for a mention
| Matt Rider | matt-rider | matt@example.org | 4321 |
Scenario: Mention another user, re-login as this user and see notifications
- Given I log in with the following credentials:
- | email | password |
- | wolle@example.org | 1234 |
+ Given I log in as "Wolle aus Hamburg"
And I start to write a new post with the title "Hey Matt" beginning with:
"""
Big shout to our fellow contributor
@@ -23,9 +21,7 @@ Feature: Notification for a mention
And I choose "en" as the language for the post
And I click on "Save"
When I log out
- And I log in with the following credentials:
- | email | password |
- | matt@example.org | 4321 |
+ And I log in as "Matt Rider"
And see 1 unread notifications in the top menu
And open the notification menu and click on the first item
Then I get to the post page of ".../hey-matt"
diff --git a/cypress/integration/post/Comment.feature b/cypress/integration/post/Comment.feature
index 66cf7a6d7..da261726b 100644
--- a/cypress/integration/post/Comment.feature
+++ b/cypress/integration/post/Comment.feature
@@ -6,8 +6,11 @@ Feature: Post Comment
Background:
Given I have a user account
And we have the following posts in our database:
- | id | title | slug | authorId | commentContent |
- | bWBjpkTKZp | 101 Essays that will change the way you think | 101-essays | id-of-peter-pan | @peter-pan reply to me |
+ | id | title | slug | authorId |
+ | bWBjpkTKZp | 101 Essays that will change the way you think | 101-essays | id-of-peter-pan |
+ And we have the following comments in our database:
+ | postId | content | authorId |
+ | bWBjpkTKZp | @peter-pan reply to me | id-of-peter-pan |
And I am logged in
Scenario: Comment creation
diff --git a/cypress/integration/post/DeleteImage.feature b/cypress/integration/post/DeleteImage.feature
new file mode 100644
index 000000000..a3fa6f9b6
--- /dev/null
+++ b/cypress/integration/post/DeleteImage.feature
@@ -0,0 +1,19 @@
+Feature: Delete Teaser Image
+ As a user
+ I would like to be able to remove an image I have previously added to my Post
+ So that I have control over the content of my Post
+
+ Background:
+ Given I have a user account
+ Given I am logged in
+ Given we have the following posts in our database:
+ | authorId | id | title | content |
+ | id-of-peter-pan | p1 | Post to be updated | successfully updated |
+
+ Scenario: Delete existing image
+ Given I am on the 'post/edit/p1' page
+ And my post has a teaser image
+ Then I should be able to remove the image
+ And I click on "Save"
+ Then I get redirected to ".../post-to-be-updated"
+ And the "updated" post was saved successfully without a teaser image
diff --git a/cypress/integration/post/ImageUploader.feature b/cypress/integration/post/ImageUploader.feature
new file mode 100644
index 000000000..2e9f1f5b9
--- /dev/null
+++ b/cypress/integration/post/ImageUploader.feature
@@ -0,0 +1,47 @@
+Feature: Upload Teaser Image
+ As a user
+ I would like to be able to add a teaser image to my Post
+ So that I can personalize my posts
+
+
+ Background:
+ Given I have a user account
+ Given I am logged in
+ Given we have the following posts in our database:
+ | authorId | id | title | content |
+ | id-of-peter-pan | p1 | Post to be updated | successfully updated |
+
+ Scenario: Create a Post with a Teaser Image
+ When I click on the big plus icon in the bottom right corner to create post
+ Then I should be able to "add" a teaser image
+ And confirm crop
+ And I add all required fields
+ And I click on "Save"
+ Then I get redirected to ".../new-post"
+ And the post was saved successfully with the "new" teaser image
+
+ Scenario: Update a Post to add an image
+ Given I am on the 'post/edit/p1' page
+ And I should be able to "change" a teaser image
+ And confirm crop
+ And I click on "Save"
+ Then I see a toaster with "Saved!"
+ And I get redirected to ".../post-to-be-updated"
+ Then the post was saved successfully with the "updated" teaser image
+
+ Scenario: Add image, then add a different image
+ When I click on the big plus icon in the bottom right corner to create post
+ Then I should be able to "add" a teaser image
+ And confirm crop
+ And I should be able to "change" a teaser image
+ And confirm crop
+ And the first image should be removed from the preview
+
+ Scenario: Add image, then delete it
+ When I click on the big plus icon in the bottom right corner to create post
+ Then I should be able to "add" a teaser image
+ And I should be able to remove it
+ And I add all required fields
+ And I click on "Save"
+ Then I get redirected to ".../new-post"
+ And the "new" post was saved successfully without a teaser image
\ No newline at end of file
diff --git a/cypress/integration/user_account/ChangePassword.feature b/cypress/integration/user_account/ChangePassword.feature
index 44e4e5483..dbdf724f7 100644
--- a/cypress/integration/user_account/ChangePassword.feature
+++ b/cypress/integration/user_account/ChangePassword.feature
@@ -9,10 +9,9 @@ Feature: Change password
password or just out of an good habit, you want to change your password.
Background:
- Given my user account has the following login credentials:
+ Given I am logged in with these credentials:
| email | password |
| user@example.org | exposed |
- And I am logged in
Scenario: Change my password
Given I am on the "settings" page
diff --git a/cypress/integration/user_account/Login.feature b/cypress/integration/user_account/Login.feature
index 3837f7042..6e8f60a56 100644
--- a/cypress/integration/user_account/Login.feature
+++ b/cypress/integration/user_account/Login.feature
@@ -7,7 +7,7 @@ Feature: Authentication
Given I have a user account
Scenario: Log in
- When I visit the "/login" page
+ When I visit the "login" page
And I fill in my email and password combination and click submit
Then I can click on my profile picture in the top right corner
And I can see my name "Peter Lustig" in the dropdown menu
diff --git a/cypress/integration/user_profile/BlockUser.feature b/cypress/integration/user_profile/BlockUser.feature
index 43efe7807..256d79dfb 100644
--- a/cypress/integration/user_profile/BlockUser.feature
+++ b/cypress/integration/user_profile/BlockUser.feature
@@ -11,6 +11,7 @@ Feature: Block a User
Scenario: Block a user
Given I am on the profile page of the annoying user
When I click on "Block user" from the content menu in the user info box
+ And I "should" see "Unblock user" from the content menu in the user info box
And I navigate to my "Blocked users" settings page
Then I can see the following table:
| Avatar | Name |
@@ -20,14 +21,15 @@ Feature: Block a User
Given I block the user "Harassing User"
And I previously created a post
And a blocked user visits the post page of one of my authored posts
- Then they should not see the comment from
- And they should see a text explaining commenting is not possible
+ Then they should see a text explaining why commenting is not possible
+ And they should not see the comment form
Scenario: Block a previously followed user
Given I follow the user "Harassing User"
When I visit the profile page of the annoying user
And I click on "Block user" from the content menu in the user info box
And I get removed from his follower collection
+ And I "should" see "Unblock user" from the content menu in the user info box
Scenario: Posts of blocked users are not filtered from search results
Given "Harassing User" wrote a post "You can still see my posts"
@@ -44,3 +46,15 @@ Feature: Block a User
Then I should see the following posts in the select dropdown:
| title |
| previously created post |
+
+ Scenario: Blocked users cannot see they are blocked in their list
+ Given a user has blocked me
+ And I navigate to my "Blocked users" settings page
+ Then I should see no users in my blocked users list
+
+ Scenario: Blocked users should not see link or button to unblock, only blocking users
+ Given a user has blocked me
+ When I visit the profile page of the annoying user
+ And I "should not" see "Unblock user" from the content menu in the user info box
+ And I should see the "Follow" button
+ And I should not see "Unblock user" button
\ No newline at end of file
diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js
index 893b99f4f..cc6ac0e91 100644
--- a/cypress/plugins/index.js
+++ b/cypress/plugins/index.js
@@ -23,7 +23,7 @@ module.exports = (on, config) => {
config.env.NEO4J_URI = parsed.NEO4J_URI
config.env.NEO4J_USERNAME = parsed.NEO4J_USERNAME
config.env.NEO4J_PASSWORD = parsed.NEO4J_PASSWORD
-
+ config.env.JWT_SECRET = parsed.JWT_SECRET
on('file:preprocessor', cucumber())
return config
}
diff --git a/cypress/support/commands.js b/cypress/support/commands.js
index 16ac43a19..75f27d0f7 100644
--- a/cypress/support/commands.js
+++ b/cypress/support/commands.js
@@ -18,20 +18,24 @@ import helpers from "./helpers";
import { GraphQLClient, request } from 'graphql-request'
import { gql } from '../../backend/src/helpers/jest'
import config from '../../backend/src/config'
+import encode from '../../backend/src/jwt/encode'
const switchLang = name => {
cy.get(".locale-menu").click();
cy.contains(".locale-menu-popover a", name).click();
};
-const authenticatedHeaders = async (variables) => {
+const authenticatedHeaders = (variables) => {
const mutation = gql`
mutation($email: String!, $password: String!) {
login(email: $email, password: $password)
}
`
- const response = await request(config.GRAPHQL_URI, mutation, variables)
- return { authorization: `Bearer ${response.login}` }
+ return new Cypress.Promise((resolve, reject) => {
+ request(config.GRAPHQL_URI, mutation, variables).then((response) => {
+ resolve({ authorization: `Bearer ${response.login}` })
+ })
+ })
}
Cypress.Commands.add("switchLanguage", (name, force) => {
@@ -47,7 +51,13 @@ Cypress.Commands.add("switchLanguage", (name, force) => {
}
});
-Cypress.Commands.add("login", ({ email, password }) => {
+Cypress.Commands.add("login", user => {
+ const token = encode(user)
+ cy.setCookie('human-connection-token', token)
+ .visit("/")
+});
+
+Cypress.Commands.add("manualLogin", ({ email, password }) => {
cy.visit(`/login`);
cy.get("input[name=email]")
.trigger("focus")
@@ -58,11 +68,9 @@ Cypress.Commands.add("login", ({ email, password }) => {
cy.get("button[name=submit]")
.as("submitButton")
.click();
- cy.get(".iziToast-message").should("contain", "You are logged in!");
- cy.location("pathname").should("eq", "/");
});
-Cypress.Commands.add("logout", (email, password) => {
+Cypress.Commands.add("logout", () => {
cy.visit(`/logout`);
cy.location("pathname").should("contain", "/login"); // we're out
});
@@ -74,43 +82,24 @@ Cypress.Commands.add("openPage", page => {
cy.visit(`/${page}`);
});
-Cypress.Commands.add("createCategories", (id, slug) => {
- cy.neode()
- .create("Category", {
- id: `${id}`,
- name: "Just For Fun",
- slug: `${slug}`,
- icon: "smile"
- })
- .create("Category", {
- id: `${id}1`,
- name: "Happiness & Values",
- icon: "heart-o"
- })
- .create("Category", {
- id: `${id}2`,
- name: "Health & Wellbeing",
- icon: "medkit"
- });
-});
-
-
Cypress.Commands.add(
'authenticateAs',
- async ({email, password}) => {
- const headers = await authenticatedHeaders({ email, password })
- return new GraphQLClient(config.GRAPHQL_URI, { headers })
- }
-)
+ ({email, password}) => {
+ return new Cypress.Promise((resolve, reject) => {
+ authenticatedHeaders({ email, password }).then((headers) => {
+ resolve(new GraphQLClient(config.GRAPHQL_URI, { headers }))
+ })
+ })
+ })
Cypress.Commands.add(
'mutate',
{ prevSubject: true },
- async (graphQLClient, mutation, variables) => {
- await graphQLClient.request(mutation, variables)
- return graphQLClient
- }
-)
+ (graphQLClient, mutation, variables) => {
+ return new Cypress.Promise((resolve, reject) => {
+ graphQLClient.request(mutation, variables).then(() => resolve(graphQLClient))
+ })
+ })
//
//
diff --git a/cypress/support/factories.js b/cypress/support/factories.js
index 1b76a1a01..d2a8d87ad 100644
--- a/cypress/support/factories.js
+++ b/cypress/support/factories.js
@@ -1,4 +1,4 @@
-import Factory from '../../backend/src/factories'
+import Factory, { cleanDatabase } from '../../backend/src/db/factories'
import { getDriver, getNeode } from '../../backend/src/db/neo4j'
const neo4jConfigs = {
@@ -6,51 +6,38 @@ const neo4jConfigs = {
username: Cypress.env('NEO4J_USERNAME'),
password: Cypress.env('NEO4J_PASSWORD')
}
-const neo4jDriver = getDriver(neo4jConfigs)
const neodeInstance = getNeode(neo4jConfigs)
-const factoryOptions = { neo4jDriver, neodeInstance }
-const factory = Factory(factoryOptions)
-beforeEach(async () => {
- await factory.cleanDatabase()
-})
+beforeEach(() => cleanDatabase())
Cypress.Commands.add('neode', () => {
return neodeInstance
})
+
Cypress.Commands.add(
'first',
{ prevSubject: true },
- async (neode, model, properties) => {
+ (neode, model, properties) => {
return neode.first(model, properties)
}
)
Cypress.Commands.add(
'relateTo',
{ prevSubject: true },
- async (node, otherNode, relationship) => {
+ (node, otherNode, relationship) => {
return node.relateTo(otherNode, relationship)
}
)
-Cypress.Commands.add('factory', () => {
- return Factory(factoryOptions)
-})
+Cypress.Commands.add('factory', () => Factory)
Cypress.Commands.add(
- 'create',
+ 'build',
{ prevSubject: true },
- async (factory, node, properties) => {
- await factory.create(node, properties)
- return factory
+ (factory, name, atrributes, options) => {
+ return new Cypress.Promise((resolve, reject) => {
+ return factory.build(name, atrributes, options).then(() => resolve(factory))
+ })
}
)
-Cypress.Commands.add(
- 'relate',
- { prevSubject: true },
- async (factory, node, relationship, properties) => {
- await factory.relate(node, relationship, properties)
- return factory
- }
-)
diff --git a/deployment/.gitignore b/deployment/.gitignore
index 14cfa18ed..61e591624 100644
--- a/deployment/.gitignore
+++ b/deployment/.gitignore
@@ -2,3 +2,5 @@ secrets.yaml
configmap.yaml
**/secrets.yaml
**/configmap.yaml
+**/staging-values.yaml
+**/production-values.yaml
\ No newline at end of file
diff --git a/deployment/README.md b/deployment/README.md
index 0615ccf9b..09dcd5f00 100644
--- a/deployment/README.md
+++ b/deployment/README.md
@@ -1,11 +1,10 @@
# Human-Connection Nitro \| Deployment Configuration
-We deploy with [kubernetes](https://kubernetes.io/). In order to deploy your own
-network you have to [install kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/)
-and get a kubernetes cluster.
+There are a couple different ways we have tested to deploy an instance of Human Connection, with [kubernetes](https://kubernetes.io/) and via [Helm](https://helm.sh/docs/). In order to manage your own
+network, you have to [install kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/), [install Helm](https://helm.sh/docs/intro/install/) (optional, but the preferred way),
+and set up a kubernetes cluster. Since there are many different options to host your cluster, we won't go into specifics here.
We have tested two different kubernetes providers: [Minikube](./minikube/README.md)
and [Digital Ocean](./digital-ocean/README.md).
-Check out the specific documentation for your provider. After that, learn how
-to apply the specific kubernetes configuration for [Human Connection](./human-connection/README.md).
+Check out the specific documentation for your provider. After that, choose whether you want to go with the recommended deploy option [Helm](./helm/README.md), or use kubernetes to apply the configuration for [Human Connection](./human-connection/README.md).
diff --git a/deployment/helm/human-connection/.helmignore b/deployment/helm/human-connection/.helmignore
new file mode 100644
index 000000000..50af03172
--- /dev/null
+++ b/deployment/helm/human-connection/.helmignore
@@ -0,0 +1,22 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/deployment/helm/human-connection/Chart.yaml b/deployment/helm/human-connection/Chart.yaml
new file mode 100644
index 000000000..525d5a8e8
--- /dev/null
+++ b/deployment/helm/human-connection/Chart.yaml
@@ -0,0 +1,5 @@
+apiVersion: v1
+appVersion: "0.3.1"
+description: A Helm chart for Human Connection
+name: human-connection
+version: 0.1.0
diff --git a/deployment/helm/human-connection/README.md b/deployment/helm/human-connection/README.md
new file mode 100644
index 000000000..444f9da15
--- /dev/null
+++ b/deployment/helm/human-connection/README.md
@@ -0,0 +1,72 @@
+# Helm installation of Human Connection
+
+Deploying Human Connection with Helm is very straight forward. All you have to
+do is to change certain parameters, like domain names and API keys, then you
+just install our provided Helm chart to your cluster.
+
+## Configuration
+
+You can customize the network with your configuration by changing the `values.yaml`, all variables will be available as
+environment variables in your deployed kubernetes pods.
+
+Probably you want to change this environment variable to your actual domain:
+
+```bash
+# in folder /deployment/helm
+CLIENT_URI: "https://develop.human-connection.org"
+```
+
+If you want to edit secrets, you have to `base64` encode them. See [kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/secret/#creating-a-secret-manually). You can also use `helm-secrets`, but we have yet to test it.
+
+```bash
+# example how to base64 a string:
+$ echo -n 'admin' | base64
+YWRtaW4=
+```
+Those secrets get `base64` decoded and are available as environment variables in
+your deployed kubernetes pods.
+
+# https
+If you start with setting up the `https`, when you install the app, it will automatically take care of the certificates for you.
+
+First check that you are using `Helm v3`, this is important since it removes the need for `Tiller`. See, [FAQ](https://helm.sh/docs/faq/#removal-of-tiller)
+
+```bash
+$ helm version
+# output should look similar to this:
+#version.BuildInfo{Version:"v3.0.2", GitCommit:"19e47ee3283ae98139d98460de796c1be1e3975f", GitTreeState:"clean", GoVersion:"go1.13.5"}
+```
+
+Apply cert-manager CRDs before installing (or it will fail)
+
+```bash
+$ kubectl apply --validate=false -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.13.0/deploy/manifests/00-crds.yaml
+```
+
+Next, create the `cert-manager` namespace
+```bash
+$ kubectl create namespace cert-manager
+```
+Add the `jetstack` repo and update
+
+```bash
+$ helm repo add jetstack https://charts.jetstack.io
+$ helm repo update
+```
+
+Install cert-manager
+```bash
+$ helm install cert-manager --namespace cert-manager --version v0.13.0 jetstack/cert-manager
+```
+
+# Deploy
+
+Once you are satisfied with the configuration, you can install the app.
+
+```bash
+# in folder /deployment/helm/human-connection
+$ helm install develop ./ --namespace human-connection
+```
+Where `develop` is the release name, in this case develop for our develop server and `human-connection` is the namespace, again customize for your needs. The release name can be anything you want. Just keep in mind that it is used in the templates to prepend the `CLIENT_URI` and other places.
+
+This will set up everything you need for the network, including `deployments`, and their `pods`, `services`, `ingress`, `volumes`(PersitentVolumes), `PersistentVolumeClaims`, and even `ClusterIssuers` for https certificates.
diff --git a/deployment/helm/human-connection/templates/cluster-issuers/letsencrypt-prod.yaml b/deployment/helm/human-connection/templates/cluster-issuers/letsencrypt-prod.yaml
new file mode 100644
index 000000000..ac11e76b8
--- /dev/null
+++ b/deployment/helm/human-connection/templates/cluster-issuers/letsencrypt-prod.yaml
@@ -0,0 +1,20 @@
+apiVersion: cert-manager.io/v1alpha2
+kind: ClusterIssuer
+metadata:
+ name: letsencrypt-prod
+ labels:
+ app.kubernetes.io/instance: {{ .Release.Name }}
+ app.kubernetes.io/managed-by: {{ .Release.Service }}
+ app.kubernetes.io/name: human-connection
+ app.kubernetes.io/version: {{ .Chart.AppVersion }}
+ helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
+spec:
+ acme:
+ server: https://acme-v02.api.letsencrypt.org/directory
+ email: {{ .Values.supportEmail }}
+ privateKeySecretRef:
+ name: letsencrypt-prod
+ solvers:
+ - http01:
+ ingress:
+ class: nginx
diff --git a/deployment/helm/human-connection/templates/cluster-issuers/letsencrypt-staging.yaml b/deployment/helm/human-connection/templates/cluster-issuers/letsencrypt-staging.yaml
new file mode 100644
index 000000000..cc9d9fdd7
--- /dev/null
+++ b/deployment/helm/human-connection/templates/cluster-issuers/letsencrypt-staging.yaml
@@ -0,0 +1,20 @@
+apiVersion: cert-manager.io/v1alpha2
+kind: ClusterIssuer
+metadata:
+ name: letsencrypt-staging
+ labels:
+ app.kubernetes.io/instance: {{ .Release.Name }}
+ app.kubernetes.io/managed-by: {{ .Release.Service }}
+ app.kubernetes.io/name: human-connection
+ app.kubernetes.io/version: {{ .Chart.AppVersion }}
+ helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
+spec:
+ acme:
+ server: https://acme-staging-v02.api.letsencrypt.org/directory
+ email: {{ .Values.supportEmail }}
+ privateKeySecretRef:
+ name: letsencrypt-staging
+ solvers:
+ - http01:
+ ingress:
+ class: nginx
diff --git a/deployment/helm/human-connection/templates/deployments/deployment-backend.yaml b/deployment/helm/human-connection/templates/deployments/deployment-backend.yaml
new file mode 100644
index 000000000..33aa8a0e0
--- /dev/null
+++ b/deployment/helm/human-connection/templates/deployments/deployment-backend.yaml
@@ -0,0 +1,58 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ .Release.Name }}-backend
+ labels:
+ app.kubernetes.io/instance: {{ .Release.Name }}
+ app.kubernetes.io/managed-by: {{ .Release.Service }}
+ app.kubernetes.io/name: human-connection
+ app.kubernetes.io/version: {{ .Chart.AppVersion }}
+ helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
+spec:
+ replicas: 1
+ minReadySeconds: 15
+ progressDeadlineSeconds: 60
+ strategy:
+ rollingUpdate:
+ maxSurge: 0
+ maxUnavailable: "100%"
+ selector:
+ matchLabels:
+ human-connection.org/selector: deployment-backend
+ template:
+ metadata:
+ name: deployment-backend
+ annotations:
+ backup.velero.io/backup-volumes: uploads
+ labels:
+ human-connection.org/commit: {{ .Values.commit }}
+ human-connection.org/selector: deployment-backend
+ spec:
+ containers:
+ - name: backend
+ image: "{{ .Values.backendImage }}:{{ .Chart.AppVersion }}"
+ imagePullPolicy: {{ .Values.image.pullPolicy }}
+ envFrom:
+ - configMapRef:
+ name: {{ .Release.Name }}-configmap
+ - secretRef:
+ name: {{ .Release.Name }}-secrets
+ ports:
+ - containerPort: 4000
+ protocol: TCP
+ resources: {}
+ terminationMessagePath: /dev/termination-log
+ terminationMessagePolicy: File
+ volumeMounts:
+ - mountPath: /nitro-backend/public/uploads
+ name: uploads
+ dnsPolicy: ClusterFirst
+ restartPolicy: Always
+ schedulerName: default-scheduler
+ securityContext: {}
+ terminationGracePeriodSeconds: 30
+ volumes:
+ - name: uploads
+ persistentVolumeClaim:
+ claimName: uploads-claim
+status: {}
diff --git a/deployment/helm/human-connection/templates/deployments/deployment-mailserver.yaml b/deployment/helm/human-connection/templates/deployments/deployment-mailserver.yaml
new file mode 100644
index 000000000..85c587197
--- /dev/null
+++ b/deployment/helm/human-connection/templates/deployments/deployment-mailserver.yaml
@@ -0,0 +1,40 @@
+{{- if .Values.developmentMailserverDomain }}
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ .Release.Name }}-mailserver
+ labels:
+ app.kubernetes.io/instance: {{ .Release.Name }}
+ app.kubernetes.io/managed-by: {{ .Release.Service }}
+ app.kubernetes.io/name: human-connection
+ app.kubernetes.io/version: {{ .Chart.AppVersion }}
+ helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
+spec:
+ replicas: 1
+ minReadySeconds: 15
+ progressDeadlineSeconds: 60
+ selector:
+ matchLabels:
+ human-connection.org/selector: deployment-mailserver
+ template:
+ metadata:
+ labels:
+ human-connection.org/selector: deployment-mailserver
+ name: mailserver
+ spec:
+ containers:
+ - name: mailserver
+ image: djfarrelly/maildev
+ imagePullPolicy: {{ .Values.image.pullPolicy }}
+ ports:
+ - containerPort: 80
+ - containerPort: 25
+ envFrom:
+ - configMapRef:
+ name: {{ .Release.Name }}-configmap
+ - secretRef:
+ name: {{ .Release.Name }}-secrets
+ restartPolicy: Always
+ terminationGracePeriodSeconds: 30
+status: {}
+{{- end}}
diff --git a/deployment/helm/human-connection/templates/deployments/deployment-maintenance.yaml b/deployment/helm/human-connection/templates/deployments/deployment-maintenance.yaml
new file mode 100644
index 000000000..b12069f7e
--- /dev/null
+++ b/deployment/helm/human-connection/templates/deployments/deployment-maintenance.yaml
@@ -0,0 +1,32 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ .Release.Name }}-maintenance
+ labels:
+ app.kubernetes.io/instance: {{ .Release.Name }}
+ app.kubernetes.io/managed-by: {{ .Release.Service }}
+ app.kubernetes.io/name: human-connection
+ app.kubernetes.io/version: {{ .Chart.AppVersion }}
+ helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
+spec:
+ selector:
+ matchLabels:
+ human-connection.org/selector: deployment-maintenance
+ template:
+ metadata:
+ labels:
+ human-connection.org/commit: {{ .Values.commit }}
+ human-connection.org/selector: deployment-maintenance
+ name: maintenance
+ spec:
+ containers:
+ - name: maintenance
+ env:
+ - name: HOST
+ value: 0.0.0.0
+ image: "{{ .Values.maintenanceImage }}:{{ .Chart.AppVersion }}"
+ ports:
+ - containerPort: 80
+ imagePullPolicy: Always
+ restartPolicy: Always
+ terminationGracePeriodSeconds: 30
diff --git a/deployment/helm/human-connection/templates/deployments/deployment-neo4j.yaml b/deployment/helm/human-connection/templates/deployments/deployment-neo4j.yaml
new file mode 100644
index 000000000..ae244fdce
--- /dev/null
+++ b/deployment/helm/human-connection/templates/deployments/deployment-neo4j.yaml
@@ -0,0 +1,52 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ .Release.Name }}-neo4j
+ labels:
+ app.kubernetes.io/instance: {{ .Release.Name }}
+ app.kubernetes.io/managed-by: {{ .Release.Service }}
+ app.kubernetes.io/name: human-connection
+ app.kubernetes.io/version: {{ .Chart.AppVersion }}
+ helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
+spec:
+ replicas: 1
+ strategy:
+ rollingUpdate:
+ maxSurge: 0
+ maxUnavailable: "100%"
+ selector:
+ matchLabels:
+ human-connection.org/selector: deployment-neo4j
+ template:
+ metadata:
+ name: neo4j
+ annotations:
+ backup.velero.io/backup-volumes: neo4j-data
+ labels:
+ human-connection.org/commit: {{ .Values.commit }}
+ human-connection.org/selector: deployment-neo4j
+ spec:
+ containers:
+ - name: neo4j
+ image: "{{ .Values.neo4jImage }}:{{ .Chart.AppVersion }}"
+ imagePullPolicy: {{ .Values.image.pullPolicy }}
+ ports:
+ - containerPort: 7687
+ - containerPort: 7474
+ resources:
+ requests:
+ memory: {{ .Values.neo4jResourceRequestsMemory | default "1G" | quote }}
+ limits:
+ memory: {{ .Values.neo4jResourceLimitsMemory | default "1G" | quote }}
+ envFrom:
+ - configMapRef:
+ name: {{ .Release.Name }}-configmap
+ volumeMounts:
+ - mountPath: /data/
+ name: neo4j-data
+ volumes:
+ - name: neo4j-data
+ persistentVolumeClaim:
+ claimName: neo4j-data-claim
+ restartPolicy: Always
+ terminationGracePeriodSeconds: 30
diff --git a/deployment/helm/human-connection/templates/deployments/deployment-web.yaml b/deployment/helm/human-connection/templates/deployments/deployment-web.yaml
new file mode 100644
index 000000000..3314f7ec0
--- /dev/null
+++ b/deployment/helm/human-connection/templates/deployments/deployment-web.yaml
@@ -0,0 +1,43 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ .Release.Name }}-webapp
+ labels:
+ app.kubernetes.io/instance: {{ .Release.Name }}
+ app.kubernetes.io/managed-by: {{ .Release.Service }}
+ app.kubernetes.io/name: human-connection
+ app.kubernetes.io/version: {{ .Chart.AppVersion }}
+ helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
+spec:
+ replicas: 2
+ minReadySeconds: 15
+ progressDeadlineSeconds: 60
+ selector:
+ matchLabels:
+ human-connection.org/selector: deployment-webapp
+ template:
+ metadata:
+ name: webapp
+ labels:
+ human-connection.org/commit: {{ .Values.commit }}
+ human-connection.org/selector: deployment-webapp
+ spec:
+ containers:
+ - name: webapp
+ image: "{{ .Values.webappImage }}:{{ .Chart.AppVersion }}"
+ imagePullPolicy: {{ .Values.image.pullPolicy }}
+ envFrom:
+ - configMapRef:
+ name: {{ .Release.Name }}-configmap
+ - secretRef:
+ name: {{ .Release.Name }}-secrets
+ env:
+ - name: HOST
+ value: 0.0.0.0
+ ports:
+ - containerPort: 3000
+ resources: {}
+ imagePullPolicy: Always
+ restartPolicy: Always
+ terminationGracePeriodSeconds: 30
+status: {}
diff --git a/deployment/helm/human-connection/templates/ingress/ingress.template.yaml b/deployment/helm/human-connection/templates/ingress/ingress.template.yaml
new file mode 100644
index 000000000..eb8dd65be
--- /dev/null
+++ b/deployment/helm/human-connection/templates/ingress/ingress.template.yaml
@@ -0,0 +1,36 @@
+apiVersion: extensions/v1beta1
+kind: Ingress
+metadata:
+ name: {{ .Release.Name }}-ingress
+ labels:
+ app.kubernetes.io/instance: {{ .Release.Name }}
+ app.kubernetes.io/managed-by: {{ .Release.Service }}
+ app.kubernetes.io/name: human-connection
+ app.kubernetes.io/version: {{ .Chart.AppVersion }}
+ helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
+ annotations:
+ kubernetes.io/ingress.class: "nginx"
+ cert-manager.io/cluster-issuer: {{ .Values.letsencryptIssuer }}
+ nginx.ingress.kubernetes.io/proxy-body-size: 10m
+spec:
+ tls:
+ - hosts:
+ - {{ .Values.domain }}
+ secretName: tls
+ rules:
+ - host: {{ .Values.domain }}
+ http:
+ paths:
+ - path: /
+ backend:
+ serviceName: {{ .Release.Name }}-webapp
+ servicePort: 3000
+{{- if .Values.developmentMailserverDomain }}
+ - host: {{ .Values.developmentMailserverDomain }}
+ http:
+ paths:
+ - path: /
+ backend:
+ serviceName: {{ .Release.Name }}-mailserver
+ servicePort: 80
+{{- end }}
diff --git a/deployment/helm/human-connection/templates/jobs/job-db-migration.yaml b/deployment/helm/human-connection/templates/jobs/job-db-migration.yaml
new file mode 100644
index 000000000..8a924f44b
--- /dev/null
+++ b/deployment/helm/human-connection/templates/jobs/job-db-migration.yaml
@@ -0,0 +1,29 @@
+apiVersion: batch/v1
+kind: Job
+metadata:
+ name: {{ .Release.Name }}-db-migrations
+ labels:
+ app.kubernetes.io/instance: {{ .Release.Name }}
+ app.kubernetes.io/managed-by: {{ .Release.Service }}
+ app.kubernetes.io/name: human-connection
+ app.kubernetes.io/version: {{ .Chart.AppVersion }}
+ helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
+ annotations:
+ "helm.sh/hook": post-upgrade
+ "helm.sh/hook-weight": "5"
+ "helm.sh/hook-delete-policy": hook-succeeded, hook-failed
+spec:
+ template:
+ metadata:
+ name: {{ .Release.Name }}
+ spec:
+ restartPolicy: Never
+ containers:
+ - name: db-migrations-job
+ image: "{{ .Values.backendImage }}:latest"
+ command: ["/bin/sh", "-c", "{{ .Values.dbMigrations }}"]
+ envFrom:
+ - configMapRef:
+ name: {{ .Release.Name }}-configmap
+ - secretRef:
+ name: {{ .Release.Name }}-secrets
\ No newline at end of file
diff --git a/deployment/helm/human-connection/templates/services/service-backend.yaml b/deployment/helm/human-connection/templates/services/service-backend.yaml
new file mode 100644
index 000000000..af23e6910
--- /dev/null
+++ b/deployment/helm/human-connection/templates/services/service-backend.yaml
@@ -0,0 +1,17 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ .Release.Name }}-backend
+ labels:
+ app.kubernetes.io/instance: {{ .Release.Name }}
+ app.kubernetes.io/managed-by: {{ .Release.Service }}
+ app.kubernetes.io/name: human-connection
+ app.kubernetes.io/version: {{ .Chart.AppVersion }}
+ helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
+spec:
+ ports:
+ - name: graphql
+ port: 4000
+ targetPort: 4000
+ selector:
+ human-connection.org/selector: deployment-backend
diff --git a/deployment/helm/human-connection/templates/services/service-mailserver.yaml b/deployment/helm/human-connection/templates/services/service-mailserver.yaml
new file mode 100644
index 000000000..685becb1d
--- /dev/null
+++ b/deployment/helm/human-connection/templates/services/service-mailserver.yaml
@@ -0,0 +1,22 @@
+{{- if .Values.developmentMailserverDomain }}
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ .Release.Name }}-mailserver
+ labels:
+ app.kubernetes.io/instance: {{ .Release.Name }}
+ app.kubernetes.io/managed-by: {{ .Release.Service }}
+ app.kubernetes.io/name: human-connection
+ app.kubernetes.io/version: {{ .Chart.AppVersion }}
+ helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
+spec:
+ ports:
+ - name: web
+ port: 80
+ targetPort: 80
+ - name: smtp
+ port: 25
+ targetPort: 25
+ selector:
+ human-connection.org/selector: deployment-mailserver
+{{- end}}
diff --git a/deployment/helm/human-connection/templates/services/service-maintenance.yaml b/deployment/helm/human-connection/templates/services/service-maintenance.yaml
new file mode 100644
index 000000000..d641ca8ba
--- /dev/null
+++ b/deployment/helm/human-connection/templates/services/service-maintenance.yaml
@@ -0,0 +1,17 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ .Release.Name }}-maintenance
+ labels:
+ app.kubernetes.io/instance: {{ .Release.Name }}
+ app.kubernetes.io/managed-by: {{ .Release.Service }}
+ app.kubernetes.io/name: human-connection
+ app.kubernetes.io/version: {{ .Chart.AppVersion }}
+ helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
+spec:
+ ports:
+ - name: web
+ port: 80
+ targetPort: 80
+ selector:
+ human-connection.org/selector: deployment-maintenance
diff --git a/deployment/helm/human-connection/templates/services/service-neo4j.yaml b/deployment/helm/human-connection/templates/services/service-neo4j.yaml
new file mode 100644
index 000000000..f5c7d5b38
--- /dev/null
+++ b/deployment/helm/human-connection/templates/services/service-neo4j.yaml
@@ -0,0 +1,20 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ .Release.Name }}-neo4j
+ labels:
+ app.kubernetes.io/instance: {{ .Release.Name }}
+ app.kubernetes.io/managed-by: {{ .Release.Service }}
+ app.kubernetes.io/name: human-connection
+ app.kubernetes.io/version: {{ .Chart.AppVersion }}
+ helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
+spec:
+ ports:
+ - name: bolt
+ port: 7687
+ targetPort: 7687
+ - name: web
+ port: 7474
+ targetPort: 7474
+ selector:
+ human-connection.org/selector: deployment-neo4j
diff --git a/deployment/helm/human-connection/templates/services/service-webapp.yaml b/deployment/helm/human-connection/templates/services/service-webapp.yaml
new file mode 100644
index 000000000..d762c2a55
--- /dev/null
+++ b/deployment/helm/human-connection/templates/services/service-webapp.yaml
@@ -0,0 +1,18 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ .Release.Name }}-webapp
+ labels:
+ app.kubernetes.io/instance: {{ .Release.Name }}
+ app.kubernetes.io/managed-by: {{ .Release.Service }}
+ app.kubernetes.io/name: human-connection
+ app.kubernetes.io/version: {{ .Chart.AppVersion }}
+ helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
+spec:
+ ports:
+ - name: {{ .Release.Name }}-webapp
+ port: 3000
+ protocol: TCP
+ targetPort: 3000
+ selector:
+ human-connection.org/selector: deployment-webapp
diff --git a/deployment/helm/human-connection/templates/volumes/pvc-neo4j-data.yaml b/deployment/helm/human-connection/templates/volumes/pvc-neo4j-data.yaml
new file mode 100644
index 000000000..3f85d3ae8
--- /dev/null
+++ b/deployment/helm/human-connection/templates/volumes/pvc-neo4j-data.yaml
@@ -0,0 +1,10 @@
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: neo4j-data-claim
+spec:
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: {{ .Values.neo4jStorage }}
diff --git a/deployment/helm/human-connection/templates/volumes/pvc-uploads.yaml b/deployment/helm/human-connection/templates/volumes/pvc-uploads.yaml
new file mode 100644
index 000000000..7eb81135b
--- /dev/null
+++ b/deployment/helm/human-connection/templates/volumes/pvc-uploads.yaml
@@ -0,0 +1,16 @@
+
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+ name: uploads-claim
+spec:
+ dataSource:
+ name: uploads-snapshot
+ kind: VolumeSnapshot
+ apiGroup: snapshot.storage.k8s.io
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: {{ .Values.uploadsStorage }}
+
diff --git a/deployment/helm/human-connection/values.yaml b/deployment/helm/human-connection/values.yaml
new file mode 100644
index 000000000..f30704f89
--- /dev/null
+++ b/deployment/helm/human-connection/values.yaml
@@ -0,0 +1,53 @@
+# domain is the user-facing domain.
+domain: develop.human-connection.org
+# commit is the latest github commit deployed.
+commit: 889a7cdd24dda04a139b2b77d626e984d6db6781
+# dbInitialization runs the database initializations in a post-install hook.
+dbInitializion: "yarn prod:migrate init"
+# dbMigrations runs the database migrations in a post-upgrade hook.
+dbMigrations: "yarn prod:migrate up"
+# bakendImage is the docker image for the backend deployment
+backendImage: humanconnection/nitro-backend
+# maintenanceImage is the docker image for the maintenance deployment
+maintenanceImage: humanconnection/maintenance
+# neo4jImage is the docker image for the neo4j deployment
+neo4jImage: humanconnection/neo4j
+# webappImage is the docker image for the webapp deployment
+webappImage: humanconnection/nitro-web
+# image configures pullPolicy related to the docker images
+image:
+ # pullPolicy indicates when, if ever, pods pull a new image from docker hub.
+ pullPolicy: IfNotPresent
+# letsencryptIssuer is used by cert-manager to set up certificates with the given provider.
+letsencryptIssuer: "letsencrypt-prod"
+# neo4jConfig changes any default neo4j config/adds it.
+neo4jConfig:
+ # acceptLicenseAgreement is used to agree to the license agreement for neo4j's enterprise edition.
+ acceptLicenseAgreement: \"yes\"
+ # apocImportFileEnabled enables the import of files to neo4j using the plugin apoc
+ apocImportFileEnabled: \"true\"
+ # dbmsMemoryHeapInitialSize configures initial heap size. By default, it is calculated based on available system resources.(valid units are `k`, `K`, `m`, `M`, `g`, `G`)
+ dbmsMemoryHeapInitialSize: "500M"
+ # dbmsMemoryHeapMaxSize configures maximum heap size. By default it is calculated based on available system resources.(valid units are `k`, `K`, `m`, `M`, `g`, `G`)
+ dbmsMemoryHeapMaxSize: "500M"
+ # dbmsMemoryPagecacheSize configures the amount of memory to use for mapping the store files, in bytes (or 'k', 'm', and 'g')
+ dbmsMemoryPagecacheSize: "490M"
+# neo4jResourceLimitsMemory configures the memory limits available.
+neo4jResourceLimitsMemory: "2G"
+# neo4jResourceLimitsMemory configures the memory available for requests.
+neo4jResourceRequestsMemory: "1G"
+# supportEmail is used for letsencrypt certs.
+supportEmail: "devcom@human-connection.org"
+# smtpHost is the host for the mailserver.
+smtpHost: "mailserver.human-connection.org"
+# smtpPort is the port to be used for the mailserver.
+smtpPort: \"25\"
+# jwtSecret is used to encode/decode a user's JWT for authentication
+jwtSecret: "Yi8mJjdiNzhCRiZmdi9WZA=="
+# privateKeyPassphrase is used for activity pub
+privateKeyPassphrase: "YTdkc2Y3OHNhZGc4N2FkODdzZmFnc2FkZzc4"
+# mapboxToken is used for the Mapbox API, geolocalization.
+mapboxToken: "cGsuZXlKMUlqb2lhSFZ0WVc0dFkyOXVibVZqZEdsdmJpSXNJbUVpT2lKamFqbDBjbkJ1Ykdvd2VUVmxNM1Z3WjJsek5UTnVkM1p0SW4wLktaOEtLOWw3MG9talhiRWtrYkhHc1E="
+uploadsStorage: "25Gi"
+neo4jStorage: "5Gi"
+developmentMailserverDomain: nitro-mailserver.human-connection.org
\ No newline at end of file
diff --git a/deployment/human-connection/deployment-backend.yaml b/deployment/human-connection/deployment-backend.yaml
index 0f75127e5..00aab9ffd 100644
--- a/deployment/human-connection/deployment-backend.yaml
+++ b/deployment/human-connection/deployment-backend.yaml
@@ -38,7 +38,7 @@ spec:
name: human-connection
image: humanconnection/nitro-backend:latest
imagePullPolicy: Always
- name: nitro-backend
+ name: backend
ports:
- containerPort: 4000
protocol: TCP
diff --git a/deployment/volumes/neo4j-data.yaml b/deployment/volumes/neo4j-data.yaml
index 1f453a684..c060750ec 100644
--- a/deployment/volumes/neo4j-data.yaml
+++ b/deployment/volumes/neo4j-data.yaml
@@ -9,4 +9,4 @@
- ReadWriteOnce
resources:
requests:
- storage: 5Gi
+ storage: {{ .Values.neo4jStorage }}
diff --git a/deployment/volumes/uploads.yaml b/deployment/volumes/uploads.yaml
index 2bd64c9ee..c174bf2cb 100644
--- a/deployment/volumes/uploads.yaml
+++ b/deployment/volumes/uploads.yaml
@@ -9,4 +9,4 @@
- ReadWriteOnce
resources:
requests:
- storage: 25Gi
+ storage: {{ .Values.uploadsStorage }}
diff --git a/deployment/volumes/volume-snapshots/snapshot.yaml b/deployment/volumes/volume-snapshots/snapshot.yaml
index 3c3487e14..10a22daf5 100644
--- a/deployment/volumes/volume-snapshots/snapshot.yaml
+++ b/deployment/volumes/volume-snapshots/snapshot.yaml
@@ -2,9 +2,9 @@
apiVersion: snapshot.storage.k8s.io/v1alpha1
kind: VolumeSnapshot
metadata:
- name: neo4j-data-snapshot
+ name: uploads-snapshot
namespace: human-connection
spec:
source:
- name: neo4j-data-claim
+ name: uploads-claim
kind: PersistentVolumeClaim
diff --git a/features/support/steps.js b/features/support/steps.js
index 71f493834..67127fa1e 100644
--- a/features/support/steps.js
+++ b/features/support/steps.js
@@ -1,15 +1,13 @@
// features/support/steps.js
import { Given, When, Then, After, AfterAll } from 'cucumber'
-import Factory from '../../backend/src/factories'
+import Factory, { cleanDatabase } from '../../backend/src/db/factories'
import dotenv from 'dotenv'
import expect from 'expect'
const debug = require('debug')('ea:test:steps')
-const factory = Factory()
-
After(async () => {
- await factory.cleanDatabase()
+ await cleanDatabase()
})
Given('our CLIENT_URI is {string}', function (string) {
@@ -21,7 +19,7 @@ Given('our CLIENT_URI is {string}', function (string) {
Given('we have the following users in our database:', function (dataTable) {
return Promise.all(dataTable.hashes().map(({ slug, name }) => {
- return factory.create('User', {
+ return Factory.build('user', {
name,
slug,
})
diff --git a/package.json b/package.json
index d13d467d1..79798391c 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "human-connection",
- "version": "0.3.0",
+ "version": "0.3.1",
"description": "Fullstack and API tests with cypress and cucumber for Human Connection",
"author": "Human Connection gGmbh",
"license": "MIT",
@@ -31,7 +31,7 @@
"@babel/register": "^7.8.3",
"auto-changelog": "^1.16.2",
"bcryptjs": "^2.4.3",
- "codecov": "^3.6.2",
+ "codecov": "^3.6.5",
"cross-env": "^6.0.3",
"cucumber": "^6.0.5",
"cypress": "^3.8.3",
@@ -43,9 +43,11 @@
"expect": "^25.1.0",
"faker": "Marak/faker.js#master",
"graphql-request": "^1.8.2",
+ "jsonwebtoken": "^8.5.1",
"neo4j-driver": "^4.0.1",
"neode": "^0.3.7",
"npm-run-all": "^4.1.5",
+ "rosie": "^2.0.1",
"slug": "^2.1.1",
"standard-version": "^7.1.0"
},
diff --git a/scripts/github_release.sh b/scripts/github_release.sh
deleted file mode 100755
index 93f50289d..000000000
--- a/scripts/github_release.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/usr/bin/env bash
-ROOT_DIR=$(dirname "$0")/..
-RELEASE_DIR="${ROOT_DIR}/release"
-
-VERSION=$(jq -r ".version" $ROOT_DIR/package.json)
-
-# mkdir -p $RELEASE_DIR
-
-# The following command part produces 854M on my machine
-# apps=(nitro-web nitro-backend neo4j maintenance-worker maintenance)
-# for app in "${apps[@]}"
-# do
-# docker image save "humanconnection/${app}:latest" | gzip > "${RELEASE_DIR}/${app}.${VERSION}.tar.gz"
-# done
-
-ghr -c "${VERSION}" "${VERSION}"
diff --git a/scripts/translations/missing-keys.sh b/scripts/translations/missing-keys.sh
new file mode 100755
index 000000000..aaeb1ac87
--- /dev/null
+++ b/scripts/translations/missing-keys.sh
@@ -0,0 +1,17 @@
+#! /usr/bin/env bash
+
+ROOT_DIR=$(dirname "$0")/../..
+
+sorting="jq -f $ROOT_DIR/scripts/translations/sort_filter.jq"
+english="$sorting $ROOT_DIR/webapp/locales/en.json"
+german="$sorting $ROOT_DIR/webapp/locales/de.json"
+listPaths="jq -c 'path(..)|[.[]|tostring]|join(\".\")'"
+diffString="<( $english | $listPaths ) <( $german | $listPaths )"
+if eval "diff -q $diffString";
+then
+ : # all good
+else
+ eval "diff -y $diffString | grep '[|<>]'";
+ printf "\nEnglish and German translation keys do not match, see diff above.\n"
+ exit 1
+fi
diff --git a/scripts/translations/sort.sh b/scripts/translations/sort.sh
new file mode 100755
index 000000000..35496f27e
--- /dev/null
+++ b/scripts/translations/sort.sh
@@ -0,0 +1,24 @@
+#! /usr/bin/env bash
+
+ROOT_DIR=$(dirname "$0")/../..
+tmp=$(mktemp)
+exit_code=0
+
+for locale_file in $ROOT_DIR/webapp/locales/*.json
+do
+ jq -f $(dirname "$0")/sort_filter.jq $locale_file > "$tmp"
+ if [ "$*" == "--fix" ]
+ then
+ mv "$tmp" $locale_file
+ else
+ if diff -q "$tmp" $locale_file > /dev/null ;
+ then
+ : # all good
+ else
+ exit_code=$?
+ echo "$(basename -- $locale_file) is not sorted by keys"
+ fi
+ fi
+done
+
+exit $exit_code
diff --git a/scripts/translations/sort_filter.jq b/scripts/translations/sort_filter.jq
new file mode 100644
index 000000000..9d108f8f0
--- /dev/null
+++ b/scripts/translations/sort_filter.jq
@@ -0,0 +1,13 @@
+def walk(f):
+ . as $in
+ | if type == "object" then
+ reduce keys_unsorted[] as $key
+ ( {}; . + { ($key): ($in[$key] | walk(f)) } ) | f
+ elif type == "array" then map( walk(f) ) | f
+ else f
+ end;
+
+def keys_sort_by(f):
+ to_entries | sort_by(.key|f ) | from_entries;
+
+walk(if type == "object" then keys_sort_by(ascii_upcase) else . end)
\ No newline at end of file
diff --git a/webapp/.env.template b/webapp/.env.template
index fdabcf003..b00e6855a 100644
--- a/webapp/.env.template
+++ b/webapp/.env.template
@@ -2,3 +2,5 @@ MAPBOX_TOKEN="pk.eyJ1IjoiaHVtYW4tY29ubmVjdGlvbiIsImEiOiJjajl0cnBubGoweTVlM3VwZ2l
SENTRY_DSN_WEBAPP=
COMMIT=
PUBLIC_REGISTRATION=false
+WEBSOCKETS_URI=ws://localhost:3000/api/graphql
+GRAPHQL_URI=http://localhost:4000/
diff --git a/webapp/assets/_new/icons/svgs/microphone-slash.svg b/webapp/assets/_new/icons/svgs/microphone-slash.svg
new file mode 100644
index 000000000..9802dbd5f
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/microphone-slash.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/webapp/assets/_new/icons/svgs/microphone.svg b/webapp/assets/_new/icons/svgs/microphone.svg
new file mode 100644
index 000000000..121342b70
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/microphone.svg
@@ -0,0 +1,6 @@
+
+
+
diff --git a/webapp/components/ContentMenu/ContentMenu.vue b/webapp/components/ContentMenu/ContentMenu.vue
index 67f28817e..c69a2fcbc 100644
--- a/webapp/components/ContentMenu/ContentMenu.vue
+++ b/webapp/components/ContentMenu/ContentMenu.vue
@@ -161,7 +161,7 @@ export default {
callback: () => {
this.$emit('unmute', this.resource)
},
- icon: 'eye',
+ icon: 'microphone',
})
} else {
routes.push({
@@ -169,10 +169,10 @@ export default {
callback: () => {
this.$emit('mute', this.resource)
},
- icon: 'eye-slash',
+ icon: 'microphone-slash',
})
}
- if (this.resource.blocked) {
+ if (this.resource.isBlocked) {
routes.push({
label: this.$t(`settings.blocked-users.unblock`),
callback: () => {
diff --git a/webapp/components/ContributionForm/ContributionForm.spec.js b/webapp/components/ContributionForm/ContributionForm.spec.js
index b2ce7d530..23b3d8906 100644
--- a/webapp/components/ContributionForm/ContributionForm.spec.js
+++ b/webapp/components/ContributionForm/ContributionForm.spec.js
@@ -384,6 +384,15 @@ describe('ContributionForm.vue', () => {
await wrapper.find('form').trigger('submit')
expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expect.objectContaining(expectedParams))
})
+
+ it('supports deleting a teaser image', async () => {
+ expectedParams.variables.image = null
+ propsData.contribution.image = '/uploads/someimage.png'
+ wrapper = Wrapper()
+ wrapper.find('.contribution-form .delete-image').trigger('click')
+ await wrapper.find('form').trigger('submit')
+ expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expect.objectContaining(expectedParams))
+ })
})
})
})
diff --git a/webapp/components/ContributionForm/ContributionForm.vue b/webapp/components/ContributionForm/ContributionForm.vue
index 95fccffbc..d2bd33d71 100644
--- a/webapp/components/ContributionForm/ContributionForm.vue
+++ b/webapp/components/ContributionForm/ContributionForm.vue
@@ -9,6 +9,16 @@
+
c.id)
},
+ deleteImage() {
+ this.contribution.image = null
+ this.form.image = null
+ this.form.teaserImage = null
+ },
+ cropInProgress(boolean) {
+ this.isCropInProgress = boolean
+ },
},
apollo: {
User: {
@@ -307,4 +329,11 @@ export default {
}
}
}
+.delete-image {
+ right: 10px;
+ position: relative;
+ z-index: 1;
+ float: right;
+ top: $space-large;
+}
diff --git a/webapp/components/NotificationMenu/NotificationMenu.vue b/webapp/components/NotificationMenu/NotificationMenu.vue
index a3b085db9..d00ab2837 100644
--- a/webapp/components/NotificationMenu/NotificationMenu.vue
+++ b/webapp/components/NotificationMenu/NotificationMenu.vue
@@ -22,10 +22,9 @@
diff --git a/webapp/components/Upload/index.vue b/webapp/components/Upload/index.vue
index 66e7203cc..c78b4649b 100644
--- a/webapp/components/Upload/index.vue
+++ b/webapp/components/Upload/index.vue
@@ -157,7 +157,6 @@ export default {
border-radius: 100%;
border: 1px dashed hsl(0, 0%, 25%);
}
-
.hc-attachments-upload-area:hover & {
opacity: 1;
}
diff --git a/webapp/components/_new/generic/UserAvatar/UserAvatar.vue b/webapp/components/_new/generic/UserAvatar/UserAvatar.vue
index b9007b919..578bfb7a6 100644
--- a/webapp/components/_new/generic/UserAvatar/UserAvatar.vue
+++ b/webapp/components/_new/generic/UserAvatar/UserAvatar.vue
@@ -76,6 +76,7 @@ export default {
> .image {
position: relative;
width: 100%;
+ height: 100%;
object-fit: cover;
object-position: center;
}
diff --git a/webapp/constants/notifications.js b/webapp/constants/notifications.js
deleted file mode 100644
index 190bb64f8..000000000
--- a/webapp/constants/notifications.js
+++ /dev/null
@@ -1 +0,0 @@
-export const NOTIFICATIONS_POLL_INTERVAL = 60000
diff --git a/webapp/graphql/User.js b/webapp/graphql/User.js
index a73941794..fb0c4dddd 100644
--- a/webapp/graphql/User.js
+++ b/webapp/graphql/User.js
@@ -24,6 +24,7 @@ export default i18n => {
createdAt
followedByCurrentUser
isMuted
+ isBlocked
blocked
following(first: 7) {
...user
@@ -70,6 +71,7 @@ export const notificationQuery = i18n => {
read
reason
createdAt
+ updatedAt
from {
__typename
... on Post {
@@ -108,6 +110,7 @@ export const markAsReadMutation = i18n => {
read
reason
createdAt
+ updatedAt
from {
__typename
... on Post {
@@ -131,6 +134,44 @@ export const markAsReadMutation = i18n => {
`
}
+export const notificationAdded = () => {
+ return gql`
+ ${userFragment}
+ ${commentFragment}
+ ${postFragment}
+
+ subscription notifications($userId: ID!) {
+ notificationAdded(userId: $userId) {
+ id
+ read
+ reason
+ createdAt
+ updatedAt
+ from {
+ __typename
+ ... on Post {
+ ...post
+ author {
+ ...user
+ }
+ }
+ ... on Comment {
+ ...comment
+ author {
+ ...user
+ }
+ post {
+ ...post
+ author {
+ ...user
+ }
+ }
+ }
+ }
+ }
+ }
+ `
+}
export const followUserMutation = i18n => {
return gql`
${userFragment}
diff --git a/webapp/layouts/error.spec.js b/webapp/layouts/error.spec.js
new file mode 100644
index 000000000..95234ec5f
--- /dev/null
+++ b/webapp/layouts/error.spec.js
@@ -0,0 +1,47 @@
+import { config, shallowMount } from '@vue/test-utils'
+import Error from './error.vue'
+
+const localVue = global.localVue
+
+config.stubs['nuxt-link'] = ''
+
+describe('error.vue', () => {
+ let mocks, wrapper
+
+ beforeEach(() => {
+ mocks = {
+ $t: jest.fn(key => key),
+ }
+ })
+
+ const Wrapper = (propsData = {}) => {
+ return shallowMount(Error, { mocks, propsData, localVue })
+ }
+
+ describe('shallowMount', () => {
+ it('renders default error message', () => {
+ wrapper = Wrapper({ error: {} })
+ expect(wrapper.find('.error-message').text()).toBe('error-pages.default')
+ })
+
+ it('renders error message to given statusCode', () => {
+ wrapper = Wrapper({ error: { statusCode: 404 } })
+ expect(wrapper.find('.error-message').text()).toBe('error-pages.404-default')
+ })
+
+ it('renders error message to given custom key', () => {
+ wrapper = Wrapper({ error: { statusCode: 404, key: 'my-custom-key' } })
+ expect(wrapper.find('.error-message').text()).toBe('my-custom-key')
+ })
+
+ it('has a link to index page', () => {
+ wrapper = Wrapper({ error: {} })
+ expect(wrapper.find('span[to="/"]').text()).toBe('error-pages.back-to-index')
+ })
+
+ it('has an image related to the status code', () => {
+ wrapper = Wrapper({ error: { statusCode: 404 } })
+ expect(wrapper.find('.error-image').attributes('src')).toBe('/img/svg/errors/error404.svg')
+ })
+ })
+})
diff --git a/webapp/layouts/error.vue b/webapp/layouts/error.vue
new file mode 100644
index 000000000..9143a7ff1
--- /dev/null
+++ b/webapp/layouts/error.vue
@@ -0,0 +1,47 @@
+
+
+
![]()
+
+
{{ $t(message) }}
+
+
{{ $t('error-pages.back-to-index') }}
+
+
+
+
+
diff --git a/webapp/locales/de.json b/webapp/locales/de.json
index 562199852..4b28fe528 100644
--- a/webapp/locales/de.json
+++ b/webapp/locales/de.json
@@ -1,827 +1,838 @@
{
- "login": {
- "copy": "Falls Du bereits ein Konto bei Human Connection hast, melde Dich bitte hier an.",
- "login": "Anmelden",
- "logout": "Abmelden",
- "email": "Deine E-Mail",
- "password": "Dein Passwort",
- "moreInfo": "Was ist Human Connection?",
- "hello": "Hallo",
- "forgotPassword": "Passwort vergessen?",
- "no-account": "Du hast noch kein Benutzerkonto?",
- "register": "Benutzerkonto erstellen",
- "moreInfoURL": "https:\/\/human-connection.org",
- "moreInfoHint": "zur Präsentationsseite",
- "success": "Du bist eingeloggt!",
- "failure": "Fehlerhafte E-Mail-Adresse oder Passwort."
+ "actions": {
+ "cancel": "Abbrechen",
+ "create": "Erstellen",
+ "delete": "Löschen",
+ "edit": "Bearbeiten",
+ "loading": "wird geladen",
+ "loadMore": "mehr laden",
+ "save": "Speichern"
+ },
+ "admin": {
+ "categories": {
+ "categoryName": "Name",
+ "name": "Kategorien",
+ "postCount": "Beiträge"
},
- "profile": {
- "name": "Mein Profil",
- "memberSince": "Mitglied seit",
- "follow": "Folgen",
- "followers": "Folgen",
- "following": "Folge Ich",
- "shouted": "Empfohlen",
- "commented": "Kommentiert",
- "userAnonym": "Anonymus",
- "socialMedia": "Wo sonst finde ich",
- "network": {
- "title": "Netzwerk",
- "following": "folgt:",
- "followingNobody": "folgt niemandem.",
- "followedBy": "wird gefolgt von:",
- "followedByNobody": "wird von niemandem gefolgt.",
- "andMore": "und {number} weitere …"
- },
- "invites": {
- "title": "Lade jemanden zu Human Connection ein!",
- "description": "Zur Einladung die E-Mail-Adresse hier eintragen.",
- "emailPlaceholder": "E-Mail-Adresse für die Einladung"
- }
- },
- "settings": {
- "name": "Einstellungen",
- "data": {
- "name": "Deine Daten",
- "labelName": "Dein Name",
- "labelCity": "Deine Stadt oder Region",
- "labelBio": "Über Dich",
- "labelSlug": "Dein eindeutiger Benutzername",
- "namePlaceholder": "Petra Lustig",
- "success": "Deine Daten wurden erfolgreich aktualisiert!"
- },
- "security": {
- "name": "Sicherheit",
- "change-password": {
- "button": "Passwort ändern",
- "success": "Passwort erfolgreich geändert!",
- "label-old-password": "Dein altes Passwort",
- "label-new-password": "Dein neues Passwort",
- "label-new-password-confirm": "Bestätige Dein neues Passwort",
- "message-old-password-required": "Gebe dein altes Passwort ein",
- "message-new-password-required": "Gebe ein neues Passwort ein",
- "message-new-password-confirm-required": "Bestätige dein neues Passwort",
- "message-new-password-missmatch": "Gebe das gleiche Passwort nochmals ein",
- "passwordSecurity": "Passwortsicherheit",
- "passwordStrength0": "Sehr unsicheres Passwort",
- "passwordStrength1": "Unsicheres Passwort",
- "passwordStrength2": "Mittelmäßiges Passwort",
- "passwordStrength3": "Sicheres Passwort",
- "passwordStrength4": "Sehr sicheres Passwort"
- }
- },
- "privacy": {
- "name": "Privatsphäre",
- "make-shouts-public": "Teile von mir empfohlene Artikel öffentlich auf meinem Profil",
- "success-update": "Privatsphäre-Einstellungen gespeichert"
- },
- "invites": {
- "name": "Einladungen"
- },
- "download": {
- "name": "Daten herunterladen"
- },
- "organizations": {
- "name": "Meine Organisationen"
- },
- "languages": {
- "name": "Sprachen"
- },
- "email": {
- "validation": {
- "same-email": "Das ist deine aktuelle E-Mail Addresse"
- },
- "name": "Deine E-Mail",
- "labelEmail": "E-Mail Adresse ändern",
- "labelNewEmail": "Neue E-Mail Adresse",
- "labelNonce": "Bestätigungscode eingeben",
- "success": "Eine neue E-Mail Addresse wurde registriert.",
- "submitted": "Eine E-Mail zur Bestätigung deiner Adresse wurde an {email}<\/b> gesendet.",
- "change-successful": "Deine E-Mail Adresse wurde erfolgreich geändert.",
- "verification-error": {
- "message": "Deine E-Mail Adresse konnte nicht verifiziert werden.",
- "explanation": "Das kann verschiedene Ursachen haben:",
- "reason": {
- "invalid-nonce": "Ist der Bestätigungscode falsch?",
- "no-email-request": "Bist du dir sicher, dass du eine Änderung deiner E-Mail Adresse angefragt hattest?"
- },
- "support": "Wenn das Problem weiterhin besteht, kontaktiere uns gerne per E-Mail an"
- }
- },
- "validation": {
- "slug": {
- "regex": "Es sind nur Kleinbuchstaben, Zahlen, Unterstriche oder Bindestriche erlaubt.",
- "alreadyTaken": "Dieser Benutzername ist schon vergeben."
- }
- },
- "deleteUserAccount": {
- "name": "Benutzerkonto löschen",
- "contributionsCount": "Meine {count} Beiträge löschen",
- "commentedCount": "Meine {count} Kommentare löschen",
- "accountDescription": "Sei dir bewusst, dass deine Beiträge und Kommentare für unsere Community wichtig sind. Wenn du sie trotzdem löschen möchtest, musst du sie unten markieren.",
- "accountWarning": "Dein Konto, deine Beiträge oder Kommentare kannst du nach dem Löschen WEDER VERWALTEN NOCH WIEDERHERSTELLEN!",
- "success": "Konto erfolgreich gelöscht!",
- "pleaseConfirm": "Zerstörerische Aktion! Gib „{confirm}“ ein, um zu bestätigen."
- },
- "embeds": {
- "name": "Drittanbieter",
- "info-description": "Hier ist die Liste an Drittanbietern, deren Inhalte als Fremdcode z.B. in Form von eingebetteten Videos angezeigt werden kann:",
- "status": {
- "description": "Als Grundeinstellung für dich wird eingebetter Fremdcode von Drittanbietern",
- "disabled": {
- "off": "zunächst nicht angezeigt",
- "on": "sofort angezeigt"
- },
- "change": {
- "question": "Soll eingebetter Fremdcode von Dritten für dich immer angezeigt werden?",
- "allow": "Na klar",
- "deny": "Lieber nicht"
- }
- }
- },
- "social-media": {
- "name": "Soziale Medien",
- "placeholder": "Deine Social-Media URL",
- "requireUnique": "Dieser Link existiert bereits",
- "submit": "Link hinzufügen",
- "successAdd": "Social-Media hinzugefügt. Profil aktualisiert!",
- "successDelete": "Social-Media gelöscht. Profil aktualisiert!"
- },
- "muted-users": {
- "name": "Stummgeschaltete Benutzer",
- "explanation": {
- "intro": "Wenn ein anderer Benutzer von dir stummgeschaltet wurde, dann passiert folgendes:",
- "your-perspective": "In deiner Beitragsübersicht tauchen keine Beiträge der stummgeschalteten Person mehr auf.",
- "search": "Die Beiträge von stummgeschalteten Personen verschwinden aus deinen Suchergebnissen."
- },
- "columns": {
- "name": "Name",
- "slug": "Alias",
- "unmute": "Entsperren"
- },
- "empty": "Bislang hast du niemanden stummgeschaltet.",
- "how-to": "Du kannst andere Benutzer auf deren Profilseite über das Inhaltsmenü stummschalten.",
- "mute": "Stumm schalten",
- "unmute": "Stummschaltung aufheben",
- "unmuted": "{name} ist nicht mehr stummgeschaltet"
- },
- "blocked-users": {
- "name": "Blocked users",
- "explanation": {
- "intro": "Wenn ein anderer Benutzer von dir blockiert wurde, dann passiert folgendes:",
- "your-perspective": "Du kannst keine Beiträge der blockierten Person mehr kommentieren.",
- "their-perspective": "Die blockierte Person kann deine Beiträge nicht mehr kommentieren",
- "notifications": "Von dir blockierte Personen erhalten keine Benachrichtigungen mehr, wenn sie in deinen Beiträgen erwähnt werden.",
- "closing": "Das sollte fürs Erste genügen, damit blockierte Benutzer dich nicht mehr länger belästigen können.",
- "commenting-disabled": "Du kannst den Beitrag derzeit nicht kommentieren.",
- "commenting-explanation": "Dafür kann es mehrere Gründe geben, bitte schau in unsere "
- },
- "columns": {
- "name": "Name",
- "slug": "Alias",
- "unblock": "Entsperren"
- },
- "empty": "Bislang hast du niemanden blockiert.",
- "how-to": "Du kannst andere Benutzer auf deren Profilseite über das Inhaltsmenü blockieren.",
- "block": "Nutzer blockieren",
- "unblock": "Nutzer entsperren",
- "unblocked": "{name} ist wieder entsperrt"
- }
- },
- "admin": {
- "name": "Systemverwaltung",
- "dashboard": {
- "name": "Startzentrale",
- "users": "Benutzer",
- "posts": "Beiträge",
- "comments": "Kommentare",
- "notifications": "Benachrichtigungen",
- "organizations": "Organisationen",
- "projects": "Projekte",
- "invites": "Einladungen",
- "follows": "Folgen",
- "shouts": "Empfehlungen"
- },
- "organizations": {
- "name": "Organisationen"
- },
- "users": {
- "name": "Benutzer",
- "form": {
- "placeholder": "E-Mail, Name oder Beschreibung"
- },
- "table": {
- "columns": {
- "number": "Nr.",
- "name": "Name",
- "email": "E-mail",
- "slug": "Alias",
- "role": "Rolle",
- "createdAt": "Erstellt am"
- }
- },
- "empty": "Keine Benutzer gefunden"
- },
- "pages": {
- "name": "Seiten"
- },
- "notifications": {
- "name": "Benachrichtigungen"
- },
- "categories": {
- "name": "Kategorien",
- "categoryName": "Name",
- "postCount": "Beiträge"
- },
- "settings": {
- "name": "Einstellungen"
- },
- "hashtags": {
- "name": "Hashtags",
- "number": "Nr.",
- "nameOfHashtag": "Name",
- "tagCountUnique": "Benutzer",
- "tagCount": "Beiträge"
- },
- "invites": {
- "name": "Benutzer einladen",
- "title": "Leute einladen",
- "description": "Einladungen sind ein wunderbarer Weg, deine Freund in deinem Netzwerk zu haben …"
- },
- "donations": {
- "name": "Spendeninfo",
- "goal": "Monatlich benötigte Spenden",
- "progress": "Bereits gesammelte Spenden",
- "successfulUpdate": "Spenden-Info erfolgreich aktualisiert!"
- }
- },
- "post": {
- "name": "Beitrag",
- "moreInfo": {
- "name": "Mehr Info",
- "title": "Mehr Informationen",
- "description": "Hier findest du weitere Infos zum Thema.",
- "titleOfCategoriesSection": "Kategorien",
- "titleOfHashtagsSection": "Hashtags",
- "titleOfRelatedContributionsSection": "Verwandte Beiträge"
- },
- "takeAction": {
- "name": "Aktiv werden"
- },
- "pinned": "Meldung",
- "menu": {
- "edit": "Beitrag bearbeiten",
- "delete": "Beitrag löschen",
- "pin": "Post festpinnen",
- "pinnedSuccessfully": "Post erfolgreich festgepinnt!",
- "unpin": "Post nicht mehr festpinnen",
- "unpinnedSuccessfully": "Post erfolgreich nicht mehr festgepinnt!"
- },
- "comment": {
- "submit": "Kommentiere",
- "submitted": "Kommentar gesendet!",
- "updated": "Änderungen gespeichert",
- "reply": "Antworten"
- },
- "edited": "bearbeitet"
- },
- "quotes": {
- "african": {
- "quote": "Viele kleine Leute an vielen kleinen Orten, die viele kleine Dinge tun, werden das Antlitz dieser Welt verändern.",
- "author": "Afrikanisches Sprichwort"
- }
- },
- "common": {
- "post": "Beitrag ::: Beiträge",
- "comment": "Kommentar ::: Kommentare",
- "letsTalk": "Miteinander reden",
- "versus": "Versus",
- "moreInfo": "Mehr Info",
- "takeAction": "Aktiv werden",
- "shout": "Empfehlung ::: Empfehlungen",
- "user": "Benutzer ::: Benutzer",
- "category": "Kategorie ::: Kategorien",
- "organization": "Organisation ::: Organisationen",
- "project": "Projekt ::: Projekte",
- "tag": "Schlagwort ::: Schlagwörter",
- "name": "Name",
- "loadMore": "mehr laden",
- "loading": "wird geladen",
- "reportContent": "Melden",
- "validations": {
- "email": "muss eine gültige E-Mail Adresse sein",
- "url": "muss eine gültige URL sein",
- "categories": "es müssen eine bis drei Kategorien ausgewählt werden"
- }
- },
- "actions": {
- "loading": "wird geladen",
- "loadMore": "mehr laden",
- "create": "Erstellen",
- "save": "Speichern",
- "edit": "Bearbeiten",
- "delete": "Löschen",
- "cancel": "Abbrechen"
- },
- "moderation": {
- "name": "Moderation",
- "reports": {
- "empty": "Glückwunsch, es gibt nichts zu moderieren.",
- "name": "Meldungen",
- "status": "Aktueller Status",
- "content": "Inhalt",
- "author": "Autor",
- "decision": "Entscheidung",
- "enabled": "Entsperrt",
- "disabled": "Gesperrt",
- "decided": "Entschieden",
- "noDecision": "Keine Entscheidung!",
- "decideButton": "Bestätige",
- "DecisionSuccess": "Erfolgreich entschieden!",
- "enabledBy": "Entsperrt von",
- "disabledBy": "Gesperrt von",
- "previousDecision": "Vorherige Entscheidung:",
- "enabledAt": "Entsperrt am",
- "disabledAt": "Gesperrt am",
- "reasonCategory": "Kategorie",
- "reasonDescription": "Beschreibung",
- "submitter": "Gemeldet von",
- "numberOfUsers": "{count} Nutzern",
- "filterLabel": {
- "all": "Alle",
- "unreviewed": "Nicht bearbeitet",
- "reviewed": "Bearbeitet",
- "closed": "Abgeschlossen"
- },
- "reportedOn": "Datum",
- "moreDetails": "Details öffnen",
- "decideModal": {
- "submit": "Bestätige Entscheidung",
- "cancel": "Abbruch",
- "User": {
- "disable": {
- "title": "Sperre den Benutzer abschließend",
- "message": "Möchtest du den Benutzer \"{name}\" wirklich gesperrt lassen?"
- },
- "enable": {
- "title": "Entsperre den Benutzer abschließend",
- "message": "Möchtest du den Benutzer \"{name}\" wirklich entsperrt lassen?"
- }
- },
- "Post": {
- "disable": {
- "title": "Sperre den Beitrag abschließend",
- "message": "Möchtest du den Beitrag \"{name}\" wirklich gesperrt lassen?"
- },
- "enable": {
- "title": "Entsperre den Beitrag abschließend",
- "message": "Möchtest du den Beitrag \"{name}\" wirklich entsperrt lassen?"
- }
- },
- "Comment": {
- "disable": {
- "title": "Sperre den Kommentar abschließend",
- "message": "Möchtest du den Kommentar \"{name}\" wirklich gesperrt lassen?"
- },
- "enable": {
- "title": "Entsperre den Kommentar abschließend",
- "message": "Möchtest du den Kommentar \"{name}\" wirklich entsperrt lassen?"
- }
- }
- }
- }
- },
- "disable": {
- "user": {
- "title": "Nutzer sperren",
- "type": "Nutzer",
- "message": "Bist Du sicher, dass Du den Nutzer „{name}<\/b>“ sperren möchtest?"
- },
- "contribution": {
- "title": "Beitrag sperren",
- "type": "Beitrag",
- "message": "Bist Du sicher, dass Du den Beitrag von „{name}<\/b>“ deaktivieren möchtest?"
- },
- "comment": {
- "title": "Kommentar sperren",
- "type": "Kommentar",
- "message": "Bist Du sicher, dass Du den Kommentar „{name}<\/b>“ deaktivieren möchtest?"
- },
- "submit": "Deaktivieren",
- "cancel": "Abbrechen",
- "success": "Erfolgreich deaktiviert"
- },
- "report": {
- "submit": "Meldung senden",
- "cancel": "Abbrechen",
- "success": "Vielen Dank für diese Meldung!",
- "user": {
- "title": "Nutzer melden",
- "type": "Nutzer",
- "message": "Bist Du sicher, dass Du den Nutzer „{name}<\/b>“ melden möchtest?",
- "error": "Du hast den Benutzer bereits gemeldet!"
- },
- "contribution": {
- "title": "Beitrag melden",
- "type": "Beitrag",
- "message": "Bist Du sicher, dass Du den Beitrag „{name}<\/b>“ melden möchtest?",
- "error": "Du hast den Beitrag bereits gemeldet!"
- },
- "comment": {
- "title": "Kommentar melden",
- "type": "Kommentar",
- "message": "Bist Du sicher, dass Du den Kommentar von „{name}<\/b>“ melden möchtest?",
- "error": "Du hast den Kommentar bereits gemeldet!"
- },
- "reason": {
- "category": {
- "label": "Wähle eine Kategorie:",
- "placeholder": "Kategorie …",
- "options": {
- "discrimination_etc": "Diskriminierende Beiträge, Kommentare, Äußerungen oder Beleidigungen.",
- "pornographic_content_links": "Das Posten oder Verlinken eindeutig pornografischen Materials.",
- "glorific_trivia_of_cruel_inhuman_acts": "Verherrlichung oder Verharmlosung grausamer oder unmenschlicher Gewalttätigkeiten.",
- "doxing": "Das Veröffentlichen von personenbezogenen Daten anderer ohne deren Einverständnis oder das Androhen dessen (\"Doxing\").",
- "intentional_intimidation_stalking_persecution": "Absichtliche Einschüchterung, Stalking oder Verfolgung.",
- "advert_products_services_commercial": "Bewerben von Produkten und Dienstleistungen mit kommerzieller Absicht.",
- "criminal_behavior_violation_german_law": "Strafbares Verhalten bzw. Verstoß gegen deutsches Recht.",
- "other": "Andere …"
- },
- "invalid": "Bitte wähle eine gültige Kategorie aus"
- },
- "description": {
- "label": "Bitte erkläre: Warum möchtest du dies melden?",
- "placeholder": "Zusätzliche Information …"
- }
- }
- },
- "contribution": {
- "amount-comments": "{amount} comments",
- "amount-shouts": "{amount} recommendations",
- "title": "Titel",
- "newPost": "Erstelle einen neuen Beitrag",
- "filterFollow": "Beiträge filtern von Usern denen ich folge",
- "filterALL": "Alle Beiträge anzeigen",
- "success": "Gespeichert!",
- "languageSelectLabel": "Sprache deines Beitrags",
- "languageSelectText": "Sprache wählen",
- "categories": {
- "infoSelectedNoOfMaxCategories": "{chosen} von {max} Kategorien ausgewählt"
- },
- "emotions-label": {
- "funny": "Lustig",
- "happy": "Glücklich",
- "surprised": "Erstaunt",
- "cry": "Zum Weinen",
- "angry": "Verärgert"
- },
- "category": {
- "name": {
- "freedom-of-speech": "Redefreiheit",
- "consumption-sustainability": "Verbrauch & Nachhaltigkeit",
- "global-peace-nonviolence": "Globaler Frieden & Gewaltlosigkeit",
- "just-for-fun": "Nur zum Spaß",
- "happiness-values": "Glück & Werte",
- "health-wellbeing": "Gesundheit & Wohlbefinden",
- "environment-nature": "Umwelt & Natur",
- "animal-protection": "Schutz der Tiere",
- "human-rights-justice": "Menschenrechte & Gerechtigkeit",
- "education-sciences": "Bildung & Wissenschaft",
- "cooperation-development": "Zusammenarbeit & Entwicklung",
- "democracy-politics": "Demokratie & Politik",
- "economy-finances": "Wirtschaft & Finanzen",
- "energy-technology": "Energie & Technologie",
- "it-internet-data-privacy": "IT, Internet & Datenschutz",
- "art-culture-sport": "Kunst, Kultur & Sport"
- }
- },
- "teaserImage": {
- "cropperConfirm": "Bestätigen"
- },
- "inappropriatePicture" : "Dieses Bild kann für einige Menschen unangemessen sein.",
- "inappropriatePictureText" : "Wann soll ein Foto versteckt werden"
- },
- "comment": {
- "content": {
- "unavailable-placeholder": "… dieser Kommentar ist nicht mehr verfügbar"
- },
- "menu": {
- "edit": "Kommentar bearbeiten",
- "delete": "Kommentar löschen"
- },
- "show": {
- "more": "mehr anzeigen",
- "less": "weniger anzeigen"
- },
- "edited": "bearbeitet"
- },
- "followButton": {
- "follow": "Folgen",
- "following": "Folge Ich"
- },
- "shoutButton": {
- "shouted": "empfohlen"
- },
- "search": {
- "placeholder": "Suchen",
- "hint": "Wonach suchst Du?",
- "failed": "Nichts gefunden",
- "heading": {
- "Post": "Beiträge",
- "User": "Benutzer"
- }
- },
- "components": {
- "password-reset": {
- "request": {
- "title": "Passwort zurücksetzen",
- "form": {
- "description": "Eine Mail zum Zurücksetzen des Passworts wird an die angegebene E-Mail Adresse geschickt.",
- "submit": "E-Mail anfordern",
- "submitted": "Eine E-Mail mit weiteren Instruktionen wurde verschickt an {email}<\/b>"
- }
- },
- "change-password": {
- "success": "Änderung des Passworts war erfolgreich!",
- "error": "Passwort Änderung fehlgeschlagen. Möglicherweise falscher Sicherheitscode?",
- "help": "Falls Probleme auftreten, schreib uns gerne eine Mail an:"
- }
- },
- "enter-nonce": {
- "form": {
- "nonce": "Code eingeben",
- "description": "Öffne dein E-Mail Postfach und gib den Code ein, den wir geschickt haben.",
- "next": "Weiter",
- "validations": {
- "length": "muss genau 6 Buchstaben lang sein"
- }
- }
- },
- "registration": {
- "signup": {
- "unavailable": "Leider ist die öffentliche Registrierung von Benutzerkonten auf diesem Server derzeit nicht möglich.",
- "title": "Mach mit bei Human Connection!",
- "form": {
- "description": "Um loszulegen, kannst du dich hier kostenfrei registrieren:",
- "terms-and-condition": "Ich stimme den Nutzungsbedingungen<\/ds-text><\/a>zu.",
- "data-privacy": "Ich habe die Datenschutzerklärung<\/ds-text><\/a> gelesen und verstanden",
- "minimum-age": "Ich bin 18 Jahre oder älter.",
- "no-commercial": "Ich habe keine kommerziellen Absichten und ich repräsentiere kein kommerzielles Unternehmen oder Organisation.",
- "no-political": "Ich bin nicht im Auftrag einer Partei oder politischen Organisation im Netzwerk. ",
- "invitation-code": "Dein Einladungscode lautet: {code}<\/b>",
- "errors": {
- "email-exists": "Es gibt schon ein Benutzerkonto mit dieser E-Mail Adresse!",
- "invalid-invitation-token": "Es sieht so aus, als ob der Einladungscode schon eingelöst wurde. Jeder Code kann nur einmalig benutzt werden."
- },
- "submit": "Konto erstellen",
- "success": "Eine Mail mit einem Bestätigungslink für die Registrierung wurde an {email}<\/b> geschickt"
- }
- },
- "create-user-account": {
- "title": "Benutzerkonto anlegen",
- "success": "Dein Benutzerkonto wurde erstellt!",
- "error": "Es konnte kein Benutzerkonto erstellt werden!",
- "help": "Vielleicht war der Bestätigungscode falsch oder abgelaufen? Wenn das Problem weiterhin besteht, schick uns gerne eine E-Mail an:"
- }
- }
- },
- "store": {
- "posts": {
- "orderBy": {
- "newest": {
- "label": "Neueste"
- },
- "oldest": {
- "label": "Älteste"
- }
- }
- }
- },
- "maintenance": {
- "title": "Human Connection befindet sich in der Wartung",
- "explanation": "Zurzeit führen wir einige geplante Wartungsarbeiten durch, bitte versuch es später erneut.",
- "questions": "Bei Fragen oder Problemen erreichst du uns per E-Mail an"
- },
- "index": {
- "no-results": "Keine Beiträge gefunden.",
- "change-filter-settings": "Verändere die Filter-Einstellungen um mehr Ergebnisse zu erhalten."
- },
- "filter-menu": {
- "title": "Deine Filterblase",
- "hashtag-search": "Suche nach #{hashtag}",
- "clearSearch": "Suche löschen"
- },
- "filter-posts": {
- "categories": {
- "header": "Themenkategorien",
- "all": "Alle"
- },
- "general": {
- "header": "Filtern nach …"
- },
- "followers": {
- "label": "Benutzern, denen ich folge"
- },
- "language": {
- "header": "Sprachen",
- "all": "Alle"
- }
- },
- "site": {
- "thanks": "Danke!",
- "error-occurred": "Ein Fehler ist aufgetreten.",
- "made": "Mit ❤ gemacht",
- "imprint": "Impressum",
- "termsAndConditions": "Nutzungsbedingungen",
- "data-privacy": "Datenschutz",
- "contact": "Kontakt",
- "tribunal": "Registergericht",
- "register": "Registernummer",
- "director": "Geschäftsführer",
- "taxident": "Umsatzsteuer-Identifikationsnummer gemäß § 27 a Umsatzsteuergesetz (Deutschland)",
- "responsible": "Verantwortlicher gemäß § 55 Abs. 2 RStV ",
- "bank": "Bankverbindung",
- "germany": "Deutschland",
- "code-of-conduct": "Verhaltenscodex",
- "back-to-login": "Zurück zur Anmeldung",
- "faq": "FAQ"
- },
- "editor": {
- "placeholder": "Schreib etwas Inspirierendes …",
- "mention": {
- "noUsersFound": "Keine Benutzer gefunden"
- },
- "hashtag": {
- "noHashtagsFound": "Keine Hashtags gefunden",
- "addHashtag": "Neuer Hashtag",
- "addLetter": "Tippe einen Buchstaben"
- },
- "embed": {
- "data_privacy_warning": "Achte auf deine Daten!",
- "data_privacy_info": "Deine Daten wurden noch nicht an Drittanbieter weitergegeben. Wenn du dieses Video jetzt abspielst, registriert der folgende Anbieter wahrscheinlich deine Nutzerdaten:",
- "play_now": "Jetzt ansehen",
- "always_allow": "Inhalte von Drittanbietern immer anzeigen (diese Einstellung kannst du jederzeit ändern)"
- }
- },
- "notifications": {
- "reason": {
- "mentioned_in_post": "Hat dich in einem Beitrag erwähnt …",
- "mentioned_in_comment": "Hat dich in einem Kommentar erwähnt …",
- "commented_on_post": "Hat deinen Beitrag kommentiert …"
- },
- "comment": "Kommentar",
- "title": "Benachrichtigungen",
- "pageLink": "Alle Benachrichtigungen",
- "post": "Beitrag",
- "user": "Benutzer",
- "content": "Inhalt",
- "filterLabel": {
- "all": "Alle",
- "read": "Gelesen",
- "unread": "Ungelesen"
- },
- "empty": "Bedaure, Du hast momentan keinerlei Benachrichtigungen."
- },
- "delete": {
- "submit": "Löschen",
- "cancel": "Abbrechen",
- "contribution": {
- "title": "Lösche Beitrag",
- "type": "Contribution",
- "message": "Bist du sicher, dass du den Beitrag \"{name}<\/b>\" löschen möchtest?",
- "success": "Beitrag erfolgreich gelöscht!"
- },
- "comment": {
- "title": "Lösche Kommentar",
- "type": "Comment",
- "message": "Bist du sicher, dass du den Kommentar \"{name}<\/b>\" löschen möchtest?",
- "success": "Kommentar erfolgreich gelöscht!"
- }
- },
- "release": {
- "submit": "freigeben",
- "cancel": "Abbrechen",
- "success": "Erfolgreich freigegeben!",
- "user": {
- "title": "Nutzer freigeben",
- "type": "Nutzer",
- "message": "Bist du sicher, dass du den Nutzer \"{name}<\/b>\" freigeben möchtest?",
- "error": "Den User hast du schon gemeldet!"
- },
- "contribution": {
- "title": "Beitrag freigeben",
- "type": "Beitrag",
- "message": "Bist du sicher, dass du den Beitrag \"{name}<\/b>\" freigeben möchtest?",
- "error": "Den Beitrag hast du schon gemeldet!"
- },
- "comment": {
- "title": "Kommentar freigeben",
- "type": "Kommentar",
- "message": "Bist du sicher, dass du den Kommentar \"{name}<\/b>\" freigeben möchtest?",
- "error": "Den Kommentar hast du schon gemeldet!"
- }
- },
- "user": {
- "avatar": {
- "submitted": "Upload erfolgreich"
- }
- },
- "code-of-conduct": {
- "subheader": "für das Soziale Netzwerk der Human Connection gGmbH",
- "preamble": {
- "title": "Präambel",
- "description": "Human Connection ist ein gemeinnütziges soziales Wissens- und Aktionsnetzwerk der nächsten Generation. Von Menschen – für Menschen. Open Source, fair und transparent. Für positiven lokalen und globalen Wandel in allen Lebensbereichen. Wir gestalten den öffentlichen Austausch von Wissen, Ideen und Projekten völlig neu. Die Funktionen von Human Connection bringen die Menschen zusammen – offline und online – so dass wir die Welt zu einem besseren Ort machen können."
- },
- "purpose": {
- "title": "Zweck",
- "description": "Mit diesen Verhaltensregeln regeln wir die wesentlichen Grundsätze für das Verhalten in unserem Sozialen Netzwerk. Dabei ist die Menschenrechtscharta der Vereinten Nationen unsere Orientierung und bildet das Herz unseres Werteverständnisses. Die Verhaltensregeln dienen als Leitsätze für den persönlichen Auftritt und den Umgang untereinander. Wer als Nutzer im Human Connection Netzwerk aktiv ist, Beiträge verfasst, kommentiert oder mit anderen Nutzern, auch außerhalb des Netzwerkes, Kontakt aufnimmt, erkennt diese Verhaltensregeln als verbindlich an."
- },
- "expected-behaviour": {
- "title": "Erwartetes Verhalten",
- "description": "Die folgenden Verhaltensweisen werden von allen Community-Mitgliedern erwartet und gefordert:",
- "list": {
- "0": "Sei rücksichtsvoll und respektvoll bei dem was Du schreibst und tust.",
- "1": "Versuche auf andere zuzugehen, bevor ein Konflikt entsteht.",
- "2": "Vermeide erniedrigende, diskriminierende oder belästigende Verhaltensweisen und Ausdrücke.",
- "3": "Gehe achtsam mit Deiner Umgebung um. Informiere den Support bei gefährlichen Situationen, wenn eine Person in Not ist oder bei Verstößen gegen diesen Verhaltenskodex, auch wenn sie unbedeutend erscheinen."
- }
- },
- "unacceptable-behaviour": {
- "title": "Nichtakzeptables Verhalten",
- "description": "Die folgenden Verhaltensweisen sind in unserer Community inakzeptabel:",
- "list": {
- "0": "Diskriminierende Beiträge, Kommentare, Äußerungen oder Beleidigungen, insbesondere solche, die sich auf Geschlecht, sexuelle Orientierung, Rasse, Religion, politische oder weltanschauliche Ausrichtung oder Behinderung beziehen.",
- "1": "Das Posten oder Verlinken eindeutig pornografischen Materials.",
- "2": "Verherrlichung oder Verharmlosung grausamer oder unmenschlicher Gewalttätigkeiten.",
- "3": "Das Veröffentlichen von personenbezogenen Daten anderer ohne deren Einverständnis oder das Androhen dessen (\"Doxing\").",
- "4": "Absichtliche Einschüchterung, Stalking oder Verfolgung.",
- "5": "Bewerben von Produkten und Dienstleistungen mit kommerzieller Absicht.",
- "6": "Strafbares Verhalten bzw. Verstoß gegen deutsches Recht.",
- "7": "Befürwortung oder Ermutigung zu diesen Verhaltensweisen."
- }
- },
- "consequences": {
- "title": "Konsequenzen inakzeptablen Verhaltens",
- "description": "Wenn ein Gemeinschaftsmitglied inakzeptables Verhalten an den Tag legt, können die verantwortlichen Betreiber, Moderatoren und Administratoren des Netzwerks angemessene Maßnahmen ergreifen, u.a.:",
- "list": {
- "0": "Aufforderung zum sofortigen Abstellen des inakzeptablen Verhaltens",
- "1": "Sperren oder Löschen von Kommentaren",
- "2": "Temporärer Ausschluss aus dem jeweiligen Beitrag",
- "3": "Sperren bzw. Löschen von Inhalten",
- "4": "Temporärer Entzug von Schreibrechten",
- "5": "Vorübergehender Ausschluss aus dem Netzwerk",
- "6": "Endgültiger Ausschluss aus dem Netzwerk",
- "7": "Verstöße gegen deutsches Recht können zur Anzeige gebracht werden."
- }
- },
- "get-help": "Wenn Du einem inakzeptablen Verhalten ausgesetzt bist, es miterlebst oder andere Bedenken hast, benachrichtige bitte so schnell wie möglich einen Organisator der Gemeinschaft und verlinke oder verweise auf den entsprechenden Inhalt:"
- },
- "termsAndConditions": {
- "newTermsAndConditions": "Neue Nutzungsbedingungen",
- "termsAndConditionsConfirmed": "Ich habe die Nutzungsbedingungen<\/a> durchgelesen und stimme ihnen zu.",
- "termsAndConditionsNewConfirmText": "Bitte lies Dir die neue Nutzungsbedingungen jetzt durch!",
- "termsAndConditionsNewConfirm": "Ich habe die neuen Nutzungsbedingungen durchgelesen und stimme zu.",
- "agree": "Ich stimme zu!",
- "terms-of-service": {
- "title": "Nutzungsbedingungen",
- "description": "Die folgenden Nutzungsbedingungen sind Basis für die Nutzung unseres Netzwerkes. Beim Registrieren musst Du sie anerkennen und wir werden Dich auch später über ggf. stattfindende Änderungen informieren. Das Human Connection Netzwerk wird in Deutschland betrieben und unterliegt daher deutschem Recht. Gerichtsstand ist Kirchheim \/ Teck. Zu Details schau in unser Impressum: https:\/\/human-connection.org\/impressum\/<\/a>"
- },
- "use-and-license": {
- "title": "Nutzung und Lizenz",
- "description": "Sind Inhalte, die Du bei uns einstellst, durch Rechte am geistigen Eigentum geschützt, erteilst Du uns eine nicht-exklusive, übertragbare, unterlizenzierbare und weltweite Lizenz für die Nutzung dieser Inhalte für die Bereitstellung in unserem Netzwerk. Diese Lizenz endet, sobald Du Deine Inhalte oder Deinen ganzen Account löscht. Bedenke, dass andere Deine Inhalte weiter teilen können und wir diese nicht löschen können."
- },
- "privacy-statement": {
- "title": "Datenschutz",
- "description": "Unser Netzwerk ist ein soziales Wissens- und Aktionsnetzwerk. Daher ist es uns besonders wichtig, dass möglichst viele Inhalte öffentlich zugänglich sind. Im Laufe der Entwicklung unseres Netzwerkes wird es mehr und mehr die Möglichkeit geben, über die Sichtbarkeit der selbst angegebenen bzw. persönlichen Daten zu entscheiden. Über diese neuen Funktionen werden wir Euch informieren. Ansonsten gilt, dass Du immer darüber nachdenken solltest, welche persönlichen Daten Du über Dich (oder andere) preisgibst. Dies gilt insbesondere für Inhalte von Beiträgen und Kommentaren, da diese einen weitgehend öffentlichen Charakter haben. Später wird es Möglichkeiten geben, die Sichtbarkeit Deines Profils einzuschränken. Teil der Nutzungsbedingungen ist unsere Datenschutzerklärung, die Dich über die einzelnen Datenverarbeitungen in unserem Netzwerk informiert: https:\/\/human-connection.org\/datenschutz\/#netzwerk<\/a> bzw. https:\/\/human-connection.org\/datenschutz\/<\/a> Unsere Datenschutzerklärung ist an die Gesetzeslage und die Charakteristika unseres Netzwerks angepasst und gilt immer in der aktuellsten Version."
- },
- "code-of-conduct": {
- "title": "Verhaltenscodex",
- "description": "Unser Verhaltenskodex dient als Leitfaden für das persönliche Auftreten und den Umgang miteinander. Wer als Nutzer im Human Connection-Netzwerk aktiv ist, Beiträge verfasst, kommentiert oder mit anderen Nutzern, auch außerhalb des Netzwerkes, Kontakt aufnimmt, erkennt diese Verhaltensregeln als verbindlich an. https:\/\/alpha.human-connection.org\/code-of-conduct<\/a>"
- },
- "moderation": {
- "title": "Moderation",
- "description": "Bis unsere finanziellen Möglichkeiten uns erlauben, das Community-Moderationssystem zu implementieren, moderieren wir mit einem vereinfachten System und eigenen bzw. ggf. ehrenamtlichen Mitarbeitern. Wir schulen diese Moderatoren und aus diesem Grund treffen auch nur diese entsprechende Entscheidungen. Diese Moderatoren führen Ihre Tätigkeit anonym aus. Du kannst uns Beiträge, Kommentare und auch Nutzer melden (wenn diese zum Beispiel in ihrem Profil Angaben machen oder Bilder haben, die diese Nutzungsbedingungen verletzen). Wenn Du uns etwas meldest, kannst Du einen Meldegrund angeben und noch eine kurze Erläuterung mitgeben. Wir schauen uns dann das Gemeldete an und sanktionieren ggf., z.B. indem wir Beiträge, Kommentare oder Nutzer sperren. Du und auch der Betroffene erhält derzeitig von uns leider noch keine Rückmeldung, das ist aber in Planung. Unabhängig davon behalten wir uns prinzipiell Sanktionen vor aus Gründen, die unter Umständen nicht oder noch nicht in unserem Verhaltenscodex oder diesen Nutzungsbedingungen aufgeführt sind."
- },
- "errors-and-feedback": {
- "title": "Fehler und Rückmeldungen",
- "description": "Wir sind sehr bemüht, unser Netzwerk und unsere Daten sicher und abrufbar zu erhalten. Jede neue Version der Software durchläuft sowohl automatisierte als auch manuelle Tests. Es können jedoch unvorhergesehene Fehler auftreten. Deshalb sind wir dankbar für jeden gemeldeten Fehler. Du kannst gerne jeden von Dir entdeckten Fehler dem Support\/der Hilfe-Assistenz mitteilen: support@human-connection.org"
- },
- "no-commercial-use" : {
- "title": "Keine kommerzielle Nutzung",
- "description": "Die Nutzung des Human Connection Netzwerkes ist nicht gestattet für kommerzielle Nutzung. Darunter fällt unter anderem das Bewerben von Produkten mit kommerzieller Absicht, das Einstellen von Affiliate-Links, direkter Aufruf zu Spenden oder finanzieller Unterstützung für Zwecke, die steuerlich nicht als gemeinnützig anerkannt sind."
- },
- "help-and-questions": {
- "title": "Hilfe und Fragen",
- "description": "Für Hilfe und Fragen haben wir Dir eine umfassende Sammlung an häufig gestellten Fragen und Antworten (FAQ) zusammengestellt. Du findest diese hier: https:\/\/support.human-connection.org\/kb\/ <\/a>"
- },
- "addition": {
- "title": "Zusätzlich machen wir regelmäßig Veranstaltungen, wo Du auch Eindrücke wiedergeben und Fragen stellen kannst. Du findest eine aktuelle Übersicht hier:",
- "description": " https:\/\/human-connection.org\/veranstaltungen\/ <\/a>"
- }
+ "dashboard": {
+ "comments": "Kommentare",
+ "follows": "Folgen",
+ "invites": "Einladungen",
+ "name": "Startzentrale",
+ "notifications": "Benachrichtigungen",
+ "organizations": "Organisationen",
+ "posts": "Beiträge",
+ "projects": "Projekte",
+ "shouts": "Empfehlungen",
+ "users": "Benutzer"
},
"donations": {
- "donations-for": "Spenden für",
- "donate-now": "Jetzt spenden",
- "amount-of-total": "{amount} von {total} € erreicht"
+ "goal": "Monatlich benötigte Spenden",
+ "name": "Spendeninfo",
+ "progress": "Bereits gesammelte Spenden",
+ "successfulUpdate": "Spenden-Info erfolgreich aktualisiert!"
+ },
+ "hashtags": {
+ "name": "Hashtags",
+ "nameOfHashtag": "Name",
+ "number": "Nr.",
+ "tagCount": "Beiträge",
+ "tagCountUnique": "Benutzer"
+ },
+ "invites": {
+ "description": "Einladungen sind ein wunderbarer Weg, deine Freund in deinem Netzwerk zu haben …",
+ "name": "Benutzer einladen",
+ "title": "Leute einladen"
+ },
+ "name": "Systemverwaltung",
+ "notifications": {
+ "name": "Benachrichtigungen"
+ },
+ "organizations": {
+ "name": "Organisationen"
+ },
+ "pages": {
+ "name": "Seiten"
+ },
+ "settings": {
+ "name": "Einstellungen"
+ },
+ "users": {
+ "empty": "Keine Benutzer gefunden",
+ "form": {
+ "placeholder": "E-Mail, Name oder Beschreibung"
+ },
+ "name": "Benutzer",
+ "table": {
+ "columns": {
+ "createdAt": "Erstellt am",
+ "email": "E-mail",
+ "name": "Name",
+ "number": "Nr.",
+ "role": "Rolle",
+ "slug": "Alias"
+ }
+ }
}
+ },
+ "code-of-conduct": {
+ "consequences": {
+ "description": "Wenn ein Gemeinschaftsmitglied inakzeptables Verhalten an den Tag legt, können die verantwortlichen Betreiber, Moderatoren und Administratoren des Netzwerks angemessene Maßnahmen ergreifen, u.a.:",
+ "list": {
+ "0": "Aufforderung zum sofortigen Abstellen des inakzeptablen Verhaltens",
+ "1": "Sperren oder Löschen von Kommentaren",
+ "2": "Temporärer Ausschluss aus dem jeweiligen Beitrag",
+ "3": "Sperren bzw. Löschen von Inhalten",
+ "4": "Temporärer Entzug von Schreibrechten",
+ "5": "Vorübergehender Ausschluss aus dem Netzwerk",
+ "6": "Endgültiger Ausschluss aus dem Netzwerk",
+ "7": "Verstöße gegen deutsches Recht können zur Anzeige gebracht werden."
+ },
+ "title": "Konsequenzen inakzeptablen Verhaltens"
+ },
+ "expected-behaviour": {
+ "description": "Die folgenden Verhaltensweisen werden von allen Community-Mitgliedern erwartet und gefordert:",
+ "list": {
+ "0": "Sei rücksichtsvoll und respektvoll bei dem was Du schreibst und tust.",
+ "1": "Versuche auf andere zuzugehen, bevor ein Konflikt entsteht.",
+ "2": "Vermeide erniedrigende, diskriminierende oder belästigende Verhaltensweisen und Ausdrücke.",
+ "3": "Gehe achtsam mit Deiner Umgebung um. Informiere den Support bei gefährlichen Situationen, wenn eine Person in Not ist oder bei Verstößen gegen diesen Verhaltenskodex, auch wenn sie unbedeutend erscheinen."
+ },
+ "title": "Erwartetes Verhalten"
+ },
+ "get-help": "Wenn Du einem inakzeptablen Verhalten ausgesetzt bist, es miterlebst oder andere Bedenken hast, benachrichtige bitte so schnell wie möglich einen Organisator der Gemeinschaft und verlinke oder verweise auf den entsprechenden Inhalt:",
+ "preamble": {
+ "description": "Human Connection ist ein gemeinnütziges soziales Wissens- und Aktionsnetzwerk der nächsten Generation. Von Menschen – für Menschen. Open Source, fair und transparent. Für positiven lokalen und globalen Wandel in allen Lebensbereichen. Wir gestalten den öffentlichen Austausch von Wissen, Ideen und Projekten völlig neu. Die Funktionen von Human Connection bringen die Menschen zusammen – offline und online – so dass wir die Welt zu einem besseren Ort machen können.",
+ "title": "Präambel"
+ },
+ "purpose": {
+ "description": "Mit diesen Verhaltensregeln regeln wir die wesentlichen Grundsätze für das Verhalten in unserem Sozialen Netzwerk. Dabei ist die Menschenrechtscharta der Vereinten Nationen unsere Orientierung und bildet das Herz unseres Werteverständnisses. Die Verhaltensregeln dienen als Leitsätze für den persönlichen Auftritt und den Umgang untereinander. Wer als Nutzer im Human Connection Netzwerk aktiv ist, Beiträge verfasst, kommentiert oder mit anderen Nutzern, auch außerhalb des Netzwerkes, Kontakt aufnimmt, erkennt diese Verhaltensregeln als verbindlich an.",
+ "title": "Zweck"
+ },
+ "subheader": "für das Soziale Netzwerk der Human Connection gGmbH",
+ "unacceptable-behaviour": {
+ "description": "Die folgenden Verhaltensweisen sind in unserer Community inakzeptabel:",
+ "list": {
+ "0": "Diskriminierende Beiträge, Kommentare, Äußerungen oder Beleidigungen, insbesondere solche, die sich auf Geschlecht, sexuelle Orientierung, Rasse, Religion, politische oder weltanschauliche Ausrichtung oder Behinderung beziehen.",
+ "1": "Das Posten oder Verlinken eindeutig pornografischen Materials.",
+ "2": "Verherrlichung oder Verharmlosung grausamer oder unmenschlicher Gewalttätigkeiten.",
+ "3": "Das Veröffentlichen von personenbezogenen Daten anderer ohne deren Einverständnis oder das Androhen dessen (\"Doxing\").",
+ "4": "Absichtliche Einschüchterung, Stalking oder Verfolgung.",
+ "5": "Bewerben von Produkten und Dienstleistungen mit kommerzieller Absicht.",
+ "6": "Strafbares Verhalten bzw. Verstoß gegen deutsches Recht.",
+ "7": "Befürwortung oder Ermutigung zu diesen Verhaltensweisen."
+ },
+ "title": "Nichtakzeptables Verhalten"
+ }
+ },
+ "comment": {
+ "content": {
+ "unavailable-placeholder": "… dieser Kommentar ist nicht mehr verfügbar"
+ },
+ "edited": "bearbeitet",
+ "menu": {
+ "delete": "Kommentar löschen",
+ "edit": "Kommentar bearbeiten"
+ },
+ "show": {
+ "less": "weniger anzeigen",
+ "more": "mehr anzeigen"
+ }
+ },
+ "common": {
+ "category": "Kategorie ::: Kategorien",
+ "comment": "Kommentar ::: Kommentare",
+ "letsTalk": "Miteinander reden",
+ "loading": "wird geladen",
+ "loadMore": "mehr laden",
+ "moreInfo": "Mehr Info",
+ "name": "Name",
+ "organization": "Organisation ::: Organisationen",
+ "post": "Beitrag ::: Beiträge",
+ "project": "Projekt ::: Projekte",
+ "reportContent": "Melden",
+ "shout": "Empfehlung ::: Empfehlungen",
+ "tag": "Schlagwort ::: Schlagwörter",
+ "takeAction": "Aktiv werden",
+ "user": "Benutzer ::: Benutzer",
+ "validations": {
+ "categories": "es müssen eine bis drei Kategorien ausgewählt werden",
+ "email": "muss eine gültige E-Mail Adresse sein",
+ "url": "muss eine gültige URL sein"
+ },
+ "versus": "Versus"
+ },
+ "components": {
+ "enter-nonce": {
+ "form": {
+ "description": "Öffne dein E-Mail Postfach und gib den Code ein, den wir geschickt haben.",
+ "next": "Weiter",
+ "nonce": "Code eingeben",
+ "validations": {
+ "length": "muss genau 6 Buchstaben lang sein"
+ }
+ }
+ },
+ "password-reset": {
+ "change-password": {
+ "error": "Passwort Änderung fehlgeschlagen. Möglicherweise falscher Sicherheitscode?",
+ "help": "Falls Probleme auftreten, schreib uns gerne eine Mail an:",
+ "success": "Änderung des Passworts war erfolgreich!"
+ },
+ "request": {
+ "form": {
+ "description": "Eine Mail zum Zurücksetzen des Passworts wird an die angegebene E-Mail Adresse geschickt.",
+ "submit": "E-Mail anfordern",
+ "submitted": "Eine E-Mail mit weiteren Instruktionen wurde verschickt an {email}"
+ },
+ "title": "Passwort zurücksetzen"
+ }
+ },
+ "registration": {
+ "create-user-account": {
+ "error": "Es konnte kein Benutzerkonto erstellt werden!",
+ "help": "Vielleicht war der Bestätigungscode falsch oder abgelaufen? Wenn das Problem weiterhin besteht, schick uns gerne eine E-Mail an:",
+ "success": "Dein Benutzerkonto wurde erstellt!",
+ "title": "Benutzerkonto anlegen"
+ },
+ "signup": {
+ "form": {
+ "data-privacy": "Ich habe die Datenschutzerklärung gelesen und verstanden",
+ "description": "Um loszulegen, kannst du dich hier kostenfrei registrieren:",
+ "errors": {
+ "email-exists": "Es gibt schon ein Benutzerkonto mit dieser E-Mail Adresse!",
+ "invalid-invitation-token": "Es sieht so aus, als ob der Einladungscode schon eingelöst wurde. Jeder Code kann nur einmalig benutzt werden."
+ },
+ "invitation-code": "Dein Einladungscode lautet: {code}",
+ "minimum-age": "Ich bin 18 Jahre oder älter.",
+ "no-commercial": "Ich habe keine kommerziellen Absichten und ich repräsentiere kein kommerzielles Unternehmen oder Organisation.",
+ "no-political": "Ich bin nicht im Auftrag einer Partei oder politischen Organisation im Netzwerk. ",
+ "submit": "Konto erstellen",
+ "success": "Eine Mail mit einem Bestätigungslink für die Registrierung wurde an {email} geschickt",
+ "terms-and-condition": "Ich stimme den Nutzungsbedingungenzu."
+ },
+ "title": "Mach mit bei Human Connection!",
+ "unavailable": "Leider ist die öffentliche Registrierung von Benutzerkonten auf diesem Server derzeit nicht möglich."
+ }
+ }
+ },
+ "contribution": {
+ "amount-comments": "{amount} comments",
+ "amount-shouts": "{amount} recommendations",
+ "categories": {
+ "infoSelectedNoOfMaxCategories": "{chosen} von {max} Kategorien ausgewählt"
+ },
+ "category": {
+ "name": {
+ "animal-protection": "Schutz der Tiere",
+ "art-culture-sport": "Kunst, Kultur & Sport",
+ "consumption-sustainability": "Verbrauch & Nachhaltigkeit",
+ "cooperation-development": "Zusammenarbeit & Entwicklung",
+ "democracy-politics": "Demokratie & Politik",
+ "economy-finances": "Wirtschaft & Finanzen",
+ "education-sciences": "Bildung & Wissenschaft",
+ "energy-technology": "Energie & Technologie",
+ "environment-nature": "Umwelt & Natur",
+ "freedom-of-speech": "Redefreiheit",
+ "global-peace-nonviolence": "Globaler Frieden & Gewaltlosigkeit",
+ "happiness-values": "Glück & Werte",
+ "health-wellbeing": "Gesundheit & Wohlbefinden",
+ "human-rights-justice": "Menschenrechte & Gerechtigkeit",
+ "it-internet-data-privacy": "IT, Internet & Datenschutz",
+ "just-for-fun": "Nur zum Spaß"
+ }
+ },
+ "emotions-label": {
+ "angry": "Verärgert",
+ "cry": "Zum Weinen",
+ "funny": "Lustig",
+ "happy": "Glücklich",
+ "surprised": "Erstaunt"
+ },
+ "filterALL": "Alle Beiträge anzeigen",
+ "filterFollow": "Beiträge filtern von Usern denen ich folge",
+ "inappropriatePicture": "Dieses Bild kann für einige Menschen unangemessen sein.",
+ "inappropriatePictureText": "Wann soll ein Foto versteckt werden",
+ "languageSelectLabel": "Sprache deines Beitrags",
+ "languageSelectText": "Sprache wählen",
+ "newPost": "Erstelle einen neuen Beitrag",
+ "success": "Gespeichert!",
+ "teaserImage": {
+ "cropperConfirm": "Bestätigen"
+ },
+ "title": "Titel"
+ },
+ "delete": {
+ "cancel": "Abbrechen",
+ "comment": {
+ "message": "Bist du sicher, dass du den Kommentar \"{name}\" löschen möchtest?",
+ "success": "Kommentar erfolgreich gelöscht!",
+ "title": "Lösche Kommentar",
+ "type": "Comment"
+ },
+ "contribution": {
+ "message": "Bist du sicher, dass du den Beitrag \"{name}\" löschen möchtest?",
+ "success": "Beitrag erfolgreich gelöscht!",
+ "title": "Lösche Beitrag",
+ "type": "Contribution"
+ },
+ "submit": "Löschen"
+ },
+ "disable": {
+ "cancel": "Abbrechen",
+ "comment": {
+ "message": "Bist Du sicher, dass Du den Kommentar „{name}“ deaktivieren möchtest?",
+ "title": "Kommentar sperren",
+ "type": "Kommentar"
+ },
+ "contribution": {
+ "message": "Bist Du sicher, dass Du den Beitrag von „{name}“ deaktivieren möchtest?",
+ "title": "Beitrag sperren",
+ "type": "Beitrag"
+ },
+ "submit": "Deaktivieren",
+ "success": "Erfolgreich deaktiviert",
+ "user": {
+ "message": "Bist Du sicher, dass Du den Nutzer „{name}“ sperren möchtest?",
+ "title": "Nutzer sperren",
+ "type": "Nutzer"
+ }
+ },
+ "donations": {
+ "amount-of-total": "{amount} von {total} € erreicht",
+ "donate-now": "Jetzt spenden",
+ "donations-for": "Spenden für"
+ },
+ "editor": {
+ "embed": {
+ "always_allow": "Inhalte von Drittanbietern immer anzeigen (diese Einstellung kannst du jederzeit ändern)",
+ "data_privacy_info": "Deine Daten wurden noch nicht an Drittanbieter weitergegeben. Wenn du dieses Video jetzt abspielst, registriert der folgende Anbieter wahrscheinlich deine Nutzerdaten:",
+ "data_privacy_warning": "Achte auf deine Daten!",
+ "play_now": "Jetzt ansehen"
+ },
+ "hashtag": {
+ "addHashtag": "Neuer Hashtag",
+ "addLetter": "Tippe einen Buchstaben",
+ "noHashtagsFound": "Keine Hashtags gefunden"
+ },
+ "mention": {
+ "noUsersFound": "Keine Benutzer gefunden"
+ },
+ "placeholder": "Schreib etwas Inspirierendes …"
+ },
+ "error-pages": {
+ "403-default": "Kein Zugang zu dieser Seite",
+ "404-default": "Diese Seite konnte nicht gefunden werden",
+ "500-default": "Internal Server Error",
+ "503-default": "Dienst steht nicht zur Verfügung",
+ "back-to-index": "Zurück zur Startseite",
+ "cannot-edit-post": "Dieser Beitrag kann nicht editiert werden",
+ "default": "Ein Fehler ist aufgetreten",
+ "post-not-found": "Dieser Beitrag konnte nicht gefunden werden",
+ "profile-not-found": "Dieses Profil konnte nicht gefunden werden"
+ },
+ "filter-menu": {
+ "clearSearch": "Suche löschen",
+ "hashtag-search": "Suche nach #{hashtag}",
+ "title": "Deine Filterblase"
+ },
+ "filter-posts": {
+ "categories": {
+ "all": "Alle",
+ "header": "Themenkategorien"
+ },
+ "followers": {
+ "label": "Benutzern, denen ich folge"
+ },
+ "general": {
+ "header": "Filtern nach …"
+ },
+ "language": {
+ "all": "Alle",
+ "header": "Sprachen"
+ }
+ },
+ "followButton": {
+ "follow": "Folgen",
+ "following": "Folge Ich"
+ },
+ "index": {
+ "change-filter-settings": "Verändere die Filter-Einstellungen um mehr Ergebnisse zu erhalten.",
+ "no-results": "Keine Beiträge gefunden."
+ },
+ "login": {
+ "copy": "Falls Du bereits ein Konto bei Human Connection hast, melde Dich bitte hier an.",
+ "email": "Deine E-Mail",
+ "failure": "Fehlerhafte E-Mail-Adresse oder Passwort.",
+ "forgotPassword": "Passwort vergessen?",
+ "hello": "Hallo",
+ "login": "Anmelden",
+ "logout": "Abmelden",
+ "moreInfo": "Was ist Human Connection?",
+ "moreInfoHint": "zur Präsentationsseite",
+ "moreInfoURL": "https://human-connection.org",
+ "no-account": "Du hast noch kein Benutzerkonto?",
+ "password": "Dein Passwort",
+ "register": "Benutzerkonto erstellen",
+ "success": "Du bist eingeloggt!"
+ },
+ "maintenance": {
+ "explanation": "Zurzeit führen wir einige geplante Wartungsarbeiten durch, bitte versuch es später erneut.",
+ "questions": "Bei Fragen oder Problemen erreichst du uns per E-Mail an",
+ "title": "Human Connection befindet sich in der Wartung"
+ },
+ "moderation": {
+ "name": "Moderation",
+ "reports": {
+ "author": "Autor",
+ "content": "Inhalt",
+ "decideButton": "Bestätige",
+ "decided": "Entschieden",
+ "decideModal": {
+ "cancel": "Abbruch",
+ "Comment": {
+ "disable": {
+ "message": "Möchtest du den Kommentar \"{name}\" wirklich gesperrt lassen?",
+ "title": "Sperre den Kommentar abschließend"
+ },
+ "enable": {
+ "message": "Möchtest du den Kommentar \"{name}\" wirklich entsperrt lassen?",
+ "title": "Entsperre den Kommentar abschließend"
+ }
+ },
+ "Post": {
+ "disable": {
+ "message": "Möchtest du den Beitrag \"{name}\" wirklich gesperrt lassen?",
+ "title": "Sperre den Beitrag abschließend"
+ },
+ "enable": {
+ "message": "Möchtest du den Beitrag \"{name}\" wirklich entsperrt lassen?",
+ "title": "Entsperre den Beitrag abschließend"
+ }
+ },
+ "submit": "Bestätige Entscheidung",
+ "User": {
+ "disable": {
+ "message": "Möchtest du den Benutzer \"{name}\" wirklich gesperrt lassen?",
+ "title": "Sperre den Benutzer abschließend"
+ },
+ "enable": {
+ "message": "Möchtest du den Benutzer \"{name}\" wirklich entsperrt lassen?",
+ "title": "Entsperre den Benutzer abschließend"
+ }
+ }
+ },
+ "decision": "Entscheidung",
+ "DecisionSuccess": "Erfolgreich entschieden!",
+ "disabled": "Gesperrt",
+ "disabledAt": "Gesperrt am",
+ "disabledBy": "Gesperrt von",
+ "empty": "Glückwunsch, es gibt nichts zu moderieren.",
+ "enabled": "Entsperrt",
+ "enabledAt": "Entsperrt am",
+ "enabledBy": "Entsperrt von",
+ "filterLabel": {
+ "all": "Alle",
+ "closed": "Abgeschlossen",
+ "reviewed": "Bearbeitet",
+ "unreviewed": "Nicht bearbeitet"
+ },
+ "moreDetails": "Details öffnen",
+ "name": "Meldungen",
+ "noDecision": "Keine Entscheidung!",
+ "numberOfUsers": "{count} Nutzern",
+ "previousDecision": "Vorherige Entscheidung:",
+ "reasonCategory": "Kategorie",
+ "reasonDescription": "Beschreibung",
+ "reportedOn": "Datum",
+ "status": "Aktueller Status",
+ "submitter": "Gemeldet von"
+ }
+ },
+ "notifications": {
+ "comment": "Kommentar",
+ "content": "Inhalt",
+ "empty": "Bedaure, Du hast momentan keinerlei Benachrichtigungen.",
+ "filterLabel": {
+ "all": "Alle",
+ "read": "Gelesen",
+ "unread": "Ungelesen"
+ },
+ "pageLink": "Alle Benachrichtigungen",
+ "post": "Beitrag",
+ "reason": {
+ "commented_on_post": "Hat deinen Beitrag kommentiert …",
+ "mentioned_in_comment": "Hat dich in einem Kommentar erwähnt …",
+ "mentioned_in_post": "Hat dich in einem Beitrag erwähnt …"
+ },
+ "title": "Benachrichtigungen",
+ "user": "Benutzer"
+ },
+ "post": {
+ "comment": {
+ "reply": "Antworten",
+ "submit": "Kommentiere",
+ "submitted": "Kommentar gesendet!",
+ "updated": "Änderungen gespeichert"
+ },
+ "edited": "bearbeitet",
+ "menu": {
+ "delete": "Beitrag löschen",
+ "edit": "Beitrag bearbeiten",
+ "pin": "Post festpinnen",
+ "pinnedSuccessfully": "Post erfolgreich festgepinnt!",
+ "unpin": "Post nicht mehr festpinnen",
+ "unpinnedSuccessfully": "Post erfolgreich nicht mehr festgepinnt!"
+ },
+ "moreInfo": {
+ "description": "Hier findest du weitere Infos zum Thema.",
+ "name": "Mehr Info",
+ "title": "Mehr Informationen",
+ "titleOfCategoriesSection": "Kategorien",
+ "titleOfHashtagsSection": "Hashtags",
+ "titleOfRelatedContributionsSection": "Verwandte Beiträge"
+ },
+ "name": "Beitrag",
+ "pinned": "Meldung",
+ "takeAction": {
+ "name": "Aktiv werden"
+ }
+ },
+ "profile": {
+ "commented": "Kommentiert",
+ "follow": "Folgen",
+ "followers": "Folgen",
+ "following": "Folge Ich",
+ "invites": {
+ "description": "Zur Einladung die E-Mail-Adresse hier eintragen.",
+ "emailPlaceholder": "E-Mail-Adresse für die Einladung",
+ "title": "Lade jemanden zu Human Connection ein!"
+ },
+ "memberSince": "Mitglied seit",
+ "name": "Mein Profil",
+ "network": {
+ "andMore": "und {number} weitere …",
+ "followedBy": "wird gefolgt von:",
+ "followedByNobody": "wird von niemandem gefolgt.",
+ "following": "folgt:",
+ "followingNobody": "folgt niemandem.",
+ "title": "Netzwerk"
+ },
+ "shouted": "Empfohlen",
+ "socialMedia": "Wo sonst finde ich",
+ "userAnonym": "Anonymus"
+ },
+ "quotes": {
+ "african": {
+ "author": "Afrikanisches Sprichwort",
+ "quote": "Viele kleine Leute an vielen kleinen Orten, die viele kleine Dinge tun, werden das Antlitz dieser Welt verändern."
+ }
+ },
+ "release": {
+ "cancel": "Abbrechen",
+ "comment": {
+ "error": "Den Kommentar hast du schon gemeldet!",
+ "message": "Bist du sicher, dass du den Kommentar \"{name}\" freigeben möchtest?",
+ "title": "Kommentar freigeben",
+ "type": "Kommentar"
+ },
+ "contribution": {
+ "error": "Den Beitrag hast du schon gemeldet!",
+ "message": "Bist du sicher, dass du den Beitrag \"{name}\" freigeben möchtest?",
+ "title": "Beitrag freigeben",
+ "type": "Beitrag"
+ },
+ "submit": "freigeben",
+ "success": "Erfolgreich freigegeben!",
+ "user": {
+ "error": "Den User hast du schon gemeldet!",
+ "message": "Bist du sicher, dass du den Nutzer \"{name}\" freigeben möchtest?",
+ "title": "Nutzer freigeben",
+ "type": "Nutzer"
+ }
+ },
+ "report": {
+ "cancel": "Abbrechen",
+ "comment": {
+ "error": "Du hast den Kommentar bereits gemeldet!",
+ "message": "Bist Du sicher, dass Du den Kommentar von „{name}“ melden möchtest?",
+ "title": "Kommentar melden",
+ "type": "Kommentar"
+ },
+ "contribution": {
+ "error": "Du hast den Beitrag bereits gemeldet!",
+ "message": "Bist Du sicher, dass Du den Beitrag „{name}“ melden möchtest?",
+ "title": "Beitrag melden",
+ "type": "Beitrag"
+ },
+ "reason": {
+ "category": {
+ "invalid": "Bitte wähle eine gültige Kategorie aus",
+ "label": "Wähle eine Kategorie:",
+ "options": {
+ "advert_products_services_commercial": "Bewerben von Produkten und Dienstleistungen mit kommerzieller Absicht.",
+ "criminal_behavior_violation_german_law": "Strafbares Verhalten bzw. Verstoß gegen deutsches Recht.",
+ "discrimination_etc": "Diskriminierende Beiträge, Kommentare, Äußerungen oder Beleidigungen.",
+ "doxing": "Das Veröffentlichen von personenbezogenen Daten anderer ohne deren Einverständnis oder das Androhen dessen (\"Doxing\").",
+ "glorific_trivia_of_cruel_inhuman_acts": "Verherrlichung oder Verharmlosung grausamer oder unmenschlicher Gewalttätigkeiten.",
+ "intentional_intimidation_stalking_persecution": "Absichtliche Einschüchterung, Stalking oder Verfolgung.",
+ "other": "Andere …",
+ "pornographic_content_links": "Das Posten oder Verlinken eindeutig pornografischen Materials."
+ },
+ "placeholder": "Kategorie …"
+ },
+ "description": {
+ "label": "Bitte erkläre: Warum möchtest du dies melden?",
+ "placeholder": "Zusätzliche Information …"
+ }
+ },
+ "submit": "Meldung senden",
+ "success": "Vielen Dank für diese Meldung!",
+ "user": {
+ "error": "Du hast den Benutzer bereits gemeldet!",
+ "message": "Bist Du sicher, dass Du den Nutzer „{name}“ melden möchtest?",
+ "title": "Nutzer melden",
+ "type": "Nutzer"
+ }
+ },
+ "search": {
+ "failed": "Nichts gefunden",
+ "heading": {
+ "Post": "Beiträge",
+ "User": "Benutzer"
+ },
+ "hint": "Wonach suchst Du?",
+ "placeholder": "Suchen"
+ },
+ "settings": {
+ "blocked-users": {
+ "block": "Nutzer blockieren",
+ "columns": {
+ "name": "Name",
+ "slug": "Alias",
+ "unblock": "Entsperren"
+ },
+ "empty": "Bislang hast du niemanden blockiert.",
+ "explanation": {
+ "closing": "Das sollte fürs Erste genügen, damit blockierte Benutzer dich nicht mehr länger belästigen können.",
+ "commenting-disabled": "Du kannst den Beitrag derzeit nicht kommentieren.",
+ "commenting-explanation": "Dafür kann es mehrere Gründe geben, bitte schau in unsere ",
+ "intro": "Wenn ein anderer Benutzer von dir blockiert wurde, dann passiert folgendes:",
+ "notifications": "Von dir blockierte Personen erhalten keine Benachrichtigungen mehr, wenn sie in deinen Beiträgen erwähnt werden.",
+ "their-perspective": "Die blockierte Person kann deine Beiträge nicht mehr kommentieren",
+ "your-perspective": "Du kannst keine Beiträge der blockierten Person mehr kommentieren."
+ },
+ "how-to": "Du kannst andere Benutzer auf deren Profilseite über das Inhaltsmenü blockieren.",
+ "name": "Blocked users",
+ "unblock": "Nutzer entsperren",
+ "unblocked": "{name} ist wieder entsperrt"
+ },
+ "data": {
+ "labelBio": "Über Dich",
+ "labelCity": "Deine Stadt oder Region",
+ "labelName": "Dein Name",
+ "labelSlug": "Dein eindeutiger Benutzername",
+ "name": "Deine Daten",
+ "namePlaceholder": "Petra Lustig",
+ "success": "Deine Daten wurden erfolgreich aktualisiert!"
+ },
+ "deleteUserAccount": {
+ "accountDescription": "Sei dir bewusst, dass deine Beiträge und Kommentare für unsere Community wichtig sind. Wenn du sie trotzdem löschen möchtest, musst du sie unten markieren.",
+ "accountWarning": "Dein Konto, deine Beiträge oder Kommentare kannst du nach dem Löschen WEDER VERWALTEN NOCH WIEDERHERSTELLEN!",
+ "commentedCount": "Meine {count} Kommentare löschen",
+ "contributionsCount": "Meine {count} Beiträge löschen",
+ "name": "Benutzerkonto löschen",
+ "pleaseConfirm": "Zerstörerische Aktion! Gib „{confirm}“ ein, um zu bestätigen.",
+ "success": "Konto erfolgreich gelöscht!"
+ },
+ "download": {
+ "name": "Daten herunterladen"
+ },
+ "email": {
+ "change-successful": "Deine E-Mail Adresse wurde erfolgreich geändert.",
+ "labelEmail": "E-Mail Adresse ändern",
+ "labelNewEmail": "Neue E-Mail Adresse",
+ "labelNonce": "Bestätigungscode eingeben",
+ "name": "Deine E-Mail",
+ "submitted": "Eine E-Mail zur Bestätigung deiner Adresse wurde an {email} gesendet.",
+ "success": "Eine neue E-Mail Addresse wurde registriert.",
+ "validation": {
+ "same-email": "Das ist deine aktuelle E-Mail Addresse"
+ },
+ "verification-error": {
+ "explanation": "Das kann verschiedene Ursachen haben:",
+ "message": "Deine E-Mail Adresse konnte nicht verifiziert werden.",
+ "reason": {
+ "invalid-nonce": "Ist der Bestätigungscode falsch?",
+ "no-email-request": "Bist du dir sicher, dass du eine Änderung deiner E-Mail Adresse angefragt hattest?"
+ },
+ "support": "Wenn das Problem weiterhin besteht, kontaktiere uns gerne per E-Mail an"
+ }
+ },
+ "embeds": {
+ "info-description": "Hier ist die Liste an Drittanbietern, deren Inhalte als Fremdcode z.B. in Form von eingebetteten Videos angezeigt werden kann:",
+ "name": "Drittanbieter",
+ "status": {
+ "change": {
+ "allow": "Na klar",
+ "deny": "Lieber nicht",
+ "question": "Soll eingebetter Fremdcode von Dritten für dich immer angezeigt werden?"
+ },
+ "description": "Als Grundeinstellung für dich wird eingebetter Fremdcode von Drittanbietern",
+ "disabled": {
+ "off": "zunächst nicht angezeigt",
+ "on": "sofort angezeigt"
+ }
+ }
+ },
+ "invites": {
+ "name": "Einladungen"
+ },
+ "languages": {
+ "name": "Sprachen"
+ },
+ "muted-users": {
+ "columns": {
+ "name": "Name",
+ "slug": "Alias",
+ "unmute": "Entsperren"
+ },
+ "empty": "Bislang hast du niemanden stummgeschaltet.",
+ "explanation": {
+ "intro": "Wenn ein anderer Benutzer von dir stummgeschaltet wurde, dann passiert folgendes:",
+ "search": "Die Beiträge von stummgeschalteten Personen verschwinden aus deinen Suchergebnissen.",
+ "your-perspective": "In deiner Beitragsübersicht tauchen keine Beiträge der stummgeschalteten Person mehr auf."
+ },
+ "how-to": "Du kannst andere Benutzer auf deren Profilseite über das Inhaltsmenü stummschalten.",
+ "mute": "Stumm schalten",
+ "name": "Stummgeschaltete Benutzer",
+ "unmute": "Stummschaltung aufheben",
+ "unmuted": "{name} ist nicht mehr stummgeschaltet"
+ },
+ "name": "Einstellungen",
+ "organizations": {
+ "name": "Meine Organisationen"
+ },
+ "privacy": {
+ "make-shouts-public": "Teile von mir empfohlene Artikel öffentlich auf meinem Profil",
+ "name": "Privatsphäre",
+ "success-update": "Privatsphäre-Einstellungen gespeichert"
+ },
+ "security": {
+ "change-password": {
+ "button": "Passwort ändern",
+ "label-new-password": "Dein neues Passwort",
+ "label-new-password-confirm": "Bestätige Dein neues Passwort",
+ "label-old-password": "Dein altes Passwort",
+ "message-new-password-confirm-required": "Bestätige dein neues Passwort",
+ "message-new-password-missmatch": "Gebe das gleiche Passwort nochmals ein",
+ "message-new-password-required": "Gebe ein neues Passwort ein",
+ "message-old-password-required": "Gebe dein altes Passwort ein",
+ "passwordSecurity": "Passwortsicherheit",
+ "passwordStrength0": "Sehr unsicheres Passwort",
+ "passwordStrength1": "Unsicheres Passwort",
+ "passwordStrength2": "Mittelmäßiges Passwort",
+ "passwordStrength3": "Sicheres Passwort",
+ "passwordStrength4": "Sehr sicheres Passwort",
+ "success": "Passwort erfolgreich geändert!"
+ },
+ "name": "Sicherheit"
+ },
+ "social-media": {
+ "name": "Soziale Medien",
+ "placeholder": "Deine Social-Media URL",
+ "requireUnique": "Dieser Link existiert bereits",
+ "submit": "Link hinzufügen",
+ "successAdd": "Social-Media hinzugefügt. Profil aktualisiert!",
+ "successDelete": "Social-Media gelöscht. Profil aktualisiert!"
+ },
+ "validation": {
+ "slug": {
+ "alreadyTaken": "Dieser Benutzername ist schon vergeben.",
+ "regex": "Es sind nur Kleinbuchstaben, Zahlen, Unterstriche oder Bindestriche erlaubt."
+ }
+ }
+ },
+ "shoutButton": {
+ "shouted": "empfohlen"
+ },
+ "site": {
+ "back-to-login": "Zurück zur Anmeldung",
+ "bank": "Bankverbindung",
+ "code-of-conduct": "Verhaltenscodex",
+ "contact": "Kontakt",
+ "data-privacy": "Datenschutz",
+ "director": "Geschäftsführer",
+ "error-occurred": "Ein Fehler ist aufgetreten.",
+ "faq": "FAQ",
+ "germany": "Deutschland",
+ "imprint": "Impressum",
+ "made": "Mit ❤ gemacht",
+ "register": "Registernummer",
+ "responsible": "Verantwortlicher gemäß § 55 Abs. 2 RStV ",
+ "taxident": "Umsatzsteuer-Identifikationsnummer gemäß § 27 a Umsatzsteuergesetz (Deutschland)",
+ "termsAndConditions": "Nutzungsbedingungen",
+ "thanks": "Danke!",
+ "tribunal": "Registergericht"
+ },
+ "store": {
+ "posts": {
+ "orderBy": {
+ "newest": {
+ "label": "Neueste"
+ },
+ "oldest": {
+ "label": "Älteste"
+ }
+ }
+ }
+ },
+ "termsAndConditions": {
+ "addition": {
+ "description": " https://human-connection.org/veranstaltungen/ ",
+ "title": "Zusätzlich machen wir regelmäßig Veranstaltungen, wo Du auch Eindrücke wiedergeben und Fragen stellen kannst. Du findest eine aktuelle Übersicht hier:"
+ },
+ "agree": "Ich stimme zu!",
+ "code-of-conduct": {
+ "description": "Unser Verhaltenskodex dient als Leitfaden für das persönliche Auftreten und den Umgang miteinander. Wer als Nutzer im Human Connection-Netzwerk aktiv ist, Beiträge verfasst, kommentiert oder mit anderen Nutzern, auch außerhalb des Netzwerkes, Kontakt aufnimmt, erkennt diese Verhaltensregeln als verbindlich an. https://alpha.human-connection.org/code-of-conduct",
+ "title": "Verhaltenscodex"
+ },
+ "errors-and-feedback": {
+ "description": "Wir sind sehr bemüht, unser Netzwerk und unsere Daten sicher und abrufbar zu erhalten. Jede neue Version der Software durchläuft sowohl automatisierte als auch manuelle Tests. Es können jedoch unvorhergesehene Fehler auftreten. Deshalb sind wir dankbar für jeden gemeldeten Fehler. Du kannst gerne jeden von Dir entdeckten Fehler dem Support/der Hilfe-Assistenz mitteilen: support@human-connection.org",
+ "title": "Fehler und Rückmeldungen"
+ },
+ "help-and-questions": {
+ "description": "Für Hilfe und Fragen haben wir Dir eine umfassende Sammlung an häufig gestellten Fragen und Antworten (FAQ) zusammengestellt. Du findest diese hier: https://support.human-connection.org/kb/ ",
+ "title": "Hilfe und Fragen"
+ },
+ "moderation": {
+ "description": "Bis unsere finanziellen Möglichkeiten uns erlauben, das Community-Moderationssystem zu implementieren, moderieren wir mit einem vereinfachten System und eigenen bzw. ggf. ehrenamtlichen Mitarbeitern. Wir schulen diese Moderatoren und aus diesem Grund treffen auch nur diese entsprechende Entscheidungen. Diese Moderatoren führen Ihre Tätigkeit anonym aus. Du kannst uns Beiträge, Kommentare und auch Nutzer melden (wenn diese zum Beispiel in ihrem Profil Angaben machen oder Bilder haben, die diese Nutzungsbedingungen verletzen). Wenn Du uns etwas meldest, kannst Du einen Meldegrund angeben und noch eine kurze Erläuterung mitgeben. Wir schauen uns dann das Gemeldete an und sanktionieren ggf., z.B. indem wir Beiträge, Kommentare oder Nutzer sperren. Du und auch der Betroffene erhält derzeitig von uns leider noch keine Rückmeldung, das ist aber in Planung. Unabhängig davon behalten wir uns prinzipiell Sanktionen vor aus Gründen, die unter Umständen nicht oder noch nicht in unserem Verhaltenscodex oder diesen Nutzungsbedingungen aufgeführt sind.",
+ "title": "Moderation"
+ },
+ "newTermsAndConditions": "Neue Nutzungsbedingungen",
+ "no-commercial-use": {
+ "description": "Die Nutzung des Human Connection Netzwerkes ist nicht gestattet für kommerzielle Nutzung. Darunter fällt unter anderem das Bewerben von Produkten mit kommerzieller Absicht, das Einstellen von Affiliate-Links, direkter Aufruf zu Spenden oder finanzieller Unterstützung für Zwecke, die steuerlich nicht als gemeinnützig anerkannt sind.",
+ "title": "Keine kommerzielle Nutzung"
+ },
+ "privacy-statement": {
+ "description": "Unser Netzwerk ist ein soziales Wissens- und Aktionsnetzwerk. Daher ist es uns besonders wichtig, dass möglichst viele Inhalte öffentlich zugänglich sind. Im Laufe der Entwicklung unseres Netzwerkes wird es mehr und mehr die Möglichkeit geben, über die Sichtbarkeit der selbst angegebenen bzw. persönlichen Daten zu entscheiden. Über diese neuen Funktionen werden wir Euch informieren. Ansonsten gilt, dass Du immer darüber nachdenken solltest, welche persönlichen Daten Du über Dich (oder andere) preisgibst. Dies gilt insbesondere für Inhalte von Beiträgen und Kommentaren, da diese einen weitgehend öffentlichen Charakter haben. Später wird es Möglichkeiten geben, die Sichtbarkeit Deines Profils einzuschränken. Teil der Nutzungsbedingungen ist unsere Datenschutzerklärung, die Dich über die einzelnen Datenverarbeitungen in unserem Netzwerk informiert: https://human-connection.org/datenschutz/#netzwerk bzw. https://human-connection.org/datenschutz/ Unsere Datenschutzerklärung ist an die Gesetzeslage und die Charakteristika unseres Netzwerks angepasst und gilt immer in der aktuellsten Version.",
+ "title": "Datenschutz"
+ },
+ "terms-of-service": {
+ "description": "Die folgenden Nutzungsbedingungen sind Basis für die Nutzung unseres Netzwerkes. Beim Registrieren musst Du sie anerkennen und wir werden Dich auch später über ggf. stattfindende Änderungen informieren. Das Human Connection Netzwerk wird in Deutschland betrieben und unterliegt daher deutschem Recht. Gerichtsstand ist Kirchheim / Teck. Zu Details schau in unser Impressum: https://human-connection.org/impressum/",
+ "title": "Nutzungsbedingungen"
+ },
+ "termsAndConditionsConfirmed": "Ich habe die Nutzungsbedingungen durchgelesen und stimme ihnen zu.",
+ "termsAndConditionsNewConfirm": "Ich habe die neuen Nutzungsbedingungen durchgelesen und stimme zu.",
+ "termsAndConditionsNewConfirmText": "Bitte lies Dir die neue Nutzungsbedingungen jetzt durch!",
+ "use-and-license": {
+ "description": "Sind Inhalte, die Du bei uns einstellst, durch Rechte am geistigen Eigentum geschützt, erteilst Du uns eine nicht-exklusive, übertragbare, unterlizenzierbare und weltweite Lizenz für die Nutzung dieser Inhalte für die Bereitstellung in unserem Netzwerk. Diese Lizenz endet, sobald Du Deine Inhalte oder Deinen ganzen Account löscht. Bedenke, dass andere Deine Inhalte weiter teilen können und wir diese nicht löschen können.",
+ "title": "Nutzung und Lizenz"
+ }
+ },
+ "user": {
+ "avatar": {
+ "submitted": "Upload erfolgreich"
+ }
+ }
}
diff --git a/webapp/locales/en.json b/webapp/locales/en.json
index 6bec1c7f7..74dbd1929 100644
--- a/webapp/locales/en.json
+++ b/webapp/locales/en.json
@@ -1,58 +1,780 @@
{
- "components": {
- "password-reset": {
- "request": {
- "title": "Reset your password",
- "form": {
- "description": "A password reset e-mail will be sent to the given e-mail address.",
- "submit": "Request e-mail",
- "submitted": "An e-mail with further instructions has been sent to {email}"
- }
- },
- "change-password": {
- "success": "Changing your password was successful!",
- "error": "Changing your password failed. Maybe the security code was not correct?",
- "help": "In case of problems, feel free to ask for help by sending us a mail to:"
- }
+ "actions": {
+ "cancel": "Cancel",
+ "create": "Create",
+ "delete": "Delete",
+ "edit": "Edit",
+ "loading": "loading",
+ "loadMore": "load more",
+ "save": "Save"
+ },
+ "admin": {
+ "categories": {
+ "categoryName": "Name",
+ "name": "Categories",
+ "postCount": "Posts"
},
+ "dashboard": {
+ "comments": "Comments",
+ "follows": "Follows",
+ "invites": "Invites",
+ "name": "Dashboard",
+ "notifications": "Notifications",
+ "organizations": "Organizations",
+ "posts": "Posts",
+ "projects": "Projects",
+ "shouts": "Shouts",
+ "users": "Users"
+ },
+ "donations": {
+ "goal": "Monthly donations needed",
+ "name": "Donations info",
+ "progress": "Donations collected so far",
+ "successfulUpdate": "Donations info updated successfully!"
+ },
+ "hashtags": {
+ "name": "Hashtags",
+ "nameOfHashtag": "Name",
+ "number": "No.",
+ "tagCount": "Posts",
+ "tagCountUnique": "Users"
+ },
+ "invites": {
+ "description": "Invitations are a wonderful way to have your friends in your network …",
+ "name": "Invite users",
+ "title": "Invite people"
+ },
+ "name": "Admin",
+ "notifications": {
+ "name": "Notifications"
+ },
+ "organizations": {
+ "name": "Organizations"
+ },
+ "pages": {
+ "name": "Pages"
+ },
+ "settings": {
+ "name": "Settings"
+ },
+ "users": {
+ "empty": "No users found",
+ "form": {
+ "placeholder": "e-mail, name or description"
+ },
+ "name": "Users",
+ "table": {
+ "columns": {
+ "createdAt": "Created at",
+ "email": "E-mail",
+ "name": "Name",
+ "number": "No.",
+ "role": "Role",
+ "slug": "Slug"
+ }
+ }
+ }
+ },
+ "code-of-conduct": {
+ "consequences": {
+ "description": "If a community member exhibits unacceptable behaviour, the responsible operators, moderators and administrators of the network may take appropriate measures, including but not limited to:",
+ "list": {
+ "0": "Request for immediate cessation of unacceptable conduct",
+ "1": "Locking or deleting comments",
+ "2": "Temporary exclusion from the respective post or contribution",
+ "3": "Blocking or deleting of content",
+ "4": "Temporary withdrawal of write permissions",
+ "5": "Temporary exclusion from the network",
+ "6": "Final exclusion from the network",
+ "7": "Violations of German law can be reported."
+ },
+ "title": "Consequences of Unacceptable Behavior"
+ },
+ "expected-behaviour": {
+ "description": "The following behaviors are expected and requested of all community members:",
+ "list": {
+ "0": "Exercise consideration and respect in your speech and actions.",
+ "1": "Attempt collaboration before conflict.",
+ "2": "Refrain from demeaning, discriminatory, or harassing behavior and speech.",
+ "3": "Be mindful of your surroundings and of your fellow participants. Alert community leaders if you notice a dangerous situation, someone in distress, or violations of this Code of Conduct, even if they seem inconsequential."
+ },
+ "title": "Expected Behaviour"
+ },
+ "get-help": "If you are subject to or witness unacceptable behavior, or have any other concerns, please notify a community organizer as soon as possible and link or refer to the corresponding content:",
+ "preamble": {
+ "description": "Human Connection is a non-profit social knowledge and action network of the next generation. By people - for people. Open Source, fair and transparent. For positive local and global change in all areas of life. We completely redesign the public exchange of knowledge, ideas and projects. The functions of Human Connection bring people together - offline and online - so that we can make the world a better place.",
+ "title": "Preamble"
+ },
+ "purpose": {
+ "description": "With these code of conduct we regulate the essential principles for behavior in our social network. The United Nations Charter of Human Rights is our orientation and forms the heart of our understanding of values. The code of conduct serves as guiding principles for our personal appearance and interaction with one another. Anyone who is active as a user in the Human Connection Network, writes articles, comments or contacts other users, including those outside the network,acknowledges these rules of conduct as binding.",
+ "title": "Purpose"
+ },
+ "subheader": "for the social network of the Human Connection gGmbH",
+ "unacceptable-behaviour": {
+ "description": "The following behaviors are unacceptable within our community:",
+ "list": {
+ "0": "Discriminatory posts, comments, utterances or insults, particularly those relating to gender, sexual orientation, race, religion, political or philosophical orientation or disability.",
+ "1": "Posting or linking of clearly pornographic material.",
+ "2": "Glorification or trivialization of cruel or inhuman acts of violence.",
+ "3": "The disclosure of others' personal information without their consent or threat there of (\"doxing\").",
+ "4": "Intentional intimidation, stalking or persecution.",
+ "5": "Advertising products and services with commercial intent.",
+ "6": "Criminal behavior or violation of German law.",
+ "7": "Endorse or encourage such conduct."
+ },
+ "title": "Unacceptable Behavior"
+ }
+ },
+ "comment": {
+ "content": {
+ "unavailable-placeholder": "… this comment is not available anymore"
+ },
+ "edited": "edited",
+ "menu": {
+ "delete": "Delete Comment",
+ "edit": "Edit Comment"
+ },
+ "show": {
+ "less": "show less",
+ "more": "show more"
+ }
+ },
+ "common": {
+ "category": "Category ::: Categories",
+ "comment": "Comment ::: Comments",
+ "letsTalk": "Let`s Talk",
+ "loading": "loading",
+ "loadMore": "load more",
+ "moreInfo": "More Info",
+ "name": "Name",
+ "organization": "Organization ::: Organizations",
+ "post": "Post ::: Posts",
+ "project": "Project ::: Projects",
+ "reportContent": "Report",
+ "shout": "Shout ::: Shouts",
+ "tag": "Tag ::: Tags",
+ "takeAction": "Take Action",
+ "user": "User ::: Users",
+ "validations": {
+ "categories": "at least one and at most three categories must be selected",
+ "email": "must be a valid e-mail address",
+ "url": "must be a valid URL"
+ },
+ "versus": "Versus"
+ },
+ "components": {
"enter-nonce": {
"form": {
- "nonce": "Enter your code",
"description": "Open your inbox and enter the code that we've sent to you.",
"next": "Continue",
+ "nonce": "Enter your code",
"validations": {
"length": "must be 6 characters long"
}
}
},
- "registration": {
- "signup": {
- "unavailable": "Unfortunately, public registration of user accounts is not available right now on this server.",
- "title": "Join Human Connection!",
+ "password-reset": {
+ "change-password": {
+ "error": "Changing your password failed. Maybe the security code was not correct?",
+ "help": "In case of problems, feel free to ask for help by sending us a mail to:",
+ "success": "Changing your password was successful!"
+ },
+ "request": {
+ "form": {
+ "description": "A password reset e-mail will be sent to the given e-mail address.",
+ "submit": "Request e-mail",
+ "submitted": "An e-mail with further instructions has been sent to {email}"
+ },
+ "title": "Reset your password"
+ }
+ },
+ "registration": {
+ "create-user-account": {
+ "error": "No user account could be created!",
+ "help": " Maybe the confirmation was invalid? In case of problems, feel free to ask for help by sending us a mail to:",
+ "success": "Your account has been created!",
+ "title": "Create user account"
+ },
+ "signup": {
"form": {
- "description": "To get started, you can register here for free:",
- "terms-and-condition": "I confirm to the Terms and conditions.",
"data-privacy": " I have read and understood the Privacy Statement ",
- "minimum-age": "I'm 18 years or older.",
- "no-commercial": "I have no commercial interests and I am not representing a company or any other commercial organisation on the network.",
- "no-political": "I am not on behalf of a party or political organization in the network.",
- "invitation-code": "Your invitation code is: {code}",
+ "description": "To get started, you can register here for free:",
"errors": {
"email-exists": "There is already a user account with this e-mail address!",
"invalid-invitation-token": "It looks like as if the invitation has been used already. Invitation links can only be used once."
},
+ "invitation-code": "Your invitation code is: {code}",
+ "minimum-age": "I'm 18 years or older.",
+ "no-commercial": "I have no commercial interests and I am not representing a company or any other commercial organisation on the network.",
+ "no-political": "I am not on behalf of a party or political organization in the network.",
"submit": "Create an account",
- "success": "A mail with a link to complete your registration has been sent to {email}"
- }
- },
- "create-user-account": {
- "title": "Create user account",
- "success": "Your account has been created!",
- "error": "No user account could be created!",
- "help": " Maybe the confirmation was invalid? In case of problems, feel free to ask for help by sending us a mail to:"
+ "success": "A mail with a link to complete your registration has been sent to {email}",
+ "terms-and-condition": "I confirm to the Terms and conditions."
+ },
+ "title": "Join Human Connection!",
+ "unavailable": "Unfortunately, public registration of user accounts is not available right now on this server."
}
}
},
+ "contribution": {
+ "amount-comments": "{amount} comments",
+ "amount-shouts": "{amount} recommendations",
+ "categories": {
+ "infoSelectedNoOfMaxCategories": "{chosen} of {max} categories selected"
+ },
+ "category": {
+ "name": {
+ "animal-protection": "Animal Protection",
+ "art-culture-sport": "Art, Culture, & Sport",
+ "consumption-sustainability": "Consumption & Sustainability",
+ "cooperation-development": "Cooperation & Development",
+ "democracy-politics": "Democracy & Politics",
+ "economy-finances": "Economy & Finances",
+ "education-sciences": "Education & Sciences",
+ "energy-technology": "Energy & Technology",
+ "environment-nature": "Environment & Nature",
+ "freedom-of-speech": "Freedom of Speech",
+ "global-peace-nonviolence": "Global Peace & Nonviolence",
+ "happiness-values": "Happiness & Values",
+ "health-wellbeing": "Health & Wellbeing",
+ "human-rights-justice": "Human Rights & Justice",
+ "it-internet-data-privacy": "IT, Internet & Data Privacy",
+ "just-for-fun": "Just for Fun"
+ }
+ },
+ "emotions-label": {
+ "angry": "Angry",
+ "cry": "Cry",
+ "funny": "Funny",
+ "happy": "Happy",
+ "surprised": "Surprised"
+ },
+ "filterALL": "View all contributions",
+ "filterFollow": "Filter contributions from users I follow",
+ "inappropriatePicture": "This image may be inappropriate for some people.",
+ "inappropriatePictureText": "When should my picture be blurred",
+ "languageSelectLabel": "Language of your contribution",
+ "languageSelectText": "Select Language",
+ "newPost": "Create a new Post",
+ "success": "Saved!",
+ "teaserImage": {
+ "cropperConfirm": "Confirm"
+ },
+ "title": "Title"
+ },
+ "delete": {
+ "cancel": "Cancel",
+ "comment": {
+ "message": "Do you really want to delete the comment \"{name}\"?",
+ "success": "Comment successfully deleted!",
+ "title": "Delete Comment",
+ "type": "Comment"
+ },
+ "contribution": {
+ "message": "Do you really want to delete the post \"{name}\"?",
+ "success": "Post successfully deleted!",
+ "title": "Delete Post",
+ "type": "Contribution"
+ },
+ "submit": "Delete"
+ },
+ "disable": {
+ "cancel": "Cancel",
+ "comment": {
+ "message": "Do you really want to disable the comment from \"{name}\"?",
+ "title": "Disable Comment",
+ "type": "Comment"
+ },
+ "contribution": {
+ "message": "Do you really want to disable the contribution \"{name}\"?",
+ "title": "Disable Contribution",
+ "type": "Contribution"
+ },
+ "submit": "Disable",
+ "success": "Disabled successfully!",
+ "user": {
+ "message": "Do you really want to disable the user \"{name}\"?",
+ "title": "Disable User",
+ "type": "User"
+ }
+ },
+ "donations": {
+ "amount-of-total": "{amount} of {total} € collected",
+ "donate-now": "Donate now",
+ "donations-for": "Donations for"
+ },
+ "editor": {
+ "embed": {
+ "always_allow": "Always allow embedded content by third party providers (this setting can be changed any time)",
+ "data_privacy_info": "Your data has not yet been shared with any third party providers. If you proceed to watch this video the following provider will likely collect user data:",
+ "data_privacy_warning": "Data Privacy Warning!",
+ "play_now": "Watch now"
+ },
+ "hashtag": {
+ "addHashtag": "New hashtag",
+ "addLetter": "Type a letter",
+ "noHashtagsFound": "No hashtags found"
+ },
+ "mention": {
+ "noUsersFound": "No users found"
+ },
+ "placeholder": "Leave your inspirational thoughts …"
+ },
+ "error-pages": {
+ "403-default": "Not authorized to this page",
+ "404-default": "This page could not be found",
+ "500-default": "Internal Server Error",
+ "503-default": "Service Unavailable",
+ "back-to-index": "Back to index page",
+ "cannot-edit-post": "This post cannot be edited",
+ "default": "An error occurred",
+ "post-not-found": "This post could not be found",
+ "profile-not-found": "This profile could not be found"
+ },
+ "filter-menu": {
+ "clearSearch": "Clear search",
+ "hashtag-search": "Searching for #{hashtag}",
+ "title": "Your filter bubble"
+ },
+ "filter-posts": {
+ "categories": {
+ "all": "All",
+ "header": "Categories of Content"
+ },
+ "followers": {
+ "label": "Users I follow"
+ },
+ "general": {
+ "header": "Filter by …"
+ },
+ "language": {
+ "all": "All",
+ "header": "Languages"
+ }
+ },
+ "followButton": {
+ "follow": "Follow",
+ "following": "Following"
+ },
+ "index": {
+ "change-filter-settings": "Change your filter settings to get more results.",
+ "no-results": "No contributions found."
+ },
+ "login": {
+ "copy": "If you already have a human-connection account, please login.",
+ "email": "Your E-mail",
+ "failure": "Incorrect email address or password.",
+ "forgotPassword": "Forgot Password?",
+ "hello": "Hello",
+ "login": "Login",
+ "logout": "Logout",
+ "moreInfo": "What is Human Connection?",
+ "moreInfoHint": "to the presentation page",
+ "moreInfoURL": "https://human-connection.org/en/",
+ "no-account": "Don't have an account?",
+ "password": "Your Password",
+ "register": "Sign up",
+ "success": "You are logged in!"
+ },
+ "maintenance": {
+ "explanation": "At the moment we are doing some scheduled maintenance, please try again later.",
+ "questions": "Any Questions or concerns, send an e-mail to",
+ "title": "Human Connection is under maintenance"
+ },
+ "moderation": {
+ "name": "Moderation",
+ "reports": {
+ "author": "Author",
+ "content": "Content",
+ "decideButton": "Confirm",
+ "decided": "Decided",
+ "decideModal": {
+ "cancel": "Cancel",
+ "Comment": {
+ "disable": {
+ "message": "Do you really want to let the comment \"{name}\" stay disabled?",
+ "title": "Finally Disable Comment"
+ },
+ "enable": {
+ "message": "Do you really want to let the comment \"{name}\" stay enabled?",
+ "title": "Finally Enable Comment"
+ }
+ },
+ "Post": {
+ "disable": {
+ "message": "Do you really want to let the post \"{name}\" stay disabled?",
+ "title": "Finally Disable Post"
+ },
+ "enable": {
+ "message": "Do you really want to let the post \"{name}\" stay enabled?",
+ "title": "Finally Enable Post"
+ }
+ },
+ "submit": "Confirm decision",
+ "User": {
+ "disable": {
+ "message": "Do you really want to let the user \"{name}\" stay disabled?",
+ "title": "Finally Disable User"
+ },
+ "enable": {
+ "message": "Do you really want to let the user \"{name}\" stay enabled?",
+ "title": "Finally Enable User"
+ }
+ }
+ },
+ "decision": "Decision",
+ "DecisionSuccess": "Decided successfully!",
+ "disabled": "Disabled",
+ "disabledAt": "Disabled at",
+ "disabledBy": "Disabled by",
+ "empty": "Congratulations, nothing to moderate.",
+ "enabled": "Enabled",
+ "enabledAt": "Enabled at",
+ "enabledBy": "Enabled by",
+ "filterLabel": {
+ "all": "All",
+ "closed": "Closed",
+ "reviewed": "Reviewed",
+ "unreviewed": "Unreviewed"
+ },
+ "moreDetails": "View Details",
+ "name": "Reports",
+ "noDecision": "No decision!",
+ "numberOfUsers": "{count} users",
+ "previousDecision": "Previous decision:",
+ "reasonCategory": "Category",
+ "reasonDescription": "Description",
+ "reportedOn": "Date",
+ "status": "Current status",
+ "submitter": "Reported by"
+ }
+ },
+ "notifications": {
+ "comment": "Comment",
+ "content": "Content",
+ "empty": "Sorry, you don't have any notifications at the moment.",
+ "filterLabel": {
+ "all": "All",
+ "read": "Read",
+ "unread": "Unread"
+ },
+ "pageLink": "All notifications",
+ "post": "Post",
+ "reason": {
+ "commented_on_post": "Commented on your post …",
+ "mentioned_in_comment": "Mentioned you in a comment …",
+ "mentioned_in_post": "Mentioned you in a post …"
+ },
+ "title": "Notifications",
+ "user": "User"
+ },
+ "post": {
+ "comment": {
+ "reply": "Reply",
+ "submit": "Comment",
+ "submitted": "Comment submitted!",
+ "updated": "Changes saved!"
+ },
+ "edited": "edited",
+ "menu": {
+ "delete": "Delete post",
+ "edit": "Edit post",
+ "pin": "Pin post",
+ "pinnedSuccessfully": "Post pinned successfully!",
+ "unpin": "Unpin post",
+ "unpinnedSuccessfully": "Post unpinned successfully!"
+ },
+ "moreInfo": {
+ "description": "Here you can find more information about this topic.",
+ "name": "More info",
+ "title": "More information",
+ "titleOfCategoriesSection": "Categories",
+ "titleOfHashtagsSection": "Hashtags",
+ "titleOfRelatedContributionsSection": "Related posts"
+ },
+ "name": "Post",
+ "pinned": "Announcement",
+ "takeAction": {
+ "name": "Take action"
+ }
+ },
+ "profile": {
+ "commented": "Commented",
+ "follow": "Follow",
+ "followers": "Followers",
+ "following": "Following",
+ "invites": {
+ "description": "Enter their e-mail address for invitation.",
+ "emailPlaceholder": "E-mail to invite",
+ "title": "Invite somebody to Human Connection!"
+ },
+ "memberSince": "Member since",
+ "name": "My Profile",
+ "network": {
+ "andMore": "and {number} more …",
+ "followedBy": "is followed by:",
+ "followedByNobody": "is not followed by anyone.",
+ "following": "is following:",
+ "followingNobody": "follows nobody.",
+ "title": "Network"
+ },
+ "shouted": "Shouted",
+ "socialMedia": "Where else can I find",
+ "userAnonym": "Anonymous"
+ },
+ "quotes": {
+ "african": {
+ "author": "African proverb",
+ "quote": "Many small people in many small places do many small things, that can alter the face of the world."
+ }
+ },
+ "release": {
+ "cancel": "Cancel",
+ "comment": {
+ "error": "You have already reported the comment!",
+ "message": "Do you really want to release the comment from \"{name}\"?",
+ "title": "Release Comment",
+ "type": "Comment"
+ },
+ "contribution": {
+ "error": "You have already reported the contribution!!",
+ "message": "Do you really want to release the contribution \"{name}\"?",
+ "title": "Release Contribution",
+ "type": "Contribution"
+ },
+ "submit": "Release",
+ "success": "Released successfully!",
+ "user": {
+ "error": "You already reported the user!",
+ "message": "Do you really want to release the user \"{name}\"?",
+ "title": "Release User",
+ "type": "User"
+ }
+ },
+ "report": {
+ "cancel": "Cancel",
+ "comment": {
+ "error": "You have already reported the comment!",
+ "message": "Do you really want to report the comment from \"{name}\"?",
+ "title": "Report Comment",
+ "type": "Comment"
+ },
+ "contribution": {
+ "error": "You have already reported the contribution!",
+ "message": "Do you really want to report the contribution \"{name}\"?",
+ "title": "Report Post",
+ "type": "Contribution"
+ },
+ "reason": {
+ "category": {
+ "invalid": "Please select a valid category",
+ "label": "Select a category:",
+ "options": {
+ "advert_products_services_commercial": "Advertising products and services with commercial intent.",
+ "criminal_behavior_violation_german_law": "Criminal behavior or violation of German law.",
+ "discrimination_etc": "Discriminatory posts, comments, utterances or insults.",
+ "doxing": "The disclosure of others' personal information without their consent or threat there of (\"doxing\").",
+ "glorific_trivia_of_cruel_inhuman_acts": "Glorification or trivialization of cruel or inhuman acts of violence.",
+ "intentional_intimidation_stalking_persecution": "Intentional intimidation, stalking or persecution.",
+ "other": "Other …",
+ "pornographic_content_links": "Posting or linking of clearly pornographic material."
+ },
+ "placeholder": "Category …"
+ },
+ "description": {
+ "label": "Please explain: Why you like to report this?",
+ "placeholder": "Additional information …"
+ }
+ },
+ "submit": "Report",
+ "success": "Thanks for reporting!",
+ "user": {
+ "error": "You already reported the user!",
+ "message": "Do you really want to report the user \"{name}\"?",
+ "title": "Report User",
+ "type": "User"
+ }
+ },
+ "search": {
+ "failed": "Nothing found",
+ "heading": {
+ "Post": "Posts",
+ "User": "Users"
+ },
+ "hint": "What are you searching for?",
+ "placeholder": "Search"
+ },
+ "settings": {
+ "blocked-users": {
+ "block": "Block user",
+ "columns": {
+ "name": "Name",
+ "slug": "Slug",
+ "unblock": "Unblock"
+ },
+ "empty": "So far, you have not blocked anybody.",
+ "explanation": {
+ "closing": "This should be sufficient for now so that blocked users can no longer bother you.",
+ "commenting-disabled": "Commenting is not possible at this time on this post.",
+ "commenting-explanation": "This can happen for several reasons, please see our ",
+ "intro": "If another user has been blocked by you, this is what happens:",
+ "notifications": "Blocked users will no longer receive notifications if they mention each other.",
+ "their-perspective": "Vice versa: The blocked person will also no longer be able to interact with your contributions.",
+ "your-perspective": "You will no longer be able to interact with their contributions."
+ },
+ "how-to": "You can block other users on their profile page via the content menu.",
+ "name": "Blocked users",
+ "unblock": "Unblock user",
+ "unblocked": "{name} is unblocked again"
+ },
+ "data": {
+ "labelBio": "About You",
+ "labelCity": "Your City or Region",
+ "labelName": "Your Name",
+ "labelSlug": "Your unique user name",
+ "name": "Your data",
+ "namePlaceholder": "Femanon Funny",
+ "success": "Your data was successfully updated!"
+ },
+ "deleteUserAccount": {
+ "accountDescription": "Be aware that your Posts and Comments are important to our community. If you still choose to delete them, you have to mark them below.",
+ "accountWarning": "You CAN'T MANAGE and CAN'T RECOVER your Account, Posts, or Comments after deleting your account!",
+ "commentedCount": "Delete my {count} comments",
+ "contributionsCount": "Delete my {count} posts",
+ "name": "Delete user account",
+ "pleaseConfirm": "Destructive action! Type “{confirm}” to confirm.",
+ "success": "Account successfully deleted!"
+ },
+ "download": {
+ "name": "Download Data"
+ },
+ "email": {
+ "change-successful": "Your e-mail address has been changed successfully.",
+ "labelEmail": "Change your e-mail address",
+ "labelNewEmail": "New e-mail Address",
+ "labelNonce": "Enter your code",
+ "name": "Your e-mail",
+ "submitted": "An e-mail to verify your address has been sent to {email}.",
+ "success": "A new e-mail address has been registered.",
+ "validation": {
+ "same-email": "This is your current e-mail address"
+ },
+ "verification-error": {
+ "explanation": "This can have different causes:",
+ "message": "Your e-mail could not be changed.",
+ "reason": {
+ "invalid-nonce": "Is the confirmation code invalid?",
+ "no-email-request": "Are you certain that you requested a change of your e-mail address?"
+ },
+ "support": "If the problem persists, please contact us by e-mail at"
+ }
+ },
+ "embeds": {
+ "info-description": "Here is the list of third-party providers whose content can be displayed as third-party code, e.g. in the form of embedded videos.",
+ "name": "Third party providers",
+ "status": {
+ "change": {
+ "allow": "Sure",
+ "deny": "No thanks",
+ "question": "Should embedded source code from third parties always be displayed to you?"
+ },
+ "description": "As a default for you, embedded code of third-party providers is",
+ "disabled": {
+ "off": "initially not displayed",
+ "on": "displayed immediately"
+ }
+ }
+ },
+ "invites": {
+ "name": "Invites"
+ },
+ "languages": {
+ "name": "Languages"
+ },
+ "muted-users": {
+ "columns": {
+ "name": "Name",
+ "slug": "Slug",
+ "unmute": "Unmute"
+ },
+ "empty": "So far, you have not muted anybody.",
+ "explanation": {
+ "intro": "If another user has been muted by you, this is what happens:",
+ "search": "Posts of muted people disappear from your search results.",
+ "your-perspective": "The muted person's posts will no longer appear in your news feed."
+ },
+ "how-to": "You can mute other users on their profile page via the content menu.",
+ "mute": "Mute user",
+ "name": "Muted users",
+ "unmute": "Unmute user",
+ "unmuted": "{name} is unmuted again"
+ },
+ "name": "Settings",
+ "organizations": {
+ "name": "My Organizations"
+ },
+ "privacy": {
+ "make-shouts-public": "Share articles I have shouted on my public profile",
+ "name": "Privacy",
+ "success-update": "Privacy settings saved"
+ },
+ "security": {
+ "change-password": {
+ "button": "Change password",
+ "label-new-password": "Your new password",
+ "label-new-password-confirm": "Confirm new password",
+ "label-old-password": "Your old password",
+ "message-new-password-confirm-required": "Confirm your new password",
+ "message-new-password-missmatch": "Type the same password again",
+ "message-new-password-required": "Enter a new password",
+ "message-old-password-required": "Enter your old password",
+ "passwordSecurity": "Password security",
+ "passwordStrength0": "Very insecure password",
+ "passwordStrength1": "Insecure password",
+ "passwordStrength2": "Mediocre password",
+ "passwordStrength3": "Strong password",
+ "passwordStrength4": "Very strong password",
+ "success": "Password successfully changed!"
+ },
+ "name": "Security"
+ },
+ "social-media": {
+ "name": "Social media",
+ "placeholder": "Your social media url",
+ "requireUnique": "You added this url already",
+ "submit": "Add link",
+ "successAdd": "Added social media. Updated user profile!",
+ "successDelete": "Deleted social media. Updated user profile!"
+ },
+ "validation": {
+ "slug": {
+ "alreadyTaken": "This user name is already taken.",
+ "regex": "Allowed characters are only lowercase letters, numbers, underscores and hyphens."
+ }
+ }
+ },
+ "shoutButton": {
+ "shouted": "shouted"
+ },
+ "site": {
+ "back-to-login": "Back to login page",
+ "bank": "bank account",
+ "code-of-conduct": "Code of Conduct",
+ "contact": "Contact",
+ "data-privacy": "Data privacy",
+ "director": "Managing Director",
+ "error-occurred": "An error occurred.",
+ "faq": "FAQ",
+ "germany": "Germany",
+ "imprint": "Imprint",
+ "made": "Made with ❤",
+ "register": "Registry number",
+ "responsible": "responsible for contents of this page (§ 55 Abs. 2 RStV)",
+ "taxident": "USt-ID. according to §27a of the German Sales Tax Law:",
+ "termsAndConditions": "Terms and conditions",
+ "thanks": "Thanks!",
+ "tribunal": "Registry court"
+ },
"store": {
"posts": {
"orderBy": {
@@ -65,766 +787,52 @@
}
}
},
- "donations": {
- "donations-for": "Donations for",
- "donate-now": "Donate now",
- "amount-of-total": "{amount} of {total} € collected"
- },
- "maintenance": {
- "title": "Human Connection is under maintenance",
- "explanation": "At the moment we are doing some scheduled maintenance, please try again later.",
- "questions": "Any Questions or concerns, send an e-mail to"
- },
- "index": {
- "no-results": "No contributions found.",
- "change-filter-settings": "Change your filter settings to get more results."
- },
- "filter-menu": {
- "title": "Your filter bubble",
- "hashtag-search": "Searching for #{hashtag}",
- "clearSearch": "Clear search"
- },
- "filter-posts": {
- "categories": {
- "header": "Categories of Content",
- "all": "All"
+ "termsAndConditions": {
+ "addition": {
+ "description": " https://human-connection.org/events/ ",
+ "title": "In addition, we regularly hold events where you can also share your impressions and ask questions. You can find a current overview here:"
},
- "general": {
- "header": "Filter by …"
+ "agree": "I agree!",
+ "code-of-conduct": {
+ "description": "Our code of conduct serves as a handbook for personal appearance and interaction with each other. Whoever is active as a user in the Human Connection network, writes articles, comments or makes contact with other users, even outside the network, acknowledges these rules of conduct as binding. https://alpha.human-connection.org/code-of-conduct",
+ "title": "Code of Conduct"
},
- "followers": {
- "label": "Users I follow"
+ "errors-and-feedback": {
+ "description": "We make every effort to keep our network and data secure and available. Each new release of the software goes through both automated and manual testing. However, unforeseen errors may occur. Therefore, we are grateful for any reported bugs. You are welcome to report any bugs you discover by emailing Support at support@human-connection.org",
+ "title": "Errors and Feedback"
},
- "language": {
- "header": "Languages",
- "all": "All"
- }
- },
- "site": {
- "thanks": "Thanks!",
- "error-occurred": "An error occurred.",
- "made": "Made with ❤",
- "imprint": "Imprint",
- "termsAndConditions": "Terms and conditions",
- "data-privacy": "Data privacy",
- "contact": "Contact",
- "tribunal": "Registry court",
- "register": "Registry number",
- "director": "Managing Director",
- "taxident": "USt-ID. according to §27a of the German Sales Tax Law:",
- "responsible": "responsible for contents of this page (§ 55 Abs. 2 RStV)",
- "bank": "bank account",
- "germany": "Germany",
- "code-of-conduct": "Code of Conduct",
- "back-to-login": "Back to login page",
- "faq": "FAQ"
- },
- "login": {
- "copy": "If you already have a human-connection account, please login.",
- "login": "Login",
- "logout": "Logout",
- "email": "Your E-mail",
- "password": "Your Password",
- "forgotPassword": "Forgot Password?",
- "no-account": "Don't have an account?",
- "register": "Sign up",
- "moreInfo": "What is Human Connection?",
- "moreInfoURL": "https://human-connection.org/en/",
- "moreInfoHint": "to the presentation page",
- "hello": "Hello",
- "success": "You are logged in!",
- "failure": "Incorrect email address or password."
- },
- "editor": {
- "placeholder": "Leave your inspirational thoughts …",
- "mention": {
- "noUsersFound": "No users found"
+ "help-and-questions": {
+ "description": "For help and questions we have compiled a comprehensive collection of frequently asked questions and answers (FAQ) for you. You can find them here: https://support.human-connection.org/kb/ ",
+ "title": "Help and Questions"
},
- "hashtag": {
- "noHashtagsFound": "No hashtags found",
- "addHashtag": "New hashtag",
- "addLetter": "Type a letter"
+ "moderation": {
+ "description": "Until our financial possibilities allow us to implement the community moderation system, we moderate with a simplified system and with our own or possibly volunteer staff. We train these moderators and for this reason only they make the appropriate decisions. These moderators carry out their work anonymously. You can report posts, comments and users to us (for example, if they provide information in their profile or have images that violate these Terms of Use). If you report something to us, you can give us a reason and a short explanation. We will then take a look at what you have reported and sanction you if necessary, e.g. by blocking contributions, comments or users. Unfortunately, you and the person concerned will not receive any feedback from us at this time, but this is in the planning stage. Irrespective of this, we reserve the right to impose sanctions in principle for reasons that may not or not yet be listed in our Code of Conduct or these terms of service.",
+ "title": "Moderation"
},
- "embed": {
- "data_privacy_warning": "Data Privacy Warning!",
- "data_privacy_info": "Your data has not yet been shared with any third party providers. If you proceed to watch this video the following provider will likely collect user data:",
- "play_now": "Watch now",
- "always_allow": "Always allow embedded content by third party providers (this setting can be changed any time)"
- }
- },
- "profile": {
- "name": "My Profile",
- "memberSince": "Member since",
- "follow": "Follow",
- "followers": "Followers",
- "following": "Following",
- "shouted": "Shouted",
- "commented": "Commented",
- "userAnonym": "Anonymous",
- "socialMedia": "Where else can I find",
- "network": {
- "title": "Network",
- "following": "is following:",
- "followingNobody": "follows nobody.",
- "followedBy": "is followed by:",
- "followedByNobody": "is not followed by anyone.",
- "andMore": "and {number} more …"
+ "newTermsAndConditions": "New Terms and Conditions",
+ "no-commercial-use": {
+ "description": "The use of the Human Connection Network is not permitted for commercial purposes. This includes, but is not limited to, advertising products with commercial intent, posting affiliate links, directly soliciting donations, or providing financial support for purposes that are not recognized as charitable for tax purposes.",
+ "title": "No Commercial Use"
},
- "invites": {
- "title": "Invite somebody to Human Connection!",
- "description": "Enter their e-mail address for invitation.",
- "emailPlaceholder": "E-mail to invite"
- }
- },
- "notifications": {
- "reason": {
- "mentioned_in_post": "Mentioned you in a post …",
- "mentioned_in_comment": "Mentioned you in a comment …",
- "commented_on_post": "Commented on your post …"
+ "privacy-statement": {
+ "description": "Our network is a social knowledge and action network. It is therefore particularly important to us that as much content as possible is publicly accessible. In the course of the development of our network there will be more and more the possibility to decide about the visibility of the personal data. We will inform you about these new features. Otherwise, you should always think about which personal data you disclose about yourself (or others). This applies in particular to the content of posts and comments, as these have a largely public character. Later there will be possibilities to limit the visibility of your profile. Part of the terms of service is our privacy statement, which informs you about the individual data processing operations in our network: https://human-connection.org/datenschutz/#netzwerk bzw. https://human-connection.org/datenschutz/ Our privacy statement is adapted to the legal situation and characteristics of our network and is always valid in the most current version.",
+ "title": "Privacy Statement"
},
- "comment": "Comment",
- "title": "Notifications",
- "pageLink": "All notifications",
- "post": "Post",
- "user": "User",
- "content": "Content",
- "filterLabel": {
- "all": "All",
- "read": "Read",
- "unread": "Unread"
+ "terms-of-service": {
+ "description": "The following terms of use form the basis for the use of our network. When you register, you must accept them and we will inform you later about any changes that may take place. The Human Connection Network is operated in Germany and is therefore subject to German law. Place of jurisdiction is Kirchheim / Teck. For details see our imprint: https://human-connection.org/imprint ",
+ "title": "Terms of Service"
},
- "empty": "Sorry, you don't have any notifications at the moment."
- },
- "search": {
- "placeholder": "Search",
- "hint": "What are you searching for?",
- "failed": "Nothing found",
- "heading": {
- "Post": "Posts",
- "User": "Users"
- }
- },
- "settings": {
- "name": "Settings",
- "data": {
- "name": "Your data",
- "labelName": "Your Name",
- "labelSlug": "Your unique user name",
- "namePlaceholder": "Femanon Funny",
- "labelCity": "Your City or Region",
- "labelBio": "About You",
- "success": "Your data was successfully updated!"
- },
- "email": {
- "validation": {
- "same-email": "This is your current e-mail address"
- },
- "name": "Your e-mail",
- "labelEmail": "Change your e-mail address",
- "labelNewEmail": "New e-mail Address",
- "labelNonce": "Enter your code",
- "success": "A new e-mail address has been registered.",
- "submitted": "An e-mail to verify your address has been sent to {email}.",
- "change-successful": "Your e-mail address has been changed successfully.",
- "verification-error": {
- "message": "Your e-mail could not be changed.",
- "explanation": "This can have different causes:",
- "reason": {
- "invalid-nonce": "Is the confirmation code invalid?",
- "no-email-request": "Are you certain that you requested a change of your e-mail address?"
- },
- "support": "If the problem persists, please contact us by e-mail at"
- }
- },
- "validation": {
- "slug": {
- "regex": "Allowed characters are only lowercase letters, numbers, underscores and hyphens.",
- "alreadyTaken": "This user name is already taken."
- }
- },
- "security": {
- "name": "Security",
- "change-password": {
- "button": "Change password",
- "success": "Password successfully changed!",
- "label-old-password": "Your old password",
- "label-new-password": "Your new password",
- "label-new-password-confirm": "Confirm new password",
- "message-old-password-required": "Enter your old password",
- "message-new-password-required": "Enter a new password",
- "message-new-password-confirm-required": "Confirm your new password",
- "message-new-password-missmatch": "Type the same password again",
- "passwordSecurity": "Password security",
- "passwordStrength0": "Very insecure password",
- "passwordStrength1": "Insecure password",
- "passwordStrength2": "Mediocre password",
- "passwordStrength3": "Strong password",
- "passwordStrength4": "Very strong password"
- }
- },
- "privacy": {
- "name": "Privacy",
- "make-shouts-public": "Share articles I have shouted on my public profile",
- "success-update": "Privacy settings saved"
- },
- "invites": {
- "name": "Invites"
- },
- "download": {
- "name": "Download Data"
- },
- "deleteUserAccount": {
- "name": "Delete user account",
- "contributionsCount": "Delete my {count} posts",
- "commentedCount": "Delete my {count} comments",
- "accountDescription": "Be aware that your Posts and Comments are important to our community. If you still choose to delete them, you have to mark them below.",
- "accountWarning": "You CAN'T MANAGE and CAN'T RECOVER your Account, Posts, or Comments after deleting your account!",
- "success": "Account successfully deleted!",
- "pleaseConfirm": "Destructive action! Type “{confirm}” to confirm."
- },
- "embeds": {
- "name": "Third party providers",
- "info-description": "Here is the list of third-party providers whose content can be displayed as third-party code, e.g. in the form of embedded videos.",
- "status": {
- "description": "As a default for you, embedded code of third-party providers is",
- "disabled": {
- "off": "initially not displayed",
- "on": "displayed immediately"
- },
- "change": {
- "question": "Should embedded source code from third parties always be displayed to you?",
- "allow": "Sure",
- "deny": "No thanks"
- }
- }
- },
- "organizations": {
- "name": "My Organizations"
- },
- "languages": {
- "name": "Languages"
- },
- "social-media": {
- "name": "Social media",
- "placeholder": "Your social media url",
- "requireUnique": "You added this url already",
- "submit": "Add link",
- "successAdd": "Added social media. Updated user profile!",
- "successDelete": "Deleted social media. Updated user profile!"
- },
- "muted-users": {
- "name": "Muted users",
- "explanation": {
- "intro": "If another user has been muted by you, this is what happens:",
- "your-perspective": "The muted person's posts will no longer appear in your news feed.",
- "search": "Posts of muted people disappear from your search results."
- },
- "columns": {
- "name": "Name",
- "slug": "Slug",
- "unmute": "Unmute"
- },
- "empty": "So far, you have not muted anybody.",
- "how-to": "You can mute other users on their profile page via the content menu.",
- "mute": "Mute user",
- "unmute": "Unmute user",
- "unmuted": "{name} is unmuted again"
- },
- "blocked-users": {
- "name": "Blocked users",
- "explanation": {
- "intro": "If another user has been blocked by you, this is what happens:",
- "your-perspective": "You will no longer be able to interact with their contributions.",
- "their-perspective": "Vice versa: The blocked person will also no longer be able to interact with your contributions.",
- "notifications": "Blocked users will no longer receive notifications if they mention each other.",
- "closing": "This should be sufficient for now so that blocked users can no longer bother you.",
- "commenting-disabled": "Commenting is not possible at this time on this post.",
- "commenting-explanation": "This can happen for several reasons, please see our "
- },
- "columns": {
- "name": "Name",
- "slug": "Slug",
- "unblock": "Unblock"
- },
- "empty": "So far, you have not blocked anybody.",
- "how-to": "You can block other users on their profile page via the content menu.",
- "block": "Block user",
- "unblock": "Unblock user",
- "unblocked": "{name} is unblocked again"
- }
- },
- "admin": {
- "name": "Admin",
- "dashboard": {
- "name": "Dashboard",
- "users": "Users",
- "posts": "Posts",
- "comments": "Comments",
- "notifications": "Notifications",
- "organizations": "Organizations",
- "projects": "Projects",
- "invites": "Invites",
- "follows": "Follows",
- "shouts": "Shouts"
- },
- "organizations": {
- "name": "Organizations"
- },
- "users": {
- "name": "Users",
- "form": {
- "placeholder": "e-mail, name or description"
- },
- "table": {
- "columns": {
- "number": "No.",
- "name": "Name",
- "email": "E-mail",
- "slug": "Slug",
- "role": "Role",
- "createdAt": "Created at"
- }
- },
- "empty": "No users found"
- },
- "pages": {
- "name": "Pages"
- },
- "notifications": {
- "name": "Notifications"
- },
- "categories": {
- "name": "Categories",
- "categoryName": "Name",
- "postCount": "Posts"
- },
- "hashtags": {
- "name": "Hashtags",
- "number": "No.",
- "nameOfHashtag": "Name",
- "tagCountUnique": "Users",
- "tagCount": "Posts"
- },
- "settings": {
- "name": "Settings"
- },
- "invites": {
- "name": "Invite users",
- "title": "Invite people",
- "description": "Invitations are a wonderful way to have your friends in your network …"
- },
- "donations": {
- "name": "Donations info",
- "goal": "Monthly donations needed",
- "progress": "Donations collected so far",
- "successfulUpdate": "Donations info updated successfully!"
- }
- },
- "post": {
- "name": "Post",
- "pinned": "Announcement",
- "moreInfo": {
- "name": "More info",
- "title": "More information",
- "description": "Here you can find more information about this topic.",
- "titleOfCategoriesSection": "Categories",
- "titleOfHashtagsSection": "Hashtags",
- "titleOfRelatedContributionsSection": "Related posts"
- },
- "takeAction": {
- "name": "Take action"
- },
- "menu": {
- "edit": "Edit post",
- "delete": "Delete post",
- "pin": "Pin post",
- "pinnedSuccessfully": "Post pinned successfully!",
- "unpin": "Unpin post",
- "unpinnedSuccessfully": "Post unpinned successfully!"
- },
- "comment": {
- "submit": "Comment",
- "submitted": "Comment submitted!",
- "updated": "Changes saved!",
- "reply": "Reply"
- },
- "edited": "edited"
- },
- "comment": {
- "content": {
- "unavailable-placeholder": "… this comment is not available anymore"
- },
- "menu": {
- "edit": "Edit Comment",
- "delete": "Delete Comment"
- },
- "show": {
- "more": "show more",
- "less": "show less"
- },
- "edited": "edited"
- },
- "quotes": {
- "african": {
- "quote": "Many small people in many small places do many small things, that can alter the face of the world.",
- "author": "African proverb"
- }
- },
- "common": {
- "post": "Post ::: Posts",
- "comment": "Comment ::: Comments",
- "letsTalk": "Let`s Talk",
- "versus": "Versus",
- "moreInfo": "More Info",
- "takeAction": "Take Action",
- "shout": "Shout ::: Shouts",
- "user": "User ::: Users",
- "category": "Category ::: Categories",
- "organization": "Organization ::: Organizations",
- "project": "Project ::: Projects",
- "tag": "Tag ::: Tags",
- "name": "Name",
- "loadMore": "load more",
- "loading": "loading",
- "reportContent": "Report",
- "validations": {
- "email": "must be a valid e-mail address",
- "url": "must be a valid URL",
- "categories": "at least one and at most three categories must be selected"
- }
- },
- "actions": {
- "loading": "loading",
- "loadMore": "load more",
- "create": "Create",
- "save": "Save",
- "edit": "Edit",
- "delete": "Delete",
- "cancel": "Cancel"
- },
- "moderation": {
- "name": "Moderation",
- "reports": {
- "empty": "Congratulations, nothing to moderate.",
- "name": "Reports",
- "status": "Current status",
- "content": "Content",
- "author": "Author",
- "decision": "Decision",
- "enabled": "Enabled",
- "disabled": "Disabled",
- "decided": "Decided",
- "noDecision": "No decision!",
- "decideButton": "Confirm",
- "DecisionSuccess": "Decided successfully!",
- "enabledBy": "Enabled by",
- "disabledBy": "Disabled by",
- "previousDecision": "Previous decision:",
- "enabledAt": "Enabled at",
- "disabledAt": "Disabled at",
- "reasonCategory": "Category",
- "reasonDescription": "Description",
- "submitter": "Reported by",
- "numberOfUsers": "{count} users",
- "filterLabel": {
- "all": "All",
- "unreviewed": "Unreviewed",
- "reviewed": "Reviewed",
- "closed": "Closed"
- },
- "reportedOn": "Date",
- "moreDetails": "View Details",
- "decideModal": {
- "submit": "Confirm decision",
- "cancel": "Cancel",
- "User": {
- "disable": {
- "title": "Finally Disable User",
- "message": "Do you really want to let the user \"{name}\" stay disabled?"
- },
- "enable": {
- "title": "Finally Enable User",
- "message": "Do you really want to let the user \"{name}\" stay enabled?"
- }
- },
- "Post": {
- "disable": {
- "title": "Finally Disable Post",
- "message": "Do you really want to let the post \"{name}\" stay disabled?"
- },
- "enable": {
- "title": "Finally Enable Post",
- "message": "Do you really want to let the post \"{name}\" stay enabled?"
- }
- },
- "Comment": {
- "disable": {
- "title": "Finally Disable Comment",
- "message": "Do you really want to let the comment \"{name}\" stay disabled?"
- },
- "enable": {
- "title": "Finally Enable Comment",
- "message": "Do you really want to let the comment \"{name}\" stay enabled?"
- }
- }
- }
- }
- },
- "disable": {
- "submit": "Disable",
- "cancel": "Cancel",
- "success": "Disabled successfully!",
- "user": {
- "title": "Disable User",
- "type": "User",
- "message": "Do you really want to disable the user \"{name}\"?"
- },
- "contribution": {
- "title": "Disable Contribution",
- "type": "Contribution",
- "message": "Do you really want to disable the contribution \"{name}\"?"
- },
- "comment": {
- "title": "Disable Comment",
- "type": "Comment",
- "message": "Do you really want to disable the comment from \"{name}\"?"
- }
- },
- "delete": {
- "submit": "Delete",
- "cancel": "Cancel",
- "contribution": {
- "title": "Delete Post",
- "type": "Contribution",
- "message": "Do you really want to delete the post \"{name}\"?",
- "success": "Post successfully deleted!"
- },
- "comment": {
- "title": "Delete Comment",
- "type": "Comment",
- "message": "Do you really want to delete the comment \"{name}\"?",
- "success": "Comment successfully deleted!"
- }
- },
- "report": {
- "submit": "Report",
- "cancel": "Cancel",
- "success": "Thanks for reporting!",
- "user": {
- "title": "Report User",
- "type": "User",
- "message": "Do you really want to report the user \"{name}\"?",
- "error": "You already reported the user!"
- },
- "contribution": {
- "title": "Report Post",
- "type": "Contribution",
- "message": "Do you really want to report the contribution \"{name}\"?",
- "error": "You have already reported the contribution!"
- },
- "comment": {
- "title": "Report Comment",
- "type": "Comment",
- "message": "Do you really want to report the comment from \"{name}\"?",
- "error": "You have already reported the comment!"
- },
- "reason": {
- "category": {
- "label": "Select a category:",
- "placeholder": "Category …",
- "options": {
- "discrimination_etc": "Discriminatory posts, comments, utterances or insults.",
- "pornographic_content_links": "Posting or linking of clearly pornographic material.",
- "glorific_trivia_of_cruel_inhuman_acts": "Glorification or trivialization of cruel or inhuman acts of violence.",
- "doxing": "The disclosure of others' personal information without their consent or threat there of (\"doxing\").",
- "intentional_intimidation_stalking_persecution": "Intentional intimidation, stalking or persecution.",
- "advert_products_services_commercial": "Advertising products and services with commercial intent.",
- "criminal_behavior_violation_german_law": "Criminal behavior or violation of German law.",
- "other": "Other …"
- },
- "invalid": "Please select a valid category"
- },
- "description": {
- "label": "Please explain: Why you like to report this?",
- "placeholder": "Additional information …"
- }
- }
- },
- "followButton": {
- "follow": "Follow",
- "following": "Following"
- },
- "shoutButton": {
- "shouted": "shouted"
- },
- "release": {
- "submit": "Release",
- "cancel": "Cancel",
- "success": "Released successfully!",
- "user": {
- "title": "Release User",
- "type": "User",
- "message": "Do you really want to release the user \"{name}\"?",
- "error": "You already reported the user!"
- },
- "contribution": {
- "title": "Release Contribution",
- "type": "Contribution",
- "message": "Do you really want to release the contribution \"{name}\"?",
- "error": "You have already reported the contribution!!"
- },
- "comment": {
- "title": "Release Comment",
- "type": "Comment",
- "message": "Do you really want to release the comment from \"{name}\"?",
- "error": "You have already reported the comment!"
+ "termsAndConditionsConfirmed": "I have read and confirmed the Terms and Conditions.",
+ "termsAndConditionsNewConfirm": "I have read and agree to the new terms of conditions.",
+ "termsAndConditionsNewConfirmText": "Please read the new terms of use now!",
+ "use-and-license": {
+ "description": "If any content you post to us is protected by intellectual property rights, you grant us a non-exclusive, transferable, sublicensable, worldwide license to use such content for posting to our network. This license expires when you delete your content or your entire account. Remember that others may share your content and we cannot delete it.",
+ "title": "Use and License"
}
},
"user": {
"avatar": {
"submitted": "Upload successful!"
}
- },
- "contribution": {
- "amount-comments": "{amount} comments",
- "amount-shouts": "{amount} recommendations",
- "title": "Title",
- "newPost": "Create a new Post",
- "filterFollow": "Filter contributions from users I follow",
- "filterALL": "View all contributions",
- "success": "Saved!",
- "languageSelectLabel": "Language of your contribution",
- "languageSelectText": "Select Language",
- "categories": {
- "infoSelectedNoOfMaxCategories": "{chosen} of {max} categories selected"
- },
- "emotions-label": {
- "funny": "Funny",
- "happy": "Happy",
- "surprised": "Surprised",
- "cry": "Cry",
- "angry": "Angry"
- },
- "category": {
- "name": {
- "freedom-of-speech": "Freedom of Speech",
- "consumption-sustainability": "Consumption & Sustainability",
- "global-peace-nonviolence": "Global Peace & Nonviolence",
- "just-for-fun": "Just for Fun",
- "happiness-values": "Happiness & Values",
- "health-wellbeing": "Health & Wellbeing",
- "environment-nature": "Environment & Nature",
- "animal-protection": "Animal Protection",
- "human-rights-justice": "Human Rights & Justice",
- "education-sciences": "Education & Sciences",
- "cooperation-development": "Cooperation & Development",
- "democracy-politics": "Democracy & Politics",
- "economy-finances": "Economy & Finances",
- "energy-technology": "Energy & Technology",
- "it-internet-data-privacy": "IT, Internet & Data Privacy",
- "art-culture-sport": "Art, Culture, & Sport"
- }
- },
- "teaserImage": {
- "cropperConfirm": "Confirm"
- },
- "inappropriatePicture" : "This image may be inappropriate for some people.",
- "inappropriatePictureText" : "When should my picture be blurred"
- },
- "code-of-conduct": {
- "subheader": "for the social network of the Human Connection gGmbH",
- "preamble": {
- "title": "Preamble",
- "description": "Human Connection is a non-profit social knowledge and action network of the next generation. By people - for people. Open Source, fair and transparent. For positive local and global change in all areas of life. We completely redesign the public exchange of knowledge, ideas and projects. The functions of Human Connection bring people together - offline and online - so that we can make the world a better place."
- },
- "purpose": {
- "title": "Purpose",
- "description": "With these code of conduct we regulate the essential principles for behavior in our social network. The United Nations Charter of Human Rights is our orientation and forms the heart of our understanding of values. The code of conduct serves as guiding principles for our personal appearance and interaction with one another. Anyone who is active as a user in the Human Connection Network, writes articles, comments or contacts other users, including those outside the network,acknowledges these rules of conduct as binding."
- },
- "expected-behaviour": {
- "title": "Expected Behaviour",
- "description": "The following behaviors are expected and requested of all community members:",
- "list": {
- "0": "Exercise consideration and respect in your speech and actions.",
- "1": "Attempt collaboration before conflict.",
- "2": "Refrain from demeaning, discriminatory, or harassing behavior and speech.",
- "3": "Be mindful of your surroundings and of your fellow participants. Alert community leaders if you notice a dangerous situation, someone in distress, or violations of this Code of Conduct, even if they seem inconsequential."
- }
- },
- "unacceptable-behaviour": {
- "title": "Unacceptable Behavior",
- "description": "The following behaviors are unacceptable within our community:",
- "list": {
- "0": "Discriminatory posts, comments, utterances or insults, particularly those relating to gender, sexual orientation, race, religion, political or philosophical orientation or disability.",
- "1": "Posting or linking of clearly pornographic material.",
- "2": "Glorification or trivialization of cruel or inhuman acts of violence.",
- "3": "The disclosure of others' personal information without their consent or threat there of (\"doxing\").",
- "4": "Intentional intimidation, stalking or persecution.",
- "5": "Advertising products and services with commercial intent.",
- "6": "Criminal behavior or violation of German law.",
- "7": "Endorse or encourage such conduct."
- }
- },
- "consequences": {
- "title": "Consequences of Unacceptable Behavior",
- "description": "If a community member exhibits unacceptable behaviour, the responsible operators, moderators and administrators of the network may take appropriate measures, including but not limited to:",
- "list": {
- "0": "Request for immediate cessation of unacceptable conduct",
- "1": "Locking or deleting comments",
- "2": "Temporary exclusion from the respective post or contribution",
- "3": "Blocking or deleting of content",
- "4": "Temporary withdrawal of write permissions",
- "5": "Temporary exclusion from the network",
- "6": "Final exclusion from the network",
- "7": "Violations of German law can be reported."
- }
- },
- "get-help": "If you are subject to or witness unacceptable behavior, or have any other concerns, please notify a community organizer as soon as possible and link or refer to the corresponding content:"
- },
- "termsAndConditions": {
- "newTermsAndConditions": "New Terms and Conditions",
- "termsAndConditionsConfirmed": "I have read and confirmed the Terms and Conditions.",
- "termsAndConditionsNewConfirmText": "Please read the new terms of use now!",
- "termsAndConditionsNewConfirm": "I have read and agree to the new terms of conditions.",
- "agree": "I agree!",
- "terms-of-service": {
- "title": "Terms of Service",
- "description": "The following terms of use form the basis for the use of our network. When you register, you must accept them and we will inform you later about any changes that may take place. The Human Connection Network is operated in Germany and is therefore subject to German law. Place of jurisdiction is Kirchheim / Teck. For details see our imprint: https://human-connection.org/imprint "
- },
- "use-and-license" : {
- "title": "Use and License",
- "description": "If any content you post to us is protected by intellectual property rights, you grant us a non-exclusive, transferable, sublicensable, worldwide license to use such content for posting to our network. This license expires when you delete your content or your entire account. Remember that others may share your content and we cannot delete it."
- },
- "privacy-statement" : {
- "title": "Privacy Statement",
- "description": "Our network is a social knowledge and action network. It is therefore particularly important to us that as much content as possible is publicly accessible. In the course of the development of our network there will be more and more the possibility to decide about the visibility of the personal data. We will inform you about these new features. Otherwise, you should always think about which personal data you disclose about yourself (or others). This applies in particular to the content of posts and comments, as these have a largely public character. Later there will be possibilities to limit the visibility of your profile. Part of the terms of service is our privacy statement, which informs you about the individual data processing operations in our network: https://human-connection.org/datenschutz/#netzwerk bzw. https://human-connection.org/datenschutz/ Our privacy statement is adapted to the legal situation and characteristics of our network and is always valid in the most current version."
- },
- "code-of-conduct" : {
- "title": "Code of Conduct",
- "description": "Our code of conduct serves as a handbook for personal appearance and interaction with each other. Whoever is active as a user in the Human Connection network, writes articles, comments or makes contact with other users, even outside the network, acknowledges these rules of conduct as binding. https://alpha.human-connection.org/code-of-conduct"
- },
- "moderation" : {
- "title": "Moderation",
- "description": "Until our financial possibilities allow us to implement the community moderation system, we moderate with a simplified system and with our own or possibly volunteer staff. We train these moderators and for this reason only they make the appropriate decisions. These moderators carry out their work anonymously. You can report posts, comments and users to us (for example, if they provide information in their profile or have images that violate these Terms of Use). If you report something to us, you can give us a reason and a short explanation. We will then take a look at what you have reported and sanction you if necessary, e.g. by blocking contributions, comments or users. Unfortunately, you and the person concerned will not receive any feedback from us at this time, but this is in the planning stage. Irrespective of this, we reserve the right to impose sanctions in principle for reasons that may not or not yet be listed in our Code of Conduct or these terms of service."
- },
- "errors-and-feedback" : {
- "title": "Errors and Feedback",
- "description": "We make every effort to keep our network and data secure and available. Each new release of the software goes through both automated and manual testing. However, unforeseen errors may occur. Therefore, we are grateful for any reported bugs. You are welcome to report any bugs you discover by emailing Support at support@human-connection.org"
- },
- "no-commercial-use" : {
- "title": "No Commercial Use",
- "description": "The use of the Human Connection Network is not permitted for commercial purposes. This includes, but is not limited to, advertising products with commercial intent, posting affiliate links, directly soliciting donations, or providing financial support for purposes that are not recognized as charitable for tax purposes."
- },
- "help-and-questions" : {
- "title": "Help and Questions",
- "description": "For help and questions we have compiled a comprehensive collection of frequently asked questions and answers (FAQ) for you. You can find them here: https://support.human-connection.org/kb/ "
- },
- "addition" : {
- "title": "In addition, we regularly hold events where you can also share your impressions and ask questions. You can find a current overview here:",
- "description": " https://human-connection.org/events/ "
- }
}
}
-
-
-
diff --git a/webapp/locales/es.json b/webapp/locales/es.json
index 18d67c7a4..f17fbbb1b 100644
--- a/webapp/locales/es.json
+++ b/webapp/locales/es.json
@@ -1,809 +1,809 @@
{
- "login": {
- "copy": "Si ya tiene una cuenta de Human Connection, inicie sesión aquí.",
- "login": "Iniciar sesión",
- "logout": "Cierre de sesión",
- "email": "Su correo electrónico",
- "password": "Su contraseña",
- "moreInfo": "¿Qué es Human Connection?",
- "hello": "Hola",
- "forgotPassword": "¿Olvidó su contraseña?",
- "no-account": "¿No tiene una cuenta?",
- "register": "Regístrese",
- "moreInfoURL": "https:\/\/human-connection.org\/es\/",
- "moreInfoHint": "a la página de presentación",
- "success": "¡Usted ha iniciado sesión!",
- "failure": "Dirección de correo electrónico o contraseña incorrecta."
+ "actions": {
+ "cancel": "Cancelar",
+ "create": "Crear",
+ "delete": "Borrar",
+ "edit": "Edite",
+ "loading": "cargamento",
+ "loadMore": "cargar más",
+ "save": "Guardar"
+ },
+ "admin": {
+ "categories": {
+ "categoryName": "Nombre",
+ "name": "Categorías",
+ "postCount": "Contribuciones"
},
- "profile": {
- "name": "Mi perfil",
- "memberSince": "Miembro desde",
- "follow": "Seguir",
- "followers": "Seguidores",
- "following": "Siguiendo",
- "shouted": "Recomendado",
- "commented": "Comentado",
- "userAnonym": "Anónimo",
- "socialMedia": "¿Dónde más puedo encontrar?",
- "network": {
- "title": "Red",
- "following": "está siguiendo:",
- "followingNobody": "no sigue a nadie.",
- "followedBy": "es seguido por:",
- "followedByNobody": "no es seguido por nadie.",
- "andMore": "y {number} más ..."
- },
- "invites": {
- "title": "¡Invite a alguien a Human Connection!",
- "description": "Introduzca la dirección de correo electrónico para la invitación.",
- "emailPlaceholder": "Correo electrónico para invitar"
- }
- },
- "settings": {
- "name": "Configuración",
- "data": {
- "name": "Sus datos",
- "labelName": "Su nombre",
- "labelCity": "Su ciudad o región",
- "labelBio": "Acerca de usted",
- "labelSlug": "Su nombre de usuario único",
- "namePlaceholder": "Femanon Funny",
- "success": "¡Sus datos han sido actualizados con éxito!"
- },
- "security": {
- "name": "Seguridad",
- "change-password": {
- "button": "Cambiar contraseña",
- "success": "¡Contraseña cambiada con éxito!",
- "label-old-password": "Su contraseña antigua",
- "label-new-password": "Su nueva contraseña",
- "label-new-password-confirm": "Confirmar nueva contraseña",
- "message-old-password-required": "Ingrese su contraseña anterior",
- "message-new-password-required": "Introduzca una nueva contraseña",
- "message-new-password-confirm-required": "Confirme su nueva contraseña",
- "message-new-password-missmatch": "Vuelva a escribir la misma contraseña",
- "passwordSecurity": "Seguridad de la contraseña",
- "passwordStrength0": "Contraseña muy insegura",
- "passwordStrength1": "Contraseña insegura",
- "passwordStrength2": "Contraseña mediocre",
- "passwordStrength3": "Contraseña segura",
- "passwordStrength4": "Contraseña muy sólida"
- }
- },
- "invites": {
- "name": "Invita"
- },
- "download": {
- "name": "Descargar datos"
- },
- "delete": {
- "name": "Borrar cuenta"
- },
- "organizations": {
- "name": "Mis organizaciones"
- },
- "languages": {
- "name": "Idiomas"
- },
- "email": {
- "validation": {
- "same-email": "Esta es su dirección de correo electrónico actual"
- },
- "name": "Su correo electrónico",
- "labelEmail": "Cambiar su dirección de correo electrónico",
- "labelNewEmail": "Nueva dirección de correo electrónico",
- "labelNonce": "Introduzca su código",
- "success": "Se ha registrado una nueva dirección de correo electrónico.",
- "submitted": "Se ha enviado un correo electrónico a {email}<\/b> para verificar su dirección.",
- "change-successful": "Su dirección de correo electrónico ha sido cambiada con éxito.",
- "verification-error": {
- "message": "Su correo electrónico no se pudo cambiar.",
- "explanation": "Esto puede tener diferentes causas:",
- "reason": {
- "invalid-nonce": "¿El código de confirmación no es válido?",
- "no-email-request": "¿Está seguro de que ha solicitado un cambio de su dirección de correo electrónico?"
- },
- "support": "Si el problema persiste, póngase en contacto con nosotros por correo electrónico a"
- }
- },
- "validation": {
- "slug": {
- "regex": "Los caracteres permitidos son solo letras minúsculas, números, guiones bajos y guiones.",
- "alreadyTaken": "Este nombre de usuario ya está en uso."
- }
- },
- "deleteUserAccount": {
- "name": "Eliminar cuenta de usuario",
- "contributionsCount": "Eliminar mis {count} contribuciones",
- "commentedCount": "Eliminar mis {count} comentarios",
- "accountDescription": "Tenga en cuenta que su contribución y sus comentarios son importantes para nuestra comunidad. Si aún decide borrarlos, debe marcarlos a continuación.",
- "accountWarning": "¡NO PUEDE GESTIONAR y NO PUEDE RECUPERAR su cuenta, contribuciones o comentarios después de eliminar su cuenta!",
- "success": "¡Cuenta eliminada con éxito!",
- "pleaseConfirm": "¡Acción destructiva! Escriba “{confirm}” para confirmar."
- },
- "embeds": {
- "name": "Proveedores externos",
- "info-description": "Aquí está la lista de proveedores de terceros cuyo contenido se puede mostrar como código de terceros, por ejemplo, en forma de vídeos incrustados.",
- "status": {
- "description": "Por defecto, el código incrustado de proveedores externos está",
- "disabled": {
- "off": "inicialmente sin mostrar",
- "on": "mostrado inmediatamente"
- },
- "change": {
- "question": "¿Debería mostrarse siempre el código fuente incrustado de terceros?",
- "allow": "Seguro",
- "deny": "No, gracias"
- }
- }
- },
- "social-media": {
- "name": "Medios de comunicación social",
- "placeholder": "Agregar una URL de Social-Media",
- "requireUnique": "Ya ha añadido esta url",
- "submit": "Añadir enlace",
- "successAdd": "Social-Media agregó. Perfil actualizado!",
- "successDelete": "Social-Media borrado. Perfil actualizado!"
- },
- "muted-users": {
- "name": "Usuarios bloqueados",
- "explanation": {
- "intro": "Si otro usuario ha sido bloqueado por usted, esto es lo que sucede:",
- "your-perspective": "Las contribuciones de la persona bloqueada no aparecerán más en su canal de noticias.",
- "search": "Las contribuciones de personas bloqueadas desaparecen de los resultados de búsqueda."
- },
- "columns": {
- "name": "Nombre",
- "slug": "Alias",
- "unmute": "Desbloquear"
- },
- "empty": "Hasta ahora, no ha bloqueado a nadie.",
- "how-to": "Puede bloquear a otros usuarios en la página de perfil de aquellos a través del menú de contenido.",
- "mute": "Bloquear usuario",
- "unmute": "Desbloquear usuario",
- "unmuted": "{name} está desbloqueado nuevamente"
- },
- "privacy": {
- "name": "Privacidad",
- "make-shouts-public": "Compartir artículos que he recomendado en mi perfil público",
- "success-update": "Configuración de privacidad guardada"
- }
- },
- "admin": {
- "name": "Admin",
- "dashboard": {
- "name": "Tablero",
- "users": "Usuarios",
- "posts": "Contribuciones",
- "comments": "Comentarios",
- "notifications": "Notificaciones",
- "organizations": "Organizaciones",
- "projects": "Proyectos",
- "invites": "Invita",
- "follows": "Sigue",
- "shouts": "Recomendaciones"
- },
- "organizations": {
- "name": "Organizaciones"
- },
- "users": {
- "name": "Usuarios",
- "form": {
- "placeholder": "correo electrónico, nombre o descripción"
- },
- "table": {
- "columns": {
- "number": "No.",
- "name": "Nombre",
- "email": "Correo electrónico",
- "slug": "Alias",
- "role": "Rol",
- "createdAt": "Creado el"
- }
- },
- "empty": "No se han encontrado usuarios"
- },
- "pages": {
- "name": "Páginas"
- },
- "notifications": {
- "name": "Notificaciones"
- },
- "categories": {
- "name": "Categorías",
- "categoryName": "Nombre",
- "postCount": "Contribuciones"
- },
- "tags": {
- "name": "Etiquetas",
- "tagCountUnique": "Usuarios",
- "tagCount": "Contribuciones"
- },
- "settings": {
- "name": "Configuración"
- },
- "hashtags": {
- "name": "Hashtags",
- "number": "No.",
- "nameOfHashtag": "Nombre",
- "tagCountUnique": "Usuarios",
- "tagCount": "Contribuciones"
- },
- "invites": {
- "name": "Invitar usuarios",
- "title": "Invitar personas",
- "description": "Las invitaciones son una manera maravillosa de tener a sus amigos en su red ..."
- },
- "donations": {
- "name": "Información de donaciones",
- "goal": "Donaciones mensuales necesarias",
- "progress": "Donaciones recogidas hasta ahora",
- "successfulUpdate": "¡Información de donaciones actualizada con éxito!"
- }
- },
- "post": {
- "name": "Contribución",
- "moreInfo": {
- "name": "Más info",
- "title": "Más información",
- "description": "Aquí puede encontrar más información sobre este tema.",
- "titleOfCategoriesSection": "Categorías",
- "titleOfHashtagsSection": "Hashtags",
- "titleOfRelatedContributionsSection": "Contribuciones relacionadas"
- },
- "takeAction": {
- "name": "Tomar acción"
- },
- "pinned": "Anuncio",
- "menu": {
- "edit": "Editar contribución",
- "delete": "Borrar contribución",
- "pin": "Anclar contribución",
- "pinnedSuccessfully": "¡Contribución anclado con éxito!",
- "unpin": "Desanclar contribución",
- "unpinnedSuccessfully": "¡Contribución desanclado con éxito!"
- },
- "comment": {
- "submit": "Comentario",
- "submitted": "Comentario enviado",
- "updated": "Cambios guardados"
- },
- "edited": "editado"
- },
- "quotes": {
- "african": {
- "quote": "Muchas personas pequeñas en muchos lugares pequeños hacen muchas cosas pequeñas, que pueden alterar la faz del mundo.",
- "author": "Proverbio africano"
- }
- },
- "common": {
- "post": "Mensaje ::: Mensajes",
- "comment": "Comentario ::: Comentarios",
- "letsTalk": "Hablemos",
- "versus": "Versus",
- "moreInfo": "Más información",
- "takeAction": "Tomar acción",
- "shout": "Grito ::: Gritos",
- "user": "Usuario ::: Usuarios",
- "category": "Categoría ::: Categorías",
- "organization": "Organización ::: Organizaciones",
- "project": "Proyecto ::: Proyectos",
- "tag": "Etiqueta ::: Etiquetas",
- "name": "Nombre",
- "loadMore": "cargar más",
- "loading": "cargando",
- "reportContent": "Informe",
- "validations": {
- "email": "debe ser una dirección de correo electrónico válida",
- "url": "debe ser una URL válida",
- "categories": "deben seleccionarse al menos una y como máximo tres categorías"
- }
- },
- "actions": {
- "loading": "cargamento",
- "loadMore": "cargar más",
- "create": "Crear",
- "save": "Guardar",
- "edit": "Edite",
- "delete": "Borrar",
- "cancel": "Cancelar"
- },
- "moderation": {
- "name": "Moderación",
- "reports": {
- "empty": "Felicitaciones, nada que moderar.",
- "name": "Informes",
- "reporter": "reportado por",
- "submitter": "comunicado por",
- "disabledBy": "desactivado por",
- "reasonCategory": "Categoría",
- "reasonDescription": "Descripción",
- "status": "Estado actual",
- "content": "Contenido",
- "author": "Autor",
- "decision": "Decisión",
- "enabled": "Habilitado",
- "disabled": "Deshabilitado",
- "decided": "Decidido",
- "noDecision": "¡No hay decisión!",
- "decideButton": "Confirmar",
- "DecisionSuccess": "Decidido con éxito!",
- "enabledBy": "Habilitado por",
- "previousDecision": "Decisión previa:",
- "enabledAt": "Habilitado el",
- "disabledAt": "Deshabilitado el",
- "numberOfUsers": "{count} usuarios",
- "filterLabel": {
- "all": "Todos",
- "unreviewed": "Sin revisar",
- "reviewed": "Revisado",
- "closed": "Cerrado"
- },
- "reportedOn": "Fecha",
- "moreDetails": "Ver Detalles",
- "decideModal": {
- "submit": "Confirmar decisión",
- "cancel": "Cancelar",
- "User": {
- "disable": {
- "title": "Finalmente Deshabilitar Usuario",
- "message": "¿Realmente quiere que el usuario \"{nombre}<\/b>\" permanezca desactivado<\/b>?"
- },
- "enable": {
- "title": "Finalmente Habilitar Usuario",
- "message": "¿Realmente quiere que el usuario \"{nombre}<\/b>\" permanezca habilitado<\/b>?"
- }
- },
- "Post": {
- "disable": {
- "title": "Finalmente Desactivar Contribución",
- "message": "¿Realmente quiere que la entrada \"{nombre}<\/b>\" permanezca desactivada<\/b>?"
- },
- "enable": {
- "title": "Finalmente Habilitar Contribución",
- "message": "¿Realmente quiere que la contribución \"{nombre}<\/b>\" permanezca activada<\/b>?"
- }
- },
- "Comment": {
- "disable": {
- "title": "Desactivar finalmente Comentario",
- "message": "¿Realmente quiere que el comentario \"{nombre}<\/b>\" permanezca desactivado<\/b>?"
- },
- "enable": {
- "title": "Finalmente Habilitar Comentario",
- "message": "¿Realmente quiere que el comentario \"{nombre}<\/b>\" permanezca habilitado<\/b>?"
- }
- }
- }
- }
- },
- "disable": {
- "user": {
- "title": "Desactivar usuario",
- "type": "Usuario",
- "message": "¿Realmente quieres deshabilitar el usuario \"{name}<\/b>\"?"
- },
- "contribution": {
- "title": "Deshabilitar contribución",
- "type": "Contribución",
- "message": "¿Realmente quieres deshabilitar la contribución \"{name}<\/b>\"?"
- },
- "comment": {
- "title": "Desactivar comentario",
- "type": "Comentario",
- "message": "¿Realmente quieres deshabilitar el comentario de \"{name}<\/b>\"?"
- },
- "submit": "Desactivar",
- "cancel": "Cancelar",
- "success": "Discapacitado con éxito"
- },
- "report": {
- "submit": "Informe",
- "cancel": "Cancelar",
- "user": {
- "title": "Reportar usuario",
- "type": "Usuario",
- "message": "¿Realmente quieres reportar al usuario \"{name}<\/b>\"?",
- "error": "¡Ya reportó al usuario!"
- },
- "contribution": {
- "title": "Informe Contribución",
- "type": "Contribución",
- "message": "¿Realmente quieres informar al usuario de la contribución \"{name}<\/b>\"?",
- "error": "¡Ya ha reportado la contribución!"
- },
- "comment": {
- "title": "Reportar comentario",
- "type": "Comentario",
- "message": "¿Realmente quieres reportar el comentario de \"{name}<\/b>\"?",
- "error": "¡Ya ha reportado al comentario!"
- },
- "success": "¡Gracias por informar!",
- "reason": {
- "category": {
- "label": "Seleccione una categoría:",
- "placeholder": "Categoría ...",
- "options": {
- "discrimination_etc": "Contribuciones discriminatorias, comentarios, expresiones o insultos.",
- "pornographic_content_links": "Publicación o enlace de material claramente pornográfico.",
- "glorific_trivia_of_cruel_inhuman_acts": "Glorificación o minimización de actos de violencia crueles o inhumanos.",
- "doxing": "La divulgación de información personal de otros sin su consentimiento o amenaza de (\"doxing\").",
- "intentional_intimidation_stalking_persecution": "Intimidación intencional, acoso o persecución.",
- "advert_products_services_commercial": "Publicidad de productos y servicios con fines comerciales.",
- "criminal_behavior_violation_german_law": "Comportamiento criminal o violación de la ley alemana.",
- "other": "Otra ..."
- },
- "invalid": "Por favor seleccione una categoría válida"
- },
- "description": {
- "label": "Por favor explique: ¿Por qué le gusta reportar esto?",
- "placeholder": "Información adicional...."
- }
- }
- },
- "contribution": {
- "edit": "Editar contribución",
- "delete": "Eliminar contribución",
- "title": "Título",
- "newPost": "Crear una nueva contribución",
- "filterFollow": "Filtrar las contribuciones de los usuarios que sigo",
- "filterALL": "Ver todas las contribuciones",
- "success": "¡Guardado!",
- "languageSelectLabel": "Idioma",
- "categories": {
- "infoSelectedNoOfMaxCategories": "{chosen} de {max} categorías seleccionadas"
- },
- "emotions-label": {
- "funny": "Gracioso",
- "happy": "Feliz",
- "surprised": "Sorprendido",
- "cry": "Llorar",
- "angry": "Enfadado"
- },
- "category": {
- "name": {
- "freedom-of-speech": "Libertad de expresión",
- "consumption-sustainability": "Consumo y Sostenibilidad",
- "global-peace-nonviolence": "Paz Global y No-Violencia",
- "just-for-fun": "Sólo por diversión",
- "happiness-values": "Felicidad y Valores",
- "health-wellbeing": "Salud y Bienestar",
- "environment-nature": "Medio ambiente y Naturaleza",
- "animal-protection": "Protección de animales",
- "human-rights-justice": "Derechos Humanos y Justicia",
- "education-sciences": "Educación y Ciencias",
- "cooperation-development": "Cooperación y Desarrollo",
- "democracy-politics": "Democracia y Política",
- "economy-finances": "Economía y Finanzas",
- "energy-technology": "Energía y Tecnología",
- "it-internet-data-privacy": "TI, Internet y privacidad de datos",
- "art-culture-sport": "Arte, Cultura y Deporte"
- }
- },
- "teaserImage": {
- "cropperConfirm": "Confirmar"
- },
- "languageSelectText": "Seleccione el idioma"
- },
- "comment": {
- "edit": "Editar comentario",
- "delete": "Eliminar comentario",
- "content": {
- "unavailable-placeholder": "... este comentario ya no está disponible"
- },
- "menu": {
- "edit": "Editar comentario",
- "delete": "Borrar comentario"
- },
- "show": {
- "more": "mostrar más",
- "less": "mostrar menos"
- },
- "edited": "editado"
- },
- "followButton": {
- "follow": "Seguir",
- "following": "Siguiendo"
- },
- "shoutButton": {
- "shouted": "recomendado"
- },
- "search": {
- "placeholder": "Buscar",
- "hint": "¿Qué estás buscando?",
- "failed": "No se ha encontrado nada"
- },
- "components": {
- "password-reset": {
- "request": {
- "title": "Restablecer su contraseña",
- "form": {
- "description": "Se enviará un correo electrónico de restablecimiento de contraseña a la dirección de correo electrónico especificada.",
- "submit": "Solicitar correo electrónico",
- "submitted": "Se ha enviado un correo electrónico con más instrucciones a {email}<\/b>."
- }
- },
- "change-password": {
- "success": "El cambio de contraseña ha sido un éxito!",
- "error": "Error al cambiar la contraseña. ¿Posiblemente un código de seguridad incorrecto?",
- "help": "Si tiene algún problema, por favor envíenos un correo electrónico a:"
- }
- },
- "enter-nonce": {
- "form": {
- "nonce": "Introduzca el código",
- "description": "Abra su buzón de correo e introduzca el código que le enviamos.",
- "next": "Continuar",
- "validations": {
- "length": "debe tener exactamente 6 letras"
- }
- }
- },
- "registration": {
- "signup": {
- "unavailable": "Desafortunadamente, el registro público de cuentas de usuario en este servidor actualmente no es posible.",
- "title": "¡Únete a Human Connection!",
- "form": {
- "description": "Para empezar, introduzca su dirección de correo electrónico:",
- "terms-and-condition": "Estoy de acuerdo con los términos de uso<\/ds-text><\/a>.",
- "data-privacy": "He leido y entendido la declaración de protección de datos<\/ds-text><\/a>",
- "minimum-age": "Tengo 18 años o más.",
- "invitation-code": "Su código de invitación es: {code}<\/b>",
- "errors": {
- "email-exists": "¡Ya hay una cuenta de usuario con esta dirección de correo electrónico!",
- "invalid-invitation-token": "Parece que el código de invitación ya ha sido canjeado. Cada código sólo se puede utilizar una vez."
- },
- "submit": "Crear una cuenta",
- "success": "Se ha enviado un correo electrónico con un enlace de confirmación para el registro a {email}<\/b>.",
- "no-commercial": "No tengo intensiones comerciales y no represento una empresa u organización comercial.",
- "no-political": "No estoy en la red en nombre de un partido o una organización política."
- }
- },
- "create-user-account": {
- "title": "Crear una cuenta de usuario",
- "success": "¡Su cuenta de usuario ha sido creada!",
- "error": "¡No se ha podido crear una cuenta de usuario!",
- "help": "¿Tal vez el código de verificación era incorrecto o expiró? Si el problema persiste, por favor envíenos un correo electrónico a:"
- }
- }
- },
- "store": {
- "posts": {
- "orderBy": {
- "newest": {
- "label": "Más reciente"
- },
- "oldest": {
- "label": "Más antiguo"
- }
- }
- }
- },
- "maintenance": {
- "title": "Human Connection está en mantenimiento",
- "explanation": "Actualmente estamos llevando a cabo algunos trabajos de mantenimiento planificados, por favor, inténtelo de nuevo más tarde.",
- "questions": "Si tiene alguna pregunta o problema, por favor contáctenos por correo electrónico a"
- },
- "index": {
- "no-results": "No se han encontrado contribuciones.",
- "change-filter-settings": "Cambie la configuración de sus filtros para obtener más resultados."
- },
- "filter-menu": {
- "title": "Su burbuja de filtro",
- "hashtag-search": "Buscando a #{hashtag}",
- "clearSearch": "Borrar búsqueda"
- },
- "filter-posts": {
- "categories": {
- "header": "Categorías de contenido",
- "all": "Todas"
- },
- "general": {
- "header": "Filtrar por...."
- },
- "followers": {
- "label": "Usuarios que sigo"
- },
- "language": {
- "header": "Idiomas",
- "all": "Todos"
- }
- },
- "site": {
- "thanks": "¡Gracias!",
- "error-occurred": "Se ha ocurrido un error.",
- "made": "Hecho con ❤",
- "imprint": "Pie de imprenta",
- "termsAndConditions": "Términos y condiciones",
- "data-privacy": "Protección de datos",
- "contact": "Contacto",
- "tribunal": "Tribunal de registro",
- "register": "Número de registro",
- "director": "Director General",
- "taxident": "Número de identificación del impuesto sobre el valor añadido según el § 27 a de la Ley del Impuesto sobre el Valor Añadido (Alemania)",
- "responsible": "Responsable según § 55 Abs. 2 RStV (Alemania)",
- "bank": "cuenta bancaria",
- "germany": "Alemania",
- "code-of-conduct": "Código de conducta",
- "back-to-login": "Volver a la página de inicio de sesión",
- "faq": "Preguntas más frecuentes"
- },
- "editor": {
- "placeholder": "Deje sus pensamientos inspiradores....",
- "mention": {
- "noUsersFound": "No se han encontrado usuarios"
- },
- "hashtag": {
- "noHashtagsFound": "No se han encontrado hashtags",
- "addHashtag": "Nuevo hashtag",
- "addLetter": "Escriba una letra"
- },
- "embed": {
- "data_privacy_warning": "¡Advertencia de privacidad de datos!",
- "data_privacy_info": "Sus datos aún no han sido compartidos con terceros proveedores. Si usted procede a ver este video, el siguiente proveedor probablemente recolectará datos del usuario:",
- "play_now": "Ver ahora",
- "always_allow": "Permitir siempre contenido incrustado por proveedores externos (esta configuración se puede cambiar en cualquier momento)"
- }
- },
- "notifications": {
- "reason": {
- "mentioned_in_post": "Le mencionó en una contribución …",
- "mentioned_in_comment": "Le mencionó en un comentario …",
- "commented_on_post": "Comentó su contribución ..."
- },
- "comment": "Comentario",
- "title": "Notificaciones",
- "pageLink": "Todas las notificaciones",
- "post": "Contribución",
- "user": "Usuario",
- "content": "Contenido",
- "filterLabel": {
- "all": "Todas",
- "read": "Leído",
- "unread": "No leído"
- },
- "empty": "Lo sentimos, no tiene ninguna notificación en este momento."
- },
- "delete": {
- "submit": "Borrar",
- "cancel": "Cancelar",
- "contribution": {
- "title": "Borrar contribución",
- "type": "Contribución",
- "message": "¿Realmente desea eliminar la Contribución \"{name}<\/b>\" ?",
- "success": "¡Publicación eliminado con éxito!"
- },
- "comment": {
- "title": "Eliminar comentario",
- "type": "Comentario",
- "message": "¿Realmente quieres borrar el comentario de \"{name}<\/b>\" ?",
- "success": "¡Comentario eliminado con éxito!"
- }
- },
- "release": {
- "submit": "Liberar",
- "cancel": "Cancelar",
- "success": "¡Liberado con éxito!",
- "user": {
- "title": "Liberar usuario",
- "type": "Usuario",
- "message": "¿Realmente quieres liberar al usuario \"{name}<\/b>\"?",
- "error": "¡Ya ha reportado el usuario!"
- },
- "contribution": {
- "title": "Contribución de la versión ",
- "type": "Contribución",
- "message": "¿Realmente quieres liberar la contribución \"{name}<\/b>\"?",
- "error": "¡Ya ha reportado la contribución!"
- },
- "comment": {
- "title": "Comentario de la versión",
- "type": "Comentario",
- "message": "¿Realmente quieres liberar el comentario de \"{name}<\/b>\"?",
- "error": "¡Ya ha reportado el comentario!"
- }
- },
- "user": {
- "avatar": {
- "submitted": "Carga con éxito"
- }
- },
- "code-of-conduct": {
- "subheader": "para la red social de Human Connection gGmbH",
- "preamble": {
- "title": "Preámbulo",
- "description": "Human Connection es una red de conocimiento y acción social sin fines de lucro de la próxima generación. Por la gente - para la gente. Código Abierto, justo y transparente. Por un cambio positivo a nivel local y global en todas las áreas de la vida. Rediseñamos completamente el intercambio público de conocimientos, ideas y proyectos. Las funciones de Human Connection unen a las personas - fuera de línea y en línea - para que podamos hacer del mundo un lugar mejor."
- },
- "purpose": {
- "title": "Propósito",
- "description": "Con este código de conducta regulamos los principios esenciales de comportamiento en nuestra red social. La Carta de Derechos Humanos de las Naciones Unidas es nuestra orientación y constituye el núcleo de nuestra comprensión de los valores. El código de conducta sirve como principios rectores para nuestra apariencia personal y la interacción entre nosotros. Cualquiera que esté activo como usuario de la Red de Human Connection, escriba artículos, comentarios o se ponga en contacto con otros usuarios, incluidos los que están fuera de la red, reconoce que estas normas de conducta son vinculantes."
- },
- "expected-behaviour": {
- "title": "Comportamiento esperado",
- "description": "Los siguientes comportamientos son esperados y solicitados de todos los miembros de la comunidad:",
- "list": {
- "0": "Ejercite la consideración y el respeto en su discurso y en sus acciones.",
- "1": "Intento de colaboración antes del conflicto.",
- "2": "Abstenerse de denigrar, discriminar o acosar la conducta y el habla.",
- "3": "Tenga en cuenta su entorno y sus compañeros participantes. Alerte a los líderes de la comunidad si nota una situación peligrosa, alguien en apuros o violaciones de este Código de Conducta, incluso si parecen no tener consecuencias."
- }
- },
- "unacceptable-behaviour": {
- "title": "Comportamiento Inaceptable",
- "description": "Los siguientes comportamientos son inaceptables dentro de nuestra comunidad:",
- "list": {
- "0": "Publicaciones, comentarios, expresiones o insultos discriminatorios, particularmente aquellos relacionados con género, orientación sexual, raza, religión, orientación política o filosófica o discapacidad.",
- "1": "Publicación o enlace de material claramente pornográfico.",
- "2": "Glorificación o trivialización de actos de violencia crueles o inhumanos.",
- "3": "La divulgación de información personal de otros sin su consentimiento o amenaza de (\"doxing\").",
- "4": "Intimidación intencional, acoso o persecución.",
- "5": "Publicidad de productos y servicios con fines comerciales.",
- "6": "Comportamiento criminal o violación de la ley alemana.",
- "7": "Apoyar o alentar dicha conducta."
- }
- },
- "consequences": {
- "title": "Consecuencias de Comportamiento Inaceptable",
- "description": "Si un miembro de la comunidad muestra un comportamiento inaceptable, los operadores, moderadores y administradores responsables de la red pueden tomar las medidas apropiadas, incluyendo pero no limitándose a:",
- "list": {
- "0": "Solicitud de cese inmediato de conducta inaceptable",
- "1": "Bloquear o eliminar comentarios",
- "2": "Exclusión temporal de la contribución respectiva",
- "3": "Bloqueo o eliminación de contenido",
- "4": "Retirada temporal de permisos de escritura",
- "5": "Exclusión temporal de la red.",
- "6": "Exclusión definitiva de la red",
- "7": "Las violaciones de la ley alemana pueden ser denunciadas."
- }
- },
- "get-help": "Si usted está sujeto a un comportamiento inaceptable, lo experimenta o tiene otras preocupaciones, por favor notifique a un organizador de la comunidad tan pronto como sea posible y enlace o apunte el contenido relevante:"
- },
- "termsAndConditions": {
- "newTermsAndConditions": "Nuevos términos de uso",
- "termsAndConditionsConfirmed": "He leído y acepto los términos de uso<\/a>.",
- "termsAndConditionsNewConfirmText": "¡Por favor, lea los nuevos términos de uso ahora!",
- "termsAndConditionsNewConfirm": "He leído y acepto los nuevos términos de uso.",
- "agree": "¡Estoy de acuerdo!",
- "terms-of-service": {
- "title": "Términos de uso",
- "description": "Las siguientes condiciones de uso constituyen la base para el uso de nuestra red. Cuando se registre, deberá aceptarlos y le informaremos más adelante de cualquier cambio que se produzca. La Red de Human Connection es operada en Alemania y por lo tanto está sujeta a la ley alemana. El fuero competente es Kirchheim \/ Teck. Para más detalles, consulte nuestro pie de imprenta: https:\/\/human-connection.org\/en\/imprint<\/a> "
- },
- "use-and-license": {
- "title": "Uso y Licencia",
- "description": "Si cualquier contenido que nos envíe está protegido por derechos de propiedad intelectual, nos concede una licencia mundial no exclusiva, transferible, sublicenciable y no exclusiva para utilizar dicho contenido para su publicación en nuestra red. Esta licencia caduca cuando usted elimina su contenido o toda su cuenta. Recuerde que otros pueden compartir su contenido y que nosotros no podemos eliminarlo."
- },
- "privacy-statement": {
- "title": "Protección de datos",
- "description": "Nuestra red es una red de conocimiento y acción social. Por lo tanto, es especialmente importante para nosotros que el mayor número posible de contenidos sea accesible al público. En el curso del desarrollo de nuestra red habrá cada vez más la posibilidad de decidir sobre la visibilidad de los datos personales. Le informaremos sobre estas nuevas características. De lo contrario, siempre debe pensar en los datos personales que revela sobre usted (u otros). Esto se aplica en particular al contenido de los mensajes y comentarios, ya que éstos tienen un carácter ampliamente público. Más tarde habrá posibilidades de limitar la visibilidad de su perfil. Parte de los términos del servicio es nuestra declaración de privacidad, que le informa sobre las operaciones individuales de procesamiento de datos en nuestra red: https:\/\/human-connection.org\/datenschutz\/#netzwerk<\/a> o https:\/\/human-connection.org\/datenschutz\/<\/a> Nuestra declaración de privacidad está adaptada a la situación legal y a las características de nuestra red y es siempre válida en la versión más actualizada."
- },
- "code-of-conduct": {
- "title": "Código de conducta",
- "description": "Nuestro código de conducta sirve como un manual para la apariencia personal y la interacción entre nosotros. Quien esté activo como usuario en la red de Human Connection, escriba artículos, haga comentarios o se ponga en contacto con otros usuarios, incluso fuera de la red, reconoce que estas normas de conducta son vinculantes. https:\/\/alpha.human-connection.org\/code-of-conduct<\/a>"
- },
- "moderation": {
- "title": "Moderación",
- "description": "Hasta que nuestras posibilidades financieras nos permitan implementar el sistema de moderación comunitaria, moderaremos con un sistema simplificado y con personal propio o posiblemente voluntario. Formamos a estos moderadores y por eso sólo ellos toman las decisiones adecuadas. Estos moderadores realizan su trabajo de forma anónima. Usted puede reportarnos contribuciones, comentarios y usuarios (por ejemplo, si proporcionan información en su perfil o tienen imágenes que violan estos Términos de Uso). Si nos informa de algo, puede darnos una razón y una breve explicación. A continuación, examinaremos su denuncia y le sancionaremos si es necesario, por ejemplo, bloqueando las contribuciones, los comentarios o los usuarios. Desafortunadamente, usted y la persona en cuestión no recibirán ninguna respuesta de nuestra parte en este momento, pero esto se encuentra en la fase de planificación. Independientemente de esto, nos reservamos el derecho de imponer sanciones en principio por razones que pueden no estar incluidas o no estar incluidas en nuestro Código de Conducta o en estas condiciones de servicio."
- },
- "errors-and-feedback": {
- "title": "Errores y comentarios",
- "description": "Hacemos todo lo posible para mantener nuestra red y los datos seguros y disponibles. Cada nueva versión del software pasa por pruebas automáticas y manuales. No obstante, pueden producirse errores imprevistos. Por lo tanto, estamos agradecidos por cualquier error reportado. Le invitamos a informar de cualquier error que haya descubierto enviando un correo electrónico a Soporte: support@human-connection.org"
- },
- "help-and-questions": {
- "title": "Ayuda y preguntas",
- "description": "Para ayuda y preguntas hemos compilado una colección completa de preguntas y respuestas frecuentes (FAQ) para usted. Puede encontrarlos aquí: https:\/\/support.human-connection.org\/kb\/<\/a>"
- },
- "addition": {
- "title": "Además, regularmente celebramos eventos donde también puede dar impresiones y hacer preguntas. Puede encontrar un resumen actualizado aquí:",
- "description": " https:\/\/human-connection.org\/events\/ <\/a>"
- },
- "no-commercial-use": {
- "title": "Sin uso comercial",
- "description": "El uso de la red Human Connection no está permitido para fines comerciales. Esto incluye, pero no se limita a, publicitar productos con intención comercial, publicar enlaces de afiliados, solicitar donaciones directamente o brindar apoyo financiero para fines que no se reconocen como caritativos para fines fiscales."
- }
+ "dashboard": {
+ "comments": "Comentarios",
+ "follows": "Sigue",
+ "invites": "Invita",
+ "name": "Tablero",
+ "notifications": "Notificaciones",
+ "organizations": "Organizaciones",
+ "posts": "Contribuciones",
+ "projects": "Proyectos",
+ "shouts": "Recomendaciones",
+ "users": "Usuarios"
},
"donations": {
- "donations-for": "Donaciones para",
- "donate-now": "Donar ahora",
- "amount-of-total": "{amount} de {total} € recaudados"
+ "goal": "Donaciones mensuales necesarias",
+ "name": "Información de donaciones",
+ "progress": "Donaciones recogidas hasta ahora",
+ "successfulUpdate": "¡Información de donaciones actualizada con éxito!"
+ },
+ "hashtags": {
+ "name": "Hashtags",
+ "nameOfHashtag": "Nombre",
+ "number": "No.",
+ "tagCount": "Contribuciones",
+ "tagCountUnique": "Usuarios"
+ },
+ "invites": {
+ "description": "Las invitaciones son una manera maravillosa de tener a sus amigos en su red ...",
+ "name": "Invitar usuarios",
+ "title": "Invitar personas"
+ },
+ "name": "Admin",
+ "notifications": {
+ "name": "Notificaciones"
+ },
+ "organizations": {
+ "name": "Organizaciones"
+ },
+ "pages": {
+ "name": "Páginas"
+ },
+ "settings": {
+ "name": "Configuración"
+ },
+ "tags": {
+ "name": "Etiquetas",
+ "tagCount": "Contribuciones",
+ "tagCountUnique": "Usuarios"
+ },
+ "users": {
+ "empty": "No se han encontrado usuarios",
+ "form": {
+ "placeholder": "correo electrónico, nombre o descripción"
+ },
+ "name": "Usuarios",
+ "table": {
+ "columns": {
+ "createdAt": "Creado el",
+ "email": "Correo electrónico",
+ "name": "Nombre",
+ "number": "No.",
+ "role": "Rol",
+ "slug": "Alias"
+ }
+ }
}
+ },
+ "code-of-conduct": {
+ "consequences": {
+ "description": "Si un miembro de la comunidad muestra un comportamiento inaceptable, los operadores, moderadores y administradores responsables de la red pueden tomar las medidas apropiadas, incluyendo pero no limitándose a:",
+ "list": {
+ "0": "Solicitud de cese inmediato de conducta inaceptable",
+ "1": "Bloquear o eliminar comentarios",
+ "2": "Exclusión temporal de la contribución respectiva",
+ "3": "Bloqueo o eliminación de contenido",
+ "4": "Retirada temporal de permisos de escritura",
+ "5": "Exclusión temporal de la red.",
+ "6": "Exclusión definitiva de la red",
+ "7": "Las violaciones de la ley alemana pueden ser denunciadas."
+ },
+ "title": "Consecuencias de Comportamiento Inaceptable"
+ },
+ "expected-behaviour": {
+ "description": "Los siguientes comportamientos son esperados y solicitados de todos los miembros de la comunidad:",
+ "list": {
+ "0": "Ejercite la consideración y el respeto en su discurso y en sus acciones.",
+ "1": "Intento de colaboración antes del conflicto.",
+ "2": "Abstenerse de denigrar, discriminar o acosar la conducta y el habla.",
+ "3": "Tenga en cuenta su entorno y sus compañeros participantes. Alerte a los líderes de la comunidad si nota una situación peligrosa, alguien en apuros o violaciones de este Código de Conducta, incluso si parecen no tener consecuencias."
+ },
+ "title": "Comportamiento esperado"
+ },
+ "get-help": "Si usted está sujeto a un comportamiento inaceptable, lo experimenta o tiene otras preocupaciones, por favor notifique a un organizador de la comunidad tan pronto como sea posible y enlace o apunte el contenido relevante:",
+ "preamble": {
+ "description": "Human Connection es una red de conocimiento y acción social sin fines de lucro de la próxima generación. Por la gente - para la gente. Código Abierto, justo y transparente. Por un cambio positivo a nivel local y global en todas las áreas de la vida. Rediseñamos completamente el intercambio público de conocimientos, ideas y proyectos. Las funciones de Human Connection unen a las personas - fuera de línea y en línea - para que podamos hacer del mundo un lugar mejor.",
+ "title": "Preámbulo"
+ },
+ "purpose": {
+ "description": "Con este código de conducta regulamos los principios esenciales de comportamiento en nuestra red social. La Carta de Derechos Humanos de las Naciones Unidas es nuestra orientación y constituye el núcleo de nuestra comprensión de los valores. El código de conducta sirve como principios rectores para nuestra apariencia personal y la interacción entre nosotros. Cualquiera que esté activo como usuario de la Red de Human Connection, escriba artículos, comentarios o se ponga en contacto con otros usuarios, incluidos los que están fuera de la red, reconoce que estas normas de conducta son vinculantes.",
+ "title": "Propósito"
+ },
+ "subheader": "para la red social de Human Connection gGmbH",
+ "unacceptable-behaviour": {
+ "description": "Los siguientes comportamientos son inaceptables dentro de nuestra comunidad:",
+ "list": {
+ "0": "Publicaciones, comentarios, expresiones o insultos discriminatorios, particularmente aquellos relacionados con género, orientación sexual, raza, religión, orientación política o filosófica o discapacidad.",
+ "1": "Publicación o enlace de material claramente pornográfico.",
+ "2": "Glorificación o trivialización de actos de violencia crueles o inhumanos.",
+ "3": "La divulgación de información personal de otros sin su consentimiento o amenaza de (\"doxing\").",
+ "4": "Intimidación intencional, acoso o persecución.",
+ "5": "Publicidad de productos y servicios con fines comerciales.",
+ "6": "Comportamiento criminal o violación de la ley alemana.",
+ "7": "Apoyar o alentar dicha conducta."
+ },
+ "title": "Comportamiento Inaceptable"
+ }
+ },
+ "comment": {
+ "content": {
+ "unavailable-placeholder": "... este comentario ya no está disponible"
+ },
+ "delete": "Eliminar comentario",
+ "edit": "Editar comentario",
+ "edited": "editado",
+ "menu": {
+ "delete": "Borrar comentario",
+ "edit": "Editar comentario"
+ },
+ "show": {
+ "less": "mostrar menos",
+ "more": "mostrar más"
+ }
+ },
+ "common": {
+ "category": "Categoría ::: Categorías",
+ "comment": "Comentario ::: Comentarios",
+ "letsTalk": "Hablemos",
+ "loading": "cargando",
+ "loadMore": "cargar más",
+ "moreInfo": "Más información",
+ "name": "Nombre",
+ "organization": "Organización ::: Organizaciones",
+ "post": "Mensaje ::: Mensajes",
+ "project": "Proyecto ::: Proyectos",
+ "reportContent": "Informe",
+ "shout": "Grito ::: Gritos",
+ "tag": "Etiqueta ::: Etiquetas",
+ "takeAction": "Tomar acción",
+ "user": "Usuario ::: Usuarios",
+ "validations": {
+ "categories": "deben seleccionarse al menos una y como máximo tres categorías",
+ "email": "debe ser una dirección de correo electrónico válida",
+ "url": "debe ser una URL válida"
+ },
+ "versus": "Versus"
+ },
+ "components": {
+ "enter-nonce": {
+ "form": {
+ "description": "Abra su buzón de correo e introduzca el código que le enviamos.",
+ "next": "Continuar",
+ "nonce": "Introduzca el código",
+ "validations": {
+ "length": "debe tener exactamente 6 letras"
+ }
+ }
+ },
+ "password-reset": {
+ "change-password": {
+ "error": "Error al cambiar la contraseña. ¿Posiblemente un código de seguridad incorrecto?",
+ "help": "Si tiene algún problema, por favor envíenos un correo electrónico a:",
+ "success": "El cambio de contraseña ha sido un éxito!"
+ },
+ "request": {
+ "form": {
+ "description": "Se enviará un correo electrónico de restablecimiento de contraseña a la dirección de correo electrónico especificada.",
+ "submit": "Solicitar correo electrónico",
+ "submitted": "Se ha enviado un correo electrónico con más instrucciones a {email}."
+ },
+ "title": "Restablecer su contraseña"
+ }
+ },
+ "registration": {
+ "create-user-account": {
+ "error": "¡No se ha podido crear una cuenta de usuario!",
+ "help": "¿Tal vez el código de verificación era incorrecto o expiró? Si el problema persiste, por favor envíenos un correo electrónico a:",
+ "success": "¡Su cuenta de usuario ha sido creada!",
+ "title": "Crear una cuenta de usuario"
+ },
+ "signup": {
+ "form": {
+ "data-privacy": "He leido y entendido la declaración de protección de datos",
+ "description": "Para empezar, introduzca su dirección de correo electrónico:",
+ "errors": {
+ "email-exists": "¡Ya hay una cuenta de usuario con esta dirección de correo electrónico!",
+ "invalid-invitation-token": "Parece que el código de invitación ya ha sido canjeado. Cada código sólo se puede utilizar una vez."
+ },
+ "invitation-code": "Su código de invitación es: {code}",
+ "minimum-age": "Tengo 18 años o más.",
+ "no-commercial": "No tengo intensiones comerciales y no represento una empresa u organización comercial.",
+ "no-political": "No estoy en la red en nombre de un partido o una organización política.",
+ "submit": "Crear una cuenta",
+ "success": "Se ha enviado un correo electrónico con un enlace de confirmación para el registro a {email}.",
+ "terms-and-condition": "Estoy de acuerdo con los términos de uso."
+ },
+ "title": "¡Únete a Human Connection!",
+ "unavailable": "Desafortunadamente, el registro público de cuentas de usuario en este servidor actualmente no es posible."
+ }
+ }
+ },
+ "contribution": {
+ "categories": {
+ "infoSelectedNoOfMaxCategories": "{chosen} de {max} categorías seleccionadas"
+ },
+ "category": {
+ "name": {
+ "animal-protection": "Protección de animales",
+ "art-culture-sport": "Arte, Cultura y Deporte",
+ "consumption-sustainability": "Consumo y Sostenibilidad",
+ "cooperation-development": "Cooperación y Desarrollo",
+ "democracy-politics": "Democracia y Política",
+ "economy-finances": "Economía y Finanzas",
+ "education-sciences": "Educación y Ciencias",
+ "energy-technology": "Energía y Tecnología",
+ "environment-nature": "Medio ambiente y Naturaleza",
+ "freedom-of-speech": "Libertad de expresión",
+ "global-peace-nonviolence": "Paz Global y No-Violencia",
+ "happiness-values": "Felicidad y Valores",
+ "health-wellbeing": "Salud y Bienestar",
+ "human-rights-justice": "Derechos Humanos y Justicia",
+ "it-internet-data-privacy": "TI, Internet y privacidad de datos",
+ "just-for-fun": "Sólo por diversión"
+ }
+ },
+ "delete": "Eliminar contribución",
+ "edit": "Editar contribución",
+ "emotions-label": {
+ "angry": "Enfadado",
+ "cry": "Llorar",
+ "funny": "Gracioso",
+ "happy": "Feliz",
+ "surprised": "Sorprendido"
+ },
+ "filterALL": "Ver todas las contribuciones",
+ "filterFollow": "Filtrar las contribuciones de los usuarios que sigo",
+ "languageSelectLabel": "Idioma",
+ "languageSelectText": "Seleccione el idioma",
+ "newPost": "Crear una nueva contribución",
+ "success": "¡Guardado!",
+ "teaserImage": {
+ "cropperConfirm": "Confirmar"
+ },
+ "title": "Título"
+ },
+ "delete": {
+ "cancel": "Cancelar",
+ "comment": {
+ "message": "¿Realmente quieres borrar el comentario de \"{name}\" ?",
+ "success": "¡Comentario eliminado con éxito!",
+ "title": "Eliminar comentario",
+ "type": "Comentario"
+ },
+ "contribution": {
+ "message": "¿Realmente desea eliminar la Contribución \"{name}\" ?",
+ "success": "¡Publicación eliminado con éxito!",
+ "title": "Borrar contribución",
+ "type": "Contribución"
+ },
+ "submit": "Borrar"
+ },
+ "disable": {
+ "cancel": "Cancelar",
+ "comment": {
+ "message": "¿Realmente quieres deshabilitar el comentario de \"{name}\"?",
+ "title": "Desactivar comentario",
+ "type": "Comentario"
+ },
+ "contribution": {
+ "message": "¿Realmente quieres deshabilitar la contribución \"{name}\"?",
+ "title": "Deshabilitar contribución",
+ "type": "Contribución"
+ },
+ "submit": "Desactivar",
+ "success": "Discapacitado con éxito",
+ "user": {
+ "message": "¿Realmente quieres deshabilitar el usuario \"{name}\"?",
+ "title": "Desactivar usuario",
+ "type": "Usuario"
+ }
+ },
+ "donations": {
+ "amount-of-total": "{amount} de {total} € recaudados",
+ "donate-now": "Donar ahora",
+ "donations-for": "Donaciones para"
+ },
+ "editor": {
+ "embed": {
+ "always_allow": "Permitir siempre contenido incrustado por proveedores externos (esta configuración se puede cambiar en cualquier momento)",
+ "data_privacy_info": "Sus datos aún no han sido compartidos con terceros proveedores. Si usted procede a ver este video, el siguiente proveedor probablemente recolectará datos del usuario:",
+ "data_privacy_warning": "¡Advertencia de privacidad de datos!",
+ "play_now": "Ver ahora"
+ },
+ "hashtag": {
+ "addHashtag": "Nuevo hashtag",
+ "addLetter": "Escriba una letra",
+ "noHashtagsFound": "No se han encontrado hashtags"
+ },
+ "mention": {
+ "noUsersFound": "No se han encontrado usuarios"
+ },
+ "placeholder": "Deje sus pensamientos inspiradores...."
+ },
+ "filter-menu": {
+ "clearSearch": "Borrar búsqueda",
+ "hashtag-search": "Buscando a #{hashtag}",
+ "title": "Su burbuja de filtro"
+ },
+ "filter-posts": {
+ "categories": {
+ "all": "Todas",
+ "header": "Categorías de contenido"
+ },
+ "followers": {
+ "label": "Usuarios que sigo"
+ },
+ "general": {
+ "header": "Filtrar por...."
+ },
+ "language": {
+ "all": "Todos",
+ "header": "Idiomas"
+ }
+ },
+ "followButton": {
+ "follow": "Seguir",
+ "following": "Siguiendo"
+ },
+ "index": {
+ "change-filter-settings": "Cambie la configuración de sus filtros para obtener más resultados.",
+ "no-results": "No se han encontrado contribuciones."
+ },
+ "login": {
+ "copy": "Si ya tiene una cuenta de Human Connection, inicie sesión aquí.",
+ "email": "Su correo electrónico",
+ "failure": "Dirección de correo electrónico o contraseña incorrecta.",
+ "forgotPassword": "¿Olvidó su contraseña?",
+ "hello": "Hola",
+ "login": "Iniciar sesión",
+ "logout": "Cierre de sesión",
+ "moreInfo": "¿Qué es Human Connection?",
+ "moreInfoHint": "a la página de presentación",
+ "moreInfoURL": "https://human-connection.org/es/",
+ "no-account": "¿No tiene una cuenta?",
+ "password": "Su contraseña",
+ "register": "Regístrese",
+ "success": "¡Usted ha iniciado sesión!"
+ },
+ "maintenance": {
+ "explanation": "Actualmente estamos llevando a cabo algunos trabajos de mantenimiento planificados, por favor, inténtelo de nuevo más tarde.",
+ "questions": "Si tiene alguna pregunta o problema, por favor contáctenos por correo electrónico a",
+ "title": "Human Connection está en mantenimiento"
+ },
+ "moderation": {
+ "name": "Moderación",
+ "reports": {
+ "author": "Autor",
+ "content": "Contenido",
+ "decideButton": "Confirmar",
+ "decided": "Decidido",
+ "decideModal": {
+ "cancel": "Cancelar",
+ "Comment": {
+ "disable": {
+ "message": "¿Realmente quiere que el comentario \"{nombre}\" permanezca desactivado?",
+ "title": "Desactivar finalmente Comentario"
+ },
+ "enable": {
+ "message": "¿Realmente quiere que el comentario \"{nombre}\" permanezca habilitado?",
+ "title": "Finalmente Habilitar Comentario"
+ }
+ },
+ "Post": {
+ "disable": {
+ "message": "¿Realmente quiere que la entrada \"{nombre}\" permanezca desactivada?",
+ "title": "Finalmente Desactivar Contribución"
+ },
+ "enable": {
+ "message": "¿Realmente quiere que la contribución \"{nombre}\" permanezca activada?",
+ "title": "Finalmente Habilitar Contribución"
+ }
+ },
+ "submit": "Confirmar decisión",
+ "User": {
+ "disable": {
+ "message": "¿Realmente quiere que el usuario \"{nombre}\" permanezca desactivado?",
+ "title": "Finalmente Deshabilitar Usuario"
+ },
+ "enable": {
+ "message": "¿Realmente quiere que el usuario \"{nombre}\" permanezca habilitado?",
+ "title": "Finalmente Habilitar Usuario"
+ }
+ }
+ },
+ "decision": "Decisión",
+ "DecisionSuccess": "Decidido con éxito!",
+ "disabled": "Deshabilitado",
+ "disabledAt": "Deshabilitado el",
+ "disabledBy": "desactivado por",
+ "empty": "Felicitaciones, nada que moderar.",
+ "enabled": "Habilitado",
+ "enabledAt": "Habilitado el",
+ "enabledBy": "Habilitado por",
+ "filterLabel": {
+ "all": "Todos",
+ "closed": "Cerrado",
+ "reviewed": "Revisado",
+ "unreviewed": "Sin revisar"
+ },
+ "moreDetails": "Ver Detalles",
+ "name": "Informes",
+ "noDecision": "¡No hay decisión!",
+ "numberOfUsers": "{count} usuarios",
+ "previousDecision": "Decisión previa:",
+ "reasonCategory": "Categoría",
+ "reasonDescription": "Descripción",
+ "reportedOn": "Fecha",
+ "reporter": "reportado por",
+ "status": "Estado actual",
+ "submitter": "comunicado por"
+ }
+ },
+ "notifications": {
+ "comment": "Comentario",
+ "content": "Contenido",
+ "empty": "Lo sentimos, no tiene ninguna notificación en este momento.",
+ "filterLabel": {
+ "all": "Todas",
+ "read": "Leído",
+ "unread": "No leído"
+ },
+ "pageLink": "Todas las notificaciones",
+ "post": "Contribución",
+ "reason": {
+ "commented_on_post": "Comentó su contribución ...",
+ "mentioned_in_comment": "Le mencionó en un comentario …",
+ "mentioned_in_post": "Le mencionó en una contribución …"
+ },
+ "title": "Notificaciones",
+ "user": "Usuario"
+ },
+ "post": {
+ "comment": {
+ "submit": "Comentario",
+ "submitted": "Comentario enviado",
+ "updated": "Cambios guardados"
+ },
+ "edited": "editado",
+ "menu": {
+ "delete": "Borrar contribución",
+ "edit": "Editar contribución",
+ "pin": "Anclar contribución",
+ "pinnedSuccessfully": "¡Contribución anclado con éxito!",
+ "unpin": "Desanclar contribución",
+ "unpinnedSuccessfully": "¡Contribución desanclado con éxito!"
+ },
+ "moreInfo": {
+ "description": "Aquí puede encontrar más información sobre este tema.",
+ "name": "Más info",
+ "title": "Más información",
+ "titleOfCategoriesSection": "Categorías",
+ "titleOfHashtagsSection": "Hashtags",
+ "titleOfRelatedContributionsSection": "Contribuciones relacionadas"
+ },
+ "name": "Contribución",
+ "pinned": "Anuncio",
+ "takeAction": {
+ "name": "Tomar acción"
+ }
+ },
+ "profile": {
+ "commented": "Comentado",
+ "follow": "Seguir",
+ "followers": "Seguidores",
+ "following": "Siguiendo",
+ "invites": {
+ "description": "Introduzca la dirección de correo electrónico para la invitación.",
+ "emailPlaceholder": "Correo electrónico para invitar",
+ "title": "¡Invite a alguien a Human Connection!"
+ },
+ "memberSince": "Miembro desde",
+ "name": "Mi perfil",
+ "network": {
+ "andMore": "y {number} más ...",
+ "followedBy": "es seguido por:",
+ "followedByNobody": "no es seguido por nadie.",
+ "following": "está siguiendo:",
+ "followingNobody": "no sigue a nadie.",
+ "title": "Red"
+ },
+ "shouted": "Recomendado",
+ "socialMedia": "¿Dónde más puedo encontrar?",
+ "userAnonym": "Anónimo"
+ },
+ "quotes": {
+ "african": {
+ "author": "Proverbio africano",
+ "quote": "Muchas personas pequeñas en muchos lugares pequeños hacen muchas cosas pequeñas, que pueden alterar la faz del mundo."
+ }
+ },
+ "release": {
+ "cancel": "Cancelar",
+ "comment": {
+ "error": "¡Ya ha reportado el comentario!",
+ "message": "¿Realmente quieres liberar el comentario de \"{name}\"?",
+ "title": "Comentario de la versión",
+ "type": "Comentario"
+ },
+ "contribution": {
+ "error": "¡Ya ha reportado la contribución!",
+ "message": "¿Realmente quieres liberar la contribución \"{name}\"?",
+ "title": "Contribución de la versión ",
+ "type": "Contribución"
+ },
+ "submit": "Liberar",
+ "success": "¡Liberado con éxito!",
+ "user": {
+ "error": "¡Ya ha reportado el usuario!",
+ "message": "¿Realmente quieres liberar al usuario \"{name}\"?",
+ "title": "Liberar usuario",
+ "type": "Usuario"
+ }
+ },
+ "report": {
+ "cancel": "Cancelar",
+ "comment": {
+ "error": "¡Ya ha reportado al comentario!",
+ "message": "¿Realmente quieres reportar el comentario de \"{name}\"?",
+ "title": "Reportar comentario",
+ "type": "Comentario"
+ },
+ "contribution": {
+ "error": "¡Ya ha reportado la contribución!",
+ "message": "¿Realmente quieres informar al usuario de la contribución \"{name}\"?",
+ "title": "Informe Contribución",
+ "type": "Contribución"
+ },
+ "reason": {
+ "category": {
+ "invalid": "Por favor seleccione una categoría válida",
+ "label": "Seleccione una categoría:",
+ "options": {
+ "advert_products_services_commercial": "Publicidad de productos y servicios con fines comerciales.",
+ "criminal_behavior_violation_german_law": "Comportamiento criminal o violación de la ley alemana.",
+ "discrimination_etc": "Contribuciones discriminatorias, comentarios, expresiones o insultos.",
+ "doxing": "La divulgación de información personal de otros sin su consentimiento o amenaza de (\"doxing\").",
+ "glorific_trivia_of_cruel_inhuman_acts": "Glorificación o minimización de actos de violencia crueles o inhumanos.",
+ "intentional_intimidation_stalking_persecution": "Intimidación intencional, acoso o persecución.",
+ "other": "Otra ...",
+ "pornographic_content_links": "Publicación o enlace de material claramente pornográfico."
+ },
+ "placeholder": "Categoría ..."
+ },
+ "description": {
+ "label": "Por favor explique: ¿Por qué le gusta reportar esto?",
+ "placeholder": "Información adicional...."
+ }
+ },
+ "submit": "Informe",
+ "success": "¡Gracias por informar!",
+ "user": {
+ "error": "¡Ya reportó al usuario!",
+ "message": "¿Realmente quieres reportar al usuario \"{name}\"?",
+ "title": "Reportar usuario",
+ "type": "Usuario"
+ }
+ },
+ "search": {
+ "failed": "No se ha encontrado nada",
+ "hint": "¿Qué estás buscando?",
+ "placeholder": "Buscar"
+ },
+ "settings": {
+ "data": {
+ "labelBio": "Acerca de usted",
+ "labelCity": "Su ciudad o región",
+ "labelName": "Su nombre",
+ "labelSlug": "Su nombre de usuario único",
+ "name": "Sus datos",
+ "namePlaceholder": "Femanon Funny",
+ "success": "¡Sus datos han sido actualizados con éxito!"
+ },
+ "delete": {
+ "name": "Borrar cuenta"
+ },
+ "deleteUserAccount": {
+ "accountDescription": "Tenga en cuenta que su contribución y sus comentarios son importantes para nuestra comunidad. Si aún decide borrarlos, debe marcarlos a continuación.",
+ "accountWarning": "¡NO PUEDE GESTIONAR y NO PUEDE RECUPERAR su cuenta, contribuciones o comentarios después de eliminar su cuenta!",
+ "commentedCount": "Eliminar mis {count} comentarios",
+ "contributionsCount": "Eliminar mis {count} contribuciones",
+ "name": "Eliminar cuenta de usuario",
+ "pleaseConfirm": "¡Acción destructiva! Escriba “{confirm}” para confirmar.",
+ "success": "¡Cuenta eliminada con éxito!"
+ },
+ "download": {
+ "name": "Descargar datos"
+ },
+ "email": {
+ "change-successful": "Su dirección de correo electrónico ha sido cambiada con éxito.",
+ "labelEmail": "Cambiar su dirección de correo electrónico",
+ "labelNewEmail": "Nueva dirección de correo electrónico",
+ "labelNonce": "Introduzca su código",
+ "name": "Su correo electrónico",
+ "submitted": "Se ha enviado un correo electrónico a {email} para verificar su dirección.",
+ "success": "Se ha registrado una nueva dirección de correo electrónico.",
+ "validation": {
+ "same-email": "Esta es su dirección de correo electrónico actual"
+ },
+ "verification-error": {
+ "explanation": "Esto puede tener diferentes causas:",
+ "message": "Su correo electrónico no se pudo cambiar.",
+ "reason": {
+ "invalid-nonce": "¿El código de confirmación no es válido?",
+ "no-email-request": "¿Está seguro de que ha solicitado un cambio de su dirección de correo electrónico?"
+ },
+ "support": "Si el problema persiste, póngase en contacto con nosotros por correo electrónico a"
+ }
+ },
+ "embeds": {
+ "info-description": "Aquí está la lista de proveedores de terceros cuyo contenido se puede mostrar como código de terceros, por ejemplo, en forma de vídeos incrustados.",
+ "name": "Proveedores externos",
+ "status": {
+ "change": {
+ "allow": "Seguro",
+ "deny": "No, gracias",
+ "question": "¿Debería mostrarse siempre el código fuente incrustado de terceros?"
+ },
+ "description": "Por defecto, el código incrustado de proveedores externos está",
+ "disabled": {
+ "off": "inicialmente sin mostrar",
+ "on": "mostrado inmediatamente"
+ }
+ }
+ },
+ "invites": {
+ "name": "Invita"
+ },
+ "languages": {
+ "name": "Idiomas"
+ },
+ "muted-users": {
+ "columns": {
+ "name": "Nombre",
+ "slug": "Alias",
+ "unmute": "Desbloquear"
+ },
+ "empty": "Hasta ahora, no ha bloqueado a nadie.",
+ "explanation": {
+ "intro": "Si otro usuario ha sido bloqueado por usted, esto es lo que sucede:",
+ "search": "Las contribuciones de personas bloqueadas desaparecen de los resultados de búsqueda.",
+ "your-perspective": "Las contribuciones de la persona bloqueada no aparecerán más en su canal de noticias."
+ },
+ "how-to": "Puede bloquear a otros usuarios en la página de perfil de aquellos a través del menú de contenido.",
+ "mute": "Bloquear usuario",
+ "name": "Usuarios bloqueados",
+ "unmute": "Desbloquear usuario",
+ "unmuted": "{name} está desbloqueado nuevamente"
+ },
+ "name": "Configuración",
+ "organizations": {
+ "name": "Mis organizaciones"
+ },
+ "privacy": {
+ "make-shouts-public": "Compartir artículos que he recomendado en mi perfil público",
+ "name": "Privacidad",
+ "success-update": "Configuración de privacidad guardada"
+ },
+ "security": {
+ "change-password": {
+ "button": "Cambiar contraseña",
+ "label-new-password": "Su nueva contraseña",
+ "label-new-password-confirm": "Confirmar nueva contraseña",
+ "label-old-password": "Su contraseña antigua",
+ "message-new-password-confirm-required": "Confirme su nueva contraseña",
+ "message-new-password-missmatch": "Vuelva a escribir la misma contraseña",
+ "message-new-password-required": "Introduzca una nueva contraseña",
+ "message-old-password-required": "Ingrese su contraseña anterior",
+ "passwordSecurity": "Seguridad de la contraseña",
+ "passwordStrength0": "Contraseña muy insegura",
+ "passwordStrength1": "Contraseña insegura",
+ "passwordStrength2": "Contraseña mediocre",
+ "passwordStrength3": "Contraseña segura",
+ "passwordStrength4": "Contraseña muy sólida",
+ "success": "¡Contraseña cambiada con éxito!"
+ },
+ "name": "Seguridad"
+ },
+ "social-media": {
+ "name": "Medios de comunicación social",
+ "placeholder": "Agregar una URL de Social-Media",
+ "requireUnique": "Ya ha añadido esta url",
+ "submit": "Añadir enlace",
+ "successAdd": "Social-Media agregó. Perfil actualizado!",
+ "successDelete": "Social-Media borrado. Perfil actualizado!"
+ },
+ "validation": {
+ "slug": {
+ "alreadyTaken": "Este nombre de usuario ya está en uso.",
+ "regex": "Los caracteres permitidos son solo letras minúsculas, números, guiones bajos y guiones."
+ }
+ }
+ },
+ "shoutButton": {
+ "shouted": "recomendado"
+ },
+ "site": {
+ "back-to-login": "Volver a la página de inicio de sesión",
+ "bank": "cuenta bancaria",
+ "code-of-conduct": "Código de conducta",
+ "contact": "Contacto",
+ "data-privacy": "Protección de datos",
+ "director": "Director General",
+ "error-occurred": "Se ha ocurrido un error.",
+ "faq": "Preguntas más frecuentes",
+ "germany": "Alemania",
+ "imprint": "Pie de imprenta",
+ "made": "Hecho con ❤",
+ "register": "Número de registro",
+ "responsible": "Responsable según § 55 Abs. 2 RStV (Alemania)",
+ "taxident": "Número de identificación del impuesto sobre el valor añadido según el § 27 a de la Ley del Impuesto sobre el Valor Añadido (Alemania)",
+ "termsAndConditions": "Términos y condiciones",
+ "thanks": "¡Gracias!",
+ "tribunal": "Tribunal de registro"
+ },
+ "store": {
+ "posts": {
+ "orderBy": {
+ "newest": {
+ "label": "Más reciente"
+ },
+ "oldest": {
+ "label": "Más antiguo"
+ }
+ }
+ }
+ },
+ "termsAndConditions": {
+ "addition": {
+ "description": " https://human-connection.org/events/ ",
+ "title": "Además, regularmente celebramos eventos donde también puede dar impresiones y hacer preguntas. Puede encontrar un resumen actualizado aquí:"
+ },
+ "agree": "¡Estoy de acuerdo!",
+ "code-of-conduct": {
+ "description": "Nuestro código de conducta sirve como un manual para la apariencia personal y la interacción entre nosotros. Quien esté activo como usuario en la red de Human Connection, escriba artículos, haga comentarios o se ponga en contacto con otros usuarios, incluso fuera de la red, reconoce que estas normas de conducta son vinculantes. https://alpha.human-connection.org/code-of-conduct",
+ "title": "Código de conducta"
+ },
+ "errors-and-feedback": {
+ "description": "Hacemos todo lo posible para mantener nuestra red y los datos seguros y disponibles. Cada nueva versión del software pasa por pruebas automáticas y manuales. No obstante, pueden producirse errores imprevistos. Por lo tanto, estamos agradecidos por cualquier error reportado. Le invitamos a informar de cualquier error que haya descubierto enviando un correo electrónico a Soporte: support@human-connection.org",
+ "title": "Errores y comentarios"
+ },
+ "help-and-questions": {
+ "description": "Para ayuda y preguntas hemos compilado una colección completa de preguntas y respuestas frecuentes (FAQ) para usted. Puede encontrarlos aquí: https://support.human-connection.org/kb/",
+ "title": "Ayuda y preguntas"
+ },
+ "moderation": {
+ "description": "Hasta que nuestras posibilidades financieras nos permitan implementar el sistema de moderación comunitaria, moderaremos con un sistema simplificado y con personal propio o posiblemente voluntario. Formamos a estos moderadores y por eso sólo ellos toman las decisiones adecuadas. Estos moderadores realizan su trabajo de forma anónima. Usted puede reportarnos contribuciones, comentarios y usuarios (por ejemplo, si proporcionan información en su perfil o tienen imágenes que violan estos Términos de Uso). Si nos informa de algo, puede darnos una razón y una breve explicación. A continuación, examinaremos su denuncia y le sancionaremos si es necesario, por ejemplo, bloqueando las contribuciones, los comentarios o los usuarios. Desafortunadamente, usted y la persona en cuestión no recibirán ninguna respuesta de nuestra parte en este momento, pero esto se encuentra en la fase de planificación. Independientemente de esto, nos reservamos el derecho de imponer sanciones en principio por razones que pueden no estar incluidas o no estar incluidas en nuestro Código de Conducta o en estas condiciones de servicio.",
+ "title": "Moderación"
+ },
+ "newTermsAndConditions": "Nuevos términos de uso",
+ "no-commercial-use": {
+ "description": "El uso de la red Human Connection no está permitido para fines comerciales. Esto incluye, pero no se limita a, publicitar productos con intención comercial, publicar enlaces de afiliados, solicitar donaciones directamente o brindar apoyo financiero para fines que no se reconocen como caritativos para fines fiscales.",
+ "title": "Sin uso comercial"
+ },
+ "privacy-statement": {
+ "description": "Nuestra red es una red de conocimiento y acción social. Por lo tanto, es especialmente importante para nosotros que el mayor número posible de contenidos sea accesible al público. En el curso del desarrollo de nuestra red habrá cada vez más la posibilidad de decidir sobre la visibilidad de los datos personales. Le informaremos sobre estas nuevas características. De lo contrario, siempre debe pensar en los datos personales que revela sobre usted (u otros). Esto se aplica en particular al contenido de los mensajes y comentarios, ya que éstos tienen un carácter ampliamente público. Más tarde habrá posibilidades de limitar la visibilidad de su perfil. Parte de los términos del servicio es nuestra declaración de privacidad, que le informa sobre las operaciones individuales de procesamiento de datos en nuestra red: https://human-connection.org/datenschutz/#netzwerk o https://human-connection.org/datenschutz/ Nuestra declaración de privacidad está adaptada a la situación legal y a las características de nuestra red y es siempre válida en la versión más actualizada.",
+ "title": "Protección de datos"
+ },
+ "terms-of-service": {
+ "description": "Las siguientes condiciones de uso constituyen la base para el uso de nuestra red. Cuando se registre, deberá aceptarlos y le informaremos más adelante de cualquier cambio que se produzca. La Red de Human Connection es operada en Alemania y por lo tanto está sujeta a la ley alemana. El fuero competente es Kirchheim / Teck. Para más detalles, consulte nuestro pie de imprenta: https://human-connection.org/en/imprint ",
+ "title": "Términos de uso"
+ },
+ "termsAndConditionsConfirmed": "He leído y acepto los términos de uso.",
+ "termsAndConditionsNewConfirm": "He leído y acepto los nuevos términos de uso.",
+ "termsAndConditionsNewConfirmText": "¡Por favor, lea los nuevos términos de uso ahora!",
+ "use-and-license": {
+ "description": "Si cualquier contenido que nos envíe está protegido por derechos de propiedad intelectual, nos concede una licencia mundial no exclusiva, transferible, sublicenciable y no exclusiva para utilizar dicho contenido para su publicación en nuestra red. Esta licencia caduca cuando usted elimina su contenido o toda su cuenta. Recuerde que otros pueden compartir su contenido y que nosotros no podemos eliminarlo.",
+ "title": "Uso y Licencia"
+ }
+ },
+ "user": {
+ "avatar": {
+ "submitted": "Carga con éxito"
+ }
+ }
}
diff --git a/webapp/locales/fr.json b/webapp/locales/fr.json
index 73334a1a4..5d35d5ad6 100644
--- a/webapp/locales/fr.json
+++ b/webapp/locales/fr.json
@@ -1,747 +1,747 @@
{
- "login": {
- "copy": "Si vous avez déjà un compte human-connection, connectez-vous ici.",
- "login": "Connexion",
- "logout": "Déconnexion",
- "email": "Votre mail",
- "password": "Votre mot de passe",
- "moreInfo": "Qu'est-ce que Human Connection?",
- "hello": "Bonjour",
- "forgotPassword": "Mot de passe oublié?",
- "no-account": "Vous n'avez pas de compte?",
- "register": "S'inscrire",
- "moreInfoURL": "https:\/\/human-connection.org\/fr\/",
- "moreInfoHint": "à la page de présentation",
- "success": "Vous êtes connecté!",
- "failure": "Adresse mail ou mot de passe incorrect."
+ "actions": {
+ "cancel": "Annuler",
+ "create": "Créer",
+ "delete": "Supprimer",
+ "edit": "Modifier",
+ "loading": "chargement",
+ "loadMore": "charger plus",
+ "save": "Sauvegarder"
+ },
+ "admin": {
+ "categories": {
+ "categoryName": "Nom",
+ "name": "Catégories",
+ "postCount": "Postes"
},
- "profile": {
- "name": "Mon profil",
- "memberSince": "Membre depuis",
- "follow": "Suivre",
- "followers": "Suiveurs",
- "following": "Suivant",
- "shouted": "Recommandé",
- "commented": "Commentais",
- "userAnonym": "Anonyme",
- "socialMedia": "Où d'autre puis-je trouver",
- "network": {
- "title": "Réseau",
- "following": "suit:",
- "followingNobody": "ne suit personne.",
- "followedBy": "est suivi par:",
- "followedByNobody": "n'est suivi par personne.",
- "andMore": "et {number} plus…"
- },
- "invites": {
- "title": "Invitez quelqu'un à Human Connection!",
- "description": "Entrez leur adresse mail pour l'invitation.",
- "emailPlaceholder": "Mail d'invitation"
- }
- },
- "settings": {
- "name": "Paramètres",
- "data": {
- "name": "Vos données",
- "labelName": "Votre nom",
- "labelCity": "Votre ville ou région",
- "labelBio": "À propos de vous",
- "labelSlug": "Votre nom d'utilisateur unique",
- "namePlaceholder": "Fémanon Funny",
- "success": "Vos données ont été mises à jour avec succès !"
- },
- "security": {
- "name": "Sécurité",
- "change-password": {
- "button": "Modifier le mot de passe",
- "success": "Mot de passe modifié avec succès !",
- "label-old-password": "Votre ancien mot de passe",
- "label-new-password": "Votre nouveau mot de passe",
- "label-new-password-confirm": "Confirmez votre nouveau mot de passe",
- "message-old-password-required": "Entrez votre ancien mot de passe",
- "message-new-password-required": "Entrez un nouveau mot de passe",
- "message-new-password-confirm-required": "Confirmez votre nouveau mot de passe",
- "message-new-password-missmatch": "Tapez à nouveau le même mot de passe",
- "passwordSecurity": "Sécurité par mot de passe",
- "passwordStrength0": "Mot de passe très peu sûr",
- "passwordStrength1": "Mot de passe non sécurisé",
- "passwordStrength2": "Mot de passe médiocre",
- "passwordStrength3": "Mot de passe fort",
- "passwordStrength4": "Mot de passe très fort"
- }
- },
- "invites": {
- "name": "Invite"
- },
- "download": {
- "name": "Télécharger les données"
- },
- "delete": {
- "name": "Supprimer un compte"
- },
- "organizations": {
- "name": "Mes organisations"
- },
- "languages": {
- "name": "Langues"
- },
- "email": {
- "validation": {
- "same-email": "Voici votre adresse mail actuelle"
- },
- "name": "Votre mail",
- "labelEmail": "Changer votre adresse mail",
- "labelNewEmail": "Nouvelle adresse mail",
- "labelNonce": "Entrez votre code",
- "success": "Une nouvelle adresse mail a été enregistrée.",
- "submitted": "Un mail pour vérifier votre adresse a été envoyé à {email}<\/b>.",
- "change-successful": "Votre adresse mail a été modifiée avec succès.",
- "verification-error": {
- "message": "Votre mail n'a pas pu être changé.",
- "explanation": "Cela peut avoir différentes causes:",
- "reason": {
- "invalid-nonce": "Le code de confirmation est-il invalide?",
- "no-email-request": "Êtes-vous certain d'avoir demandé un changement d'adresse mail?"
- },
- "support": "Si le problème persiste, veuillez nous contacter par mail à l'adresse suivante"
- }
- },
- "validation": {
- "slug": {
- "regex": "Les caractères autorisés ne sont que les lettres minuscules, les chiffres, les traits de soulignement et les traits d'union.",
- "alreadyTaken": "Ce nom d'utilisateur est déjà pris."
- }
- },
- "deleteUserAccount": {
- "name": "Supprimer un compte utilisateur",
- "contributionsCount": "Supprimer mes {count} postes",
- "commentedCount": "Supprimer mes {count} commentaires",
- "accountDescription": "Sachez que vos postes et commentaires sont importants pour notre communauté. Si vous voulez quand même les supprimer, vous devez les marquer ci-dessous.",
- "accountWarning": "Vous NE POUVEZ PAS GÉRER et NE POUVEZ PAS RECOUVRIR votre compte, vos messages ou vos commentaires après avoir supprimé votre compte !",
- "success": "Compte supprimer avec succès!",
- "pleaseConfirm": "Action destructive! Saisissez “{confirm}” pour confirmer."
- },
- "embeds": {
- "name": "Fournisseurs tiers",
- "info-description": "Voici la liste des fournisseurs tiers dont le contenu peut être affiché sous forme de code tiers, par exemple sous la forme de vidéos intégrées.",
- "status": {
- "description": "Par défaut, le code incorporé des fournisseurs tiers est",
- "disabled": {
- "off": "initialement non affiché",
- "on": "affiché immédiatement"
- },
- "change": {
- "question": "Est-ce que vous voulez que le code source intégrer vous soit toujours affiché?",
- "allow": "Sûr",
- "deny": "Non merci"
- }
- }
- },
- "social-media": {
- "name": "Médias sociaux",
- "placeholder": "Ajouter une URL pour les médias sociaux",
- "requireUnique": "Vous avez déjà ajouté cette URL",
- "submit": "Ajouter un lien",
- "successAdd": "Les médias sociaux ont été ajoutés. Profil mis à jour !",
- "successDelete": "Médias sociaux supprimé. Profil mis à jour !"
- },
- "muted-users": {
- "name": "Utilisateurs bloqués",
- "explanation": {
- "intro": "Si vous avez bloqué un autre utilisateur, voici ce qui se passe:",
- "your-perspective": "Les postes de la personne bloquée n'apparaîtront dans votre fil d'actualités.",
- "search": "Les postes des personnes bloquées disparaissent de vos résultats de recherche."
- },
- "columns": {
- "name": "Nom",
- "slug": "Slug",
- "unmute": ""
- },
- "empty": "Jusqu'à présent, vous n'avez bloqué personne.",
- "how-to": "Vous pouvez bloquer d'autres utilisateurs sur leur page de profil via le menu de contenu.",
- "mute": "Bloquer l'utilisateur",
- "unmute": "Débloquer l'utilisateur",
- "unmuted": "{name} est à nouveau débloqué"
- },
- "privacy": {
- "name": "",
- "make-shouts-public": "",
- "success-update": ""
- }
- },
- "admin": {
- "name": "Admin",
- "dashboard": {
- "name": "Tableau de bord",
- "users": "Utilisateurs",
- "posts": "Postes",
- "comments": "Commentaires",
- "notifications": "Notifications",
- "organizations": "Organisations",
- "projects": "Projets",
- "invites": "Invitations",
- "follows": "Suit",
- "shouts": "Cris"
- },
- "organizations": {
- "name": "Organisations"
- },
- "users": {
- "name": "Utilisateurs",
- "form": {
- "placeholder": "mail, nom ou description"
- },
- "table": {
- "columns": {
- "number": "Num.",
- "name": "Nom",
- "email": "Mail",
- "slug": "Slug",
- "role": "Rôle",
- "createdAt": "Créé à"
- }
- },
- "empty": "Aucun utilisateur trouvé"
- },
- "pages": {
- "name": "Pages"
- },
- "notifications": {
- "name": "Notifications"
- },
- "categories": {
- "name": "Catégories",
- "categoryName": "Nom",
- "postCount": "Postes"
- },
- "tags": {
- "name": "Étiquettes",
- "tagCountUnique": "Utilisateurs",
- "tagCount": "Postes"
- },
- "settings": {
- "name": "Paramètres"
- },
- "hashtags": {
- "name": "Hashtags",
- "number": "Num.",
- "nameOfHashtag": "Nom",
- "tagCountUnique": "Utilisateurs",
- "tagCount": "Postes"
- },
- "invites": {
- "name": "Inviter des utilisateurs",
- "title": "Inviter des gens",
- "description": "Les invitations sont une merveilleuse façon d'avoir vos amis dans votre réseau..."
- },
- "donations": {
- "name": "Informations sur les dons",
- "goal": "Dons mensuels requis",
- "progress": "Dons recueillis jusqu'à présent",
- "successfulUpdate": "Les informations sur les dons ont été mises à jour avec succès !"
- }
- },
- "post": {
- "name": "Post",
- "moreInfo": {
- "name": "Plus d'infos",
- "title": "Plus d'information",
- "description": "Ici vous pouvez trouver plus d'informations à ce sujet.",
- "titleOfCategoriesSection": "Catégories",
- "titleOfHashtagsSection": "Hashtags",
- "titleOfRelatedContributionsSection": "Articles Similaires"
- },
- "takeAction": {
- "name": "Passez à l'action"
- },
- "pinned": "Annonce",
- "menu": {
- "edit": "Modifier le Post",
- "delete": "Supprimer le Post",
- "pin": "Épingler le Post",
- "pinnedSuccessfully": "Poste épinglé avec succès!",
- "unpin": "Retirer l'épingle du poste",
- "unpinnedSuccessfully": "Épingle retirer du Post avec succès!"
- },
- "comment": {
- "submit": "Commenté",
- "submitted": "Commentaire soumis",
- "updated": "Changements sauvegardés"
- },
- "edited": "édité"
- },
- "quotes": {
- "african": {
- "quote": "Beaucoup de petites personnes dans beaucoup de petits endroits font beaucoup de petites choses, qui peuvent changer la face du monde.",
- "author": "Proverbe africain"
- }
- },
- "common": {
- "post": "Message ::: Messages",
- "comment": "Commentaire ::: Commentaires",
- "letsTalk": "Parlons-en",
- "versus": "Versus",
- "moreInfo": "Plus d'infos",
- "takeAction": "Passer à l'action",
- "shout": "Partage ::: Partages",
- "user": "Utilisateur ::: Utilisateurs",
- "category": "Catégorie ::: Catégories",
- "organization": "Organisation ::: Organisations",
- "project": "Projet ::: Projets",
- "tag": "Tag ::: Tags",
- "name": "Nom",
- "loadMore": "charger plus",
- "loading": "chargement",
- "reportContent": "Signaler",
- "validations": {
- "email": "Doit être une adresse mail valide",
- "url": "doit être une URL valide",
- "categories": ""
- }
- },
- "actions": {
- "loading": "chargement",
- "loadMore": "charger plus",
- "create": "Créer",
- "save": "Sauvegarder",
- "edit": "Modifier",
- "delete": "Supprimer",
- "cancel": "Annuler"
- },
- "moderation": {
- "name": "Modération",
- "reports": {
- "empty": "Félicitations, rien à modérer.",
- "name": "Signalisations",
- "reporter": "signalé par",
- "submitter": "signalé par",
- "disabledBy": "désactivé par",
- "reasonCategory": "Catégorie",
- "reasonDescription": "Description",
- "createdAt": "Date"
- }
- },
- "disable": {
- "user": {
- "title": "Désactiver l'utilisateur",
- "type": "Utilisateur",
- "message": "Souhaitez-vous vraiment désactiver l'utilisateur « {name} <\/b> »?"
- },
- "contribution": {
- "title": "Désactiver l'apport",
- "type": "Contribution",
- "message": "Souhaitez-vous vraiment signaler l'entrée « {name} <\/b> »?"
- },
- "comment": {
- "title": "Désactiver le commentaire",
- "type": "Commentaire",
- "message": "Souhaitez-vous vraiment désactiver le commentaire de « {name}<\/b> » ?"
- },
- "submit": "Désactiver",
- "cancel": "Annuler",
- "success": "Désactivé avec succès"
- },
- "report": {
- "submit": "Envoyer le rapport",
- "cancel": "Annuler",
- "user": {
- "title": "Signaler l'utilisateur",
- "type": "Utilisateur",
- "message": "Souhaitez-vous vraiment signaler l'utilisateur « {name} <\/b> »?",
- "error": "Vous avez déjà signalé l'utilisateur!"
- },
- "contribution": {
- "title": "Signaler l'entrée",
- "type": "Apport",
- "message": "Souhaitez-vous vraiment signaler l'entrée « {name} <\/b> »?",
- "error": "Vous avez déjà rapporté la contribution!"
- },
- "comment": {
- "title": "Signaler un commentaire",
- "type": "Commentaire",
- "message": "Souhaitez-vous vraiment signaler l'utilisateur « {name} <\/b> »?",
- "error": "Vous avez déjà rapporté le commentaire!"
- },
- "success": "Merci de nous avoir fait part de vos commentaires!",
- "reason": {
- "category": {
- "label": "Sélectionnez une catégorie:",
- "placeholder": "Catégorie...",
- "options": {
- "discrimination_etc": "Posts, commentaires, expressions ou insultes discriminatoires.",
- "pornographic_content_links": "Publication ou partage de matériel clairement pornographique.",
- "glorific_trivia_of_cruel_inhuman_acts": "Glorification ou banalisation d'actes de violence cruels ou inhumains.",
- "doxing": "La divulgation de renseignements personnels sans le consentement ou la menace d' (\"doxing\").",
- "intentional_intimidation_stalking_persecution": "L'intimidation, le harcèlement ou la persécution intentionnelle.",
- "advert_products_services_commercial": "Publicité de produits et de services à des fins commerciaux.",
- "criminal_behavior_violation_german_law": "Comportement criminel ou violation du droit allemand.",
- "other": "Autres..."
- },
- "invalid": "Veuillez sélectionner une catégorie valide"
- },
- "description": {
- "label": "S'il vous plaît expliquer: Pourquoi voulez-vous signaler cela?",
- "placeholder": "Informations complémentaires..."
- }
- }
- },
- "contribution": {
- "edit": "Rédiger l'apport",
- "delete": "Supprimer l'entrée",
- "title": "Titre",
- "newPost": "Créer un nouveau Post",
- "filterFollow": "Filtrer les contributions des utilisateurs que je suis",
- "filterALL": "Voir toutes les contributions",
- "success": "Enregistré!",
- "languageSelectLabel": "Langue",
- "categories": {
- "infoSelectedNoOfMaxCategories": "{chosen} de {max} catégories sélectionnées"
- },
- "emotions-label": {
- "funny": "Marrant",
- "happy": "Heureux",
- "surprised": "Surpris",
- "cry": "Pleurer",
- "angry": "En colère"
- },
- "category": {
- "name": {
- "freedom-of-speech": "Liberté d'expression",
- "consumption-sustainability": "Consommation & Durabilité",
- "global-peace-nonviolence": "Paix mondiale & Non-violence",
- "just-for-fun": "Juste pour le Fun",
- "happiness-values": "Bonheur & Valeurs",
- "health-wellbeing": "Santé & Bien-être",
- "environment-nature": "Environnement & Nature",
- "animal-protection": "Protection des animaux",
- "human-rights-justice": "Droits de l'homme & Justice",
- "education-sciences": "Éducation & Sciences",
- "cooperation-development": "Coopération & Développement",
- "democracy-politics": "Démocratie & Politique",
- "economy-finances": "Économie & Finances",
- "energy-technology": "Énergie & Technologie",
- "it-internet-data-privacy": "Informatique, Internet & Confidentialité des données",
- "art-culture-sport": "Art, Culture & Sport"
- }
- },
- "teaserImage": {
- "cropperConfirm": "Confirmer"
- },
- "languageSelectText": ""
- },
- "comment": {
- "edit": "Rédiger un commentaire",
- "delete": "Supprimer le commentaire",
- "content": {
- "unavailable-placeholder": "...ce commentaire n'est plus disponible"
- },
- "menu": {
- "edit": "Modifier le commentaire",
- "delete": "Supprimer le commentaire"
- },
- "show": {
- "more": "montrer plus",
- "less": "montrer moins"
- },
- "edited": "édité"
- },
- "followButton": {
- "follow": "Suivre",
- "following": "Je suis les"
- },
- "shoutButton": {
- "shouted": "recommandé"
- },
- "search": {
- "placeholder": "Rechercher",
- "hint": "Qu'est-ce que vous cherchez ?",
- "failed": "Rien trouvé"
- },
- "components": {
- "password-reset": {
- "request": {
- "title": "Réinitialiser votre mot de passe",
- "form": {
- "description": "Un mail de réinitialisation de mot de passe sera envoyé à l'adresse mail indiquée.",
- "submit": "Demander mail",
- "submitted": "Un mail avec des instructions supplémentaires a été envoyé à {email}<\/b>."
- }
- },
- "change-password": {
- "success": "La modification de votre mot de passe a réussi !",
- "error": "La modification de votre mot de passe a échoué. Peut-être que le code de sécurité n'était pas correct ?",
- "help": "En cas de problème, n'hésitez pas à nous demander de l'aide en nous envoyant un mail à :"
- }
- },
- "enter-nonce": {
- "form": {
- "nonce": "Entrez votre code",
- "description": "Ouvrez votre boîte de réception et entrez le code que nous vous avons envoyé.",
- "next": "Continuer",
- "validations": {
- "length": "doit comporter 6 caractères"
- }
- }
- },
- "registration": {
- "signup": {
- "unavailable": "Malheureusement, l'enregistrement public des comptes utilisateurs n'est pas encore disponible sur ce serveur.",
- "title": "Rejoignez Human Connection!",
- "form": {
- "description": "Pour commencer, entrez votre adresse mail:",
- "terms-and-condition": "Je confirme les Conditions générales <\/ds-text> <\/a>.",
- "data-privacy": "J'ai lu et compris la Déclaration de confidentialité <\/ds-text> <\/a> ",
- "minimum-age": "J'ai 18 ans ou plus.",
- "invitation-code": "Votre code d'invitation est: {code} <\/b>",
- "errors": {
- "email-exists": "Il existe déjà un compte utilisateur avec cette adresse mail!",
- "invalid-invitation-token": "On dirait que l'invitation a déjà été utilisée. Les liens d'invitation ne peuvent être utilisés qu'une seule fois."
- },
- "submit": "Créer un compte",
- "success": "Un mail avec un lien pour compléter votre inscription a été envoyé à {email}<\/b>"
- }
- },
- "create-user-account": {
- "title": "Créer un compte utilisateur",
- "success": "Votre compte a été créé!",
- "error": "Compte d'utilisateur n'a pas pu être créé!",
- "help": " Peut-être que la confirmation n'était pas valide? En cas de problème, n'hésitez pas à nous demander de l'aide en nous envoyant un mail à:"
- }
- }
- },
- "store": {
- "posts": {
- "orderBy": {
- "newest": {
- "label": "Plus récent"
- },
- "oldest": {
- "label": "Le plus ancien"
- }
- }
- }
- },
- "maintenance": {
- "title": "Human Connection est en maintenance",
- "explanation": "Pour l'instant, nous faisons de la maintenance programmée, veuillez réessayer plus tard.",
- "questions": "Des questions ou des préoccupations, envoyez un mail à"
- },
- "index": {
- "no-results": "Pas de contribution trouvée.",
- "change-filter-settings": "Modifiez les paramètres de filtrage pour obtenir plus de résultats."
- },
- "filter-menu": {
- "title": "Votre bulle de filtre",
- "hashtag-search": "Recherche de #{hashtag}",
- "clearSearch": "Réinitialiser la recherche"
- },
- "filter-posts": {
- "categories": {
- "header": "Catégories de contenu",
- "all": "Toutes"
- },
- "general": {
- "header": "Filtrer par ...."
- },
- "followers": {
- "label": "Utilisateurs que je suis"
- },
- "language": {
- "header": "Langues",
- "all": "Tous"
- }
- },
- "site": {
- "thanks": "Merci!",
- "error-occurred": "Une erreur s'est produite.",
- "made": "Fabriqué avec ❤",
- "imprint": "Mentions légales",
- "termsAndConditions": "Conditions générales",
- "data-privacy": "Protection des données",
- "contact": "Contacter",
- "tribunal": "Tribunal de registre",
- "register": "Numéro de registre",
- "director": "Directeur Général",
- "taxident": "Numéro d'identification à la taxe sur la valeur ajoutée selon § 27 a de la loi sur la taxe sur la valeur ajoutée (Allemagne)",
- "responsible": "Responsable selon § 55 Abs. 2 RStV (Allemagne)",
- "bank": "compte bancaire",
- "germany": "Allemagne",
- "code-of-conduct": "Code de conduite",
- "back-to-login": "Retour à la page de connexion",
- "faq": "FAQ"
- },
- "editor": {
- "placeholder": "Écrivez quelque chose d'inspirant...",
- "mention": {
- "noUsersFound": "Aucun utilisateur trouvé"
- },
- "hashtag": {
- "noHashtagsFound": "Aucun hashtag trouvé",
- "addHashtag": "Nouveau hashtag",
- "addLetter": "Tapez une lettre"
- },
- "embed": {
- "data_privacy_warning": "Attention à la confidentialité des données!",
- "data_privacy_info": "Vos données n'ont pas encore été partagées avec des fournisseurs tiers. Si vous regardez cette vidéo, le fournisseur suivant recueillera probablement des données utilisateurs:",
- "play_now": "Regarder maintenant",
- "always_allow": "Autoriser toujours le contenu intégré par des fournisseurs tiers (ce paramètre peut être modifié à tout moment)"
- }
- },
- "notifications": {
- "reason": {
- "mentioned_in_post": "Vous a mentionné dans un post…",
- "mentioned_in_comment": "Vous a mentionné dans un commentaire…",
- "commented_on_post": "Commenté sur votre post…"
- },
- "comment": "Commentaire",
- "title": "Notifications",
- "pageLink": "Toutes les notifications",
- "post": "Post",
- "user": "Utilisateur",
- "content": "Contenu",
- "filterLabel": {
- "all": "Tous",
- "read": "Lire",
- "unread": "Non lu"
- },
- "empty": "Désolé, vous n'avez pas de notifications pour le moment."
- },
- "delete": {
- "submit": "Supprimer",
- "cancel": "Annuler",
- "contribution": {
- "title": "Supprimer la contribution",
- "type": "Contribution",
- "message": "Voulez-vous vraiment supprimer la contribution \"{name}<\/b>\"?",
- "success": "Contribution supprimée avec succès !"
- },
- "comment": {
- "title": "Supprimer un commentaire",
- "type": "Commentaire",
- "message": "Voulez-vous vraiment supprimer le commentaire de \"{name}<\/b>\"?",
- "success": "Commentaire supprimé avec succès !"
- }
- },
- "release": {
- "submit": "Relâchez",
- "cancel": "Annuler",
- "success": "Relâchez avec succès!",
- "user": {
- "title": "Validation par l'utilisateur",
- "type": "Utilisateur",
- "message": "Voulez-vous vraiment libérer l'utilisateur \"{name}<\/b>\"?",
- "error": "Vous avez déjà signalé l'utilisateur!"
- },
- "contribution": {
- "title": "Versement de la contribution",
- "type": "Contribution",
- "message": "Voulez-vous vraiment débloquer la contribution \"{name}<\/b>\"?",
- "error": "Vous avez déjà signalé la contribution !!"
- },
- "comment": {
- "title": "Publication des commentaires",
- "type": "Commentaire",
- "message": "Voulez-vous vraiment publier le commentaire de \"{name}<\/b>\"?",
- "error": "Vous avez déjà signalé le commentaire!"
- }
- },
- "user": {
- "avatar": {
- "submitted": "Téléchargement réussi"
- }
- },
- "code-of-conduct": {
- "subheader": "pour le réseau social de la Human Connection gGmbH",
- "preamble": {
- "title": "Préambule",
- "description": "Human Connection est un réseau de connaissances et d'action sociale à but non lucratif de la prochaine génération. Par les gens - pour les gens. Open Source, équitable et transparent. Pour un changement local et global positif dans tous les domaines de la vie. Nous redessinons complètement l'échange public de connaissances, d'idées et de projets. Les fonctions de Human Connection rassemblent les gens - hors ligne et en ligne - afin que nous puissions rendre le monde meilleur."
- },
- "purpose": {
- "title": "Objectif",
- "description": "Avec ce code de conduite, nous réglementons les principes essentiels de comportement dans notre réseau social. Nous nous orientons à la Charte des Droits de l'Homme, elle est le cœur de notre compréhension des valeurs. Le code de conduite sert de fil conducteur pour notre apparence personnelle et notre interaction les uns avec les autres. Toute personne active comme utilisateur sur le réseau Human Connection, écrit des articles, commente ou contacte d'autres utilisateurs, y compris ceux qui ne font pas partie du réseau, reconnaît ces règles comme contractuel."
- },
- "expected-behaviour": {
- "title": "Comportement attendu",
- "description": "Les comportements suivants sont attendus et exigés de tous les membres de la communauté :",
- "list": {
- "0": "Faites preuve de considération et de respect dans votre discours et vos actions.",
- "1": "Tenter de collaborer avant le conflit.",
- "2": "S'abstenir de tout comportement ou discours dégradant, discriminatoire ou harcelant.",
- "3": "Soyez attentif à votre environnement et aux autres participants. Alertez les leaders de la communauté si vous remarquez une situation dangereuse, une personne en détresse ou une violation du Code de Conduite, même si elle vous semble sans importance."
- }
- },
- "unacceptable-behaviour": {
- "title": "Comportement inacceptable",
- "description": "Les comportements suivants sont inacceptables dans notre communauté:",
- "list": {
- "0": "Les messages, commentaires, déclarations ou insultes discriminatoires, en particulier ceux relatifs au sexe, à l'orientation sexuelle, à la race, à la religion, à l'orientation politique ou philosophique ou au handicap.",
- "1": "Publication ou partage de matériel clairement pornographique.",
- "2": "Glorification ou banalisation d'actes de violence cruels ou inhumains.",
- "3": "La divulgation de renseignements personnels sans le consentement ou la menace d' (\"doxing\").",
- "4": "L'intimidation, le harcèlement ou la persécution intentionnelle.",
- "5": "Publicité de produits et de services à des fins commerciaux.",
- "6": "Comportement criminel ou violation du droit allemand.",
- "7": "Cautionner ou encourager de tels comportements."
- }
- },
- "consequences": {
- "title": "Conséquences d'un comportement inacceptable",
- "description": "Si un membre de la communauté présente un comportement inacceptable, les opérateurs, modérateurs et administrateurs responsables du réseau peuvent prendre les mesures appropriées, notamment:",
- "list": {
- "0": "Veuillez cesser immédiatement tout comportement inacceptable",
- "1": "Verrouillage ou suppression des commentaires",
- "2": "Exclusion temporaire du poste ou de la contribution en question",
- "3": "Blocage ou suppression de contenu",
- "4": "Retrait temporaire des droits d'écriture",
- "5": "Exclusion temporaire du réseau",
- "6": "Exclusion définitive du réseau",
- "7": "Des violations du droit allemand peuvent être signalées."
- }
- },
- "get-help": "Si vous êtes victime ou témoin d'un comportement inacceptable, ou si vous avez d'autres préoccupations, veuillez en aviser un organisateur communautaire dès que possible et établir un lien ou vous référer au contenu correspondant:"
- },
- "termsAndConditions": {
- "newTermsAndConditions": "Nouvelles conditions générales",
- "termsAndConditionsConfirmed": "J'ai lu et accepte les conditions générales<\/a>.",
- "termsAndConditionsNewConfirmText": "Veuillez lire les nouvelles conditions d'utilisation dès maintenant !",
- "termsAndConditionsNewConfirm": "J'ai lu et accepté les nouvelles conditions générales.",
- "agree": "J'accepte!",
- "terms-of-service": {
- "title": "Conditions d'utilisation",
- "description": "Les conditions d'utilisation suivantes constituent la base de l'utilisation de notre réseau. Lorsque vous vous inscrivez, vous devez les accepter et nous vous informerons ultérieurement de tout changement qui pourrait survenir. Le réseau Human Connection Network est exploité en Allemagne et est donc soumis au droit allemand. Le tribunal compétent est celui de Kirchheim \/ Teck. Pour plus de détails, consultez notre site Internet: https:\/\/human-connection.org\/en\/imprint<\/a> "
- },
- "use-and-license": {
- "title": "Utilisation et licence",
- "description": "Si un contenu que vous nous publiez est protégé par des droits de propriété intellectuelle, vous nous accordez une licence mondiale non exclusive, transférable, transférable et pouvant faire l'objet d'une sous-licence pour utiliser ce contenu à des fins de publication sur notre réseau. Cette licence expire lorsque vous supprimez votre contenu ou l'ensemble de votre compte. Rappelez-vous que d'autres personnes peuvent partager votre contenu et que nous ne pouvons pas le supprimer."
- },
- "privacy-statement": {
- "title": "Déclaration de confidentialité",
- "description": "Notre réseau est un réseau de connaissances et d'action sociale. Il est donc particulièrement important pour nous qu'autant de contenu que possible soit accessible au public. Au cours du développement de notre réseau, il y aura de plus en plus la possibilité de décider de la visibilité des données personnelles. Nous vous informerons de ces nouvelles fonctionnalités. Sinon, vous devriez toujours penser aux données personnelles que vous divulguez à votre sujet (ou à celui d'autres personnes). Cela vaut en particulier pour le contenu des messages et des commentaires, qui ont un caractère largement public. Plus tard, il y aura des possibilités de limiter la visibilité de votre profil. Une partie des conditions d'utilisation est notre déclaration de confidentialité, qui vous informe sur les différentes opérations de traitement des données dans notre réseau: https:\/\/human-connection.org\/datenschutz\/#netzwerk<\/a> ex: https:\/\/human-connection.org\/datenschutz\/<\/a> Notre déclaration de confidentialité est adaptée à la situation juridique et aux caractéristiques de notre réseau et est toujours valable dans la version la plus récente."
- },
- "code-of-conduct": {
- "title": "Code de conduite",
- "description": "Notre code de conduite sert de manuel pour l'apparence personnelle et l'interaction les uns avec les autres. Quiconque est actif en tant qu'utilisateur sur le réseau Human Connection, écrit des articles, commente ou établit des contacts avec d'autres utilisateurs, même en dehors du réseau, reconnaît que ces règles de conduite sont contractuel. https:\/\/alpha.human-connection.org\/code-of-conduct <\/a>"
- },
- "moderation": {
- "title": "Modération",
- "description": "Jusqu'à ce que nos possibilités financières nous permettent de mettre en œuvre le système de modération communautaire, nous modérons avec un système simplifié et avec notre propre personnel ou éventuellement des bénévoles. Nous formons ces modérateurs et c'est pour cette raison qu'ils sont les seuls à prendre les décisions appropriées. Ces modérateurs effectuent leur travail de manière anonyme. Vous pouvez nous signaler des postes, commentaires et utilisateurs (par exemple, s'ils fournissent des informations dans leur profil ou s'ils ont des images qui violent ces Conditions d'utilisation). Si vous nous signalez quelque chose, vous pouvez nous donner une raison et une brève explication. Nous examinerons ensuite ce que vous nous avez signalé et vous sanctionnerons si nécessaire, par exemple en bloquant des contributions, des commentaires ou des utilisateurs. Malheureusement, vous et la personne concernée ne recevrez pas de commentaires de notre part pour le moment, mais c'est à l'étape de la planification. Indépendamment de cela, nous nous réservons le droit d'imposer des sanctions de principe pour des raisons qui ne figurent pas ou pas encore dans notre Code de conduite ou dans les présentes conditions de service."
- },
- "errors-and-feedback": {
- "title": "Erreurs et Feedback",
- "description": "Nous mettons tout en œuvre pour que notre réseau et nos données soient sécurisés et disponibles. Chaque nouvelle version du logiciel passe par des tests automatisés et manuels. Cependant, des erreurs imprévues peuvent survenir. Par conséquent, nous sommes reconnaissants pour tous les bugs signalés. Nous vous invitons à signaler les bugs que vous avez découverts en envoyant un mail à support@human-connection.org."
- },
- "help-and-questions": {
- "title": "Aide et questions",
- "description": "Pour obtenir de l'aide et des questions, nous avons compilé une foire aux questions (FAQ) complète pour vous. Vous pouvez les trouver ici: https:\/\/support.human-connection.org\/kb\/ <\/a>"
- },
- "addition": {
- "title": "De plus, nous organisons régulièrement des événements où vous pouvez également partager vos impressions et poser vos questions. Ici, vous trouverez un aperçu actuel:",
- "description": " https:\/\/human-connection.org\/events\/ <\/a>"
- }
+ "dashboard": {
+ "comments": "Commentaires",
+ "follows": "Suit",
+ "invites": "Invitations",
+ "name": "Tableau de bord",
+ "notifications": "Notifications",
+ "organizations": "Organisations",
+ "posts": "Postes",
+ "projects": "Projets",
+ "shouts": "Cris",
+ "users": "Utilisateurs"
},
"donations": {
- "donations-for": "Dons pour",
- "donate-now": "Faites un don",
- "amount-of-total": "{amount} de {total} € collectés"
+ "goal": "Dons mensuels requis",
+ "name": "Informations sur les dons",
+ "progress": "Dons recueillis jusqu'à présent",
+ "successfulUpdate": "Les informations sur les dons ont été mises à jour avec succès !"
+ },
+ "hashtags": {
+ "name": "Hashtags",
+ "nameOfHashtag": "Nom",
+ "number": "Num.",
+ "tagCount": "Postes",
+ "tagCountUnique": "Utilisateurs"
+ },
+ "invites": {
+ "description": "Les invitations sont une merveilleuse façon d'avoir vos amis dans votre réseau...",
+ "name": "Inviter des utilisateurs",
+ "title": "Inviter des gens"
+ },
+ "name": "Admin",
+ "notifications": {
+ "name": "Notifications"
+ },
+ "organizations": {
+ "name": "Organisations"
+ },
+ "pages": {
+ "name": "Pages"
+ },
+ "settings": {
+ "name": "Paramètres"
+ },
+ "tags": {
+ "name": "Étiquettes",
+ "tagCount": "Postes",
+ "tagCountUnique": "Utilisateurs"
+ },
+ "users": {
+ "empty": "Aucun utilisateur trouvé",
+ "form": {
+ "placeholder": "mail, nom ou description"
+ },
+ "name": "Utilisateurs",
+ "table": {
+ "columns": {
+ "createdAt": "Créé à",
+ "email": "Mail",
+ "name": "Nom",
+ "number": "Num.",
+ "role": "Rôle",
+ "slug": "Slug"
+ }
+ }
}
+ },
+ "code-of-conduct": {
+ "consequences": {
+ "description": "Si un membre de la communauté présente un comportement inacceptable, les opérateurs, modérateurs et administrateurs responsables du réseau peuvent prendre les mesures appropriées, notamment:",
+ "list": {
+ "0": "Veuillez cesser immédiatement tout comportement inacceptable",
+ "1": "Verrouillage ou suppression des commentaires",
+ "2": "Exclusion temporaire du poste ou de la contribution en question",
+ "3": "Blocage ou suppression de contenu",
+ "4": "Retrait temporaire des droits d'écriture",
+ "5": "Exclusion temporaire du réseau",
+ "6": "Exclusion définitive du réseau",
+ "7": "Des violations du droit allemand peuvent être signalées."
+ },
+ "title": "Conséquences d'un comportement inacceptable"
+ },
+ "expected-behaviour": {
+ "description": "Les comportements suivants sont attendus et exigés de tous les membres de la communauté :",
+ "list": {
+ "0": "Faites preuve de considération et de respect dans votre discours et vos actions.",
+ "1": "Tenter de collaborer avant le conflit.",
+ "2": "S'abstenir de tout comportement ou discours dégradant, discriminatoire ou harcelant.",
+ "3": "Soyez attentif à votre environnement et aux autres participants. Alertez les leaders de la communauté si vous remarquez une situation dangereuse, une personne en détresse ou une violation du Code de Conduite, même si elle vous semble sans importance."
+ },
+ "title": "Comportement attendu"
+ },
+ "get-help": "Si vous êtes victime ou témoin d'un comportement inacceptable, ou si vous avez d'autres préoccupations, veuillez en aviser un organisateur communautaire dès que possible et établir un lien ou vous référer au contenu correspondant:",
+ "preamble": {
+ "description": "Human Connection est un réseau de connaissances et d'action sociale à but non lucratif de la prochaine génération. Par les gens - pour les gens. Open Source, équitable et transparent. Pour un changement local et global positif dans tous les domaines de la vie. Nous redessinons complètement l'échange public de connaissances, d'idées et de projets. Les fonctions de Human Connection rassemblent les gens - hors ligne et en ligne - afin que nous puissions rendre le monde meilleur.",
+ "title": "Préambule"
+ },
+ "purpose": {
+ "description": "Avec ce code de conduite, nous réglementons les principes essentiels de comportement dans notre réseau social. Nous nous orientons à la Charte des Droits de l'Homme, elle est le cœur de notre compréhension des valeurs. Le code de conduite sert de fil conducteur pour notre apparence personnelle et notre interaction les uns avec les autres. Toute personne active comme utilisateur sur le réseau Human Connection, écrit des articles, commente ou contacte d'autres utilisateurs, y compris ceux qui ne font pas partie du réseau, reconnaît ces règles comme contractuel.",
+ "title": "Objectif"
+ },
+ "subheader": "pour le réseau social de la Human Connection gGmbH",
+ "unacceptable-behaviour": {
+ "description": "Les comportements suivants sont inacceptables dans notre communauté:",
+ "list": {
+ "0": "Les messages, commentaires, déclarations ou insultes discriminatoires, en particulier ceux relatifs au sexe, à l'orientation sexuelle, à la race, à la religion, à l'orientation politique ou philosophique ou au handicap.",
+ "1": "Publication ou partage de matériel clairement pornographique.",
+ "2": "Glorification ou banalisation d'actes de violence cruels ou inhumains.",
+ "3": "La divulgation de renseignements personnels sans le consentement ou la menace d' (\"doxing\").",
+ "4": "L'intimidation, le harcèlement ou la persécution intentionnelle.",
+ "5": "Publicité de produits et de services à des fins commerciaux.",
+ "6": "Comportement criminel ou violation du droit allemand.",
+ "7": "Cautionner ou encourager de tels comportements."
+ },
+ "title": "Comportement inacceptable"
+ }
+ },
+ "comment": {
+ "content": {
+ "unavailable-placeholder": "...ce commentaire n'est plus disponible"
+ },
+ "delete": "Supprimer le commentaire",
+ "edit": "Rédiger un commentaire",
+ "edited": "édité",
+ "menu": {
+ "delete": "Supprimer le commentaire",
+ "edit": "Modifier le commentaire"
+ },
+ "show": {
+ "less": "montrer moins",
+ "more": "montrer plus"
+ }
+ },
+ "common": {
+ "category": "Catégorie ::: Catégories",
+ "comment": "Commentaire ::: Commentaires",
+ "letsTalk": "Parlons-en",
+ "loading": "chargement",
+ "loadMore": "charger plus",
+ "moreInfo": "Plus d'infos",
+ "name": "Nom",
+ "organization": "Organisation ::: Organisations",
+ "post": "Message ::: Messages",
+ "project": "Projet ::: Projets",
+ "reportContent": "Signaler",
+ "shout": "Partage ::: Partages",
+ "tag": "Tag ::: Tags",
+ "takeAction": "Passer à l'action",
+ "user": "Utilisateur ::: Utilisateurs",
+ "validations": {
+ "categories": "",
+ "email": "Doit être une adresse mail valide",
+ "url": "doit être une URL valide"
+ },
+ "versus": "Versus"
+ },
+ "components": {
+ "enter-nonce": {
+ "form": {
+ "description": "Ouvrez votre boîte de réception et entrez le code que nous vous avons envoyé.",
+ "next": "Continuer",
+ "nonce": "Entrez votre code",
+ "validations": {
+ "length": "doit comporter 6 caractères"
+ }
+ }
+ },
+ "password-reset": {
+ "change-password": {
+ "error": "La modification de votre mot de passe a échoué. Peut-être que le code de sécurité n'était pas correct ?",
+ "help": "En cas de problème, n'hésitez pas à nous demander de l'aide en nous envoyant un mail à :",
+ "success": "La modification de votre mot de passe a réussi !"
+ },
+ "request": {
+ "form": {
+ "description": "Un mail de réinitialisation de mot de passe sera envoyé à l'adresse mail indiquée.",
+ "submit": "Demander mail",
+ "submitted": "Un mail avec des instructions supplémentaires a été envoyé à {email}."
+ },
+ "title": "Réinitialiser votre mot de passe"
+ }
+ },
+ "registration": {
+ "create-user-account": {
+ "error": "Compte d'utilisateur n'a pas pu être créé!",
+ "help": " Peut-être que la confirmation n'était pas valide? En cas de problème, n'hésitez pas à nous demander de l'aide en nous envoyant un mail à:",
+ "success": "Votre compte a été créé!",
+ "title": "Créer un compte utilisateur"
+ },
+ "signup": {
+ "form": {
+ "data-privacy": "J'ai lu et compris la Déclaration de confidentialité ",
+ "description": "Pour commencer, entrez votre adresse mail:",
+ "errors": {
+ "email-exists": "Il existe déjà un compte utilisateur avec cette adresse mail!",
+ "invalid-invitation-token": "On dirait que l'invitation a déjà été utilisée. Les liens d'invitation ne peuvent être utilisés qu'une seule fois."
+ },
+ "invitation-code": "Votre code d'invitation est: {code} ",
+ "minimum-age": "J'ai 18 ans ou plus.",
+ "submit": "Créer un compte",
+ "success": "Un mail avec un lien pour compléter votre inscription a été envoyé à {email}",
+ "terms-and-condition": "Je confirme les Conditions générales ."
+ },
+ "title": "Rejoignez Human Connection!",
+ "unavailable": "Malheureusement, l'enregistrement public des comptes utilisateurs n'est pas encore disponible sur ce serveur."
+ }
+ }
+ },
+ "contribution": {
+ "categories": {
+ "infoSelectedNoOfMaxCategories": "{chosen} de {max} catégories sélectionnées"
+ },
+ "category": {
+ "name": {
+ "animal-protection": "Protection des animaux",
+ "art-culture-sport": "Art, Culture & Sport",
+ "consumption-sustainability": "Consommation & Durabilité",
+ "cooperation-development": "Coopération & Développement",
+ "democracy-politics": "Démocratie & Politique",
+ "economy-finances": "Économie & Finances",
+ "education-sciences": "Éducation & Sciences",
+ "energy-technology": "Énergie & Technologie",
+ "environment-nature": "Environnement & Nature",
+ "freedom-of-speech": "Liberté d'expression",
+ "global-peace-nonviolence": "Paix mondiale & Non-violence",
+ "happiness-values": "Bonheur & Valeurs",
+ "health-wellbeing": "Santé & Bien-être",
+ "human-rights-justice": "Droits de l'homme & Justice",
+ "it-internet-data-privacy": "Informatique, Internet & Confidentialité des données",
+ "just-for-fun": "Juste pour le Fun"
+ }
+ },
+ "delete": "Supprimer l'entrée",
+ "edit": "Rédiger l'apport",
+ "emotions-label": {
+ "angry": "En colère",
+ "cry": "Pleurer",
+ "funny": "Marrant",
+ "happy": "Heureux",
+ "surprised": "Surpris"
+ },
+ "filterALL": "Voir toutes les contributions",
+ "filterFollow": "Filtrer les contributions des utilisateurs que je suis",
+ "languageSelectLabel": "Langue",
+ "languageSelectText": "",
+ "newPost": "Créer un nouveau Post",
+ "success": "Enregistré!",
+ "teaserImage": {
+ "cropperConfirm": "Confirmer"
+ },
+ "title": "Titre"
+ },
+ "delete": {
+ "cancel": "Annuler",
+ "comment": {
+ "message": "Voulez-vous vraiment supprimer le commentaire de \"{name}\"?",
+ "success": "Commentaire supprimé avec succès !",
+ "title": "Supprimer un commentaire",
+ "type": "Commentaire"
+ },
+ "contribution": {
+ "message": "Voulez-vous vraiment supprimer la contribution \"{name}\"?",
+ "success": "Contribution supprimée avec succès !",
+ "title": "Supprimer la contribution",
+ "type": "Contribution"
+ },
+ "submit": "Supprimer"
+ },
+ "disable": {
+ "cancel": "Annuler",
+ "comment": {
+ "message": "Souhaitez-vous vraiment désactiver le commentaire de « {name} » ?",
+ "title": "Désactiver le commentaire",
+ "type": "Commentaire"
+ },
+ "contribution": {
+ "message": "Souhaitez-vous vraiment signaler l'entrée « {name} »?",
+ "title": "Désactiver l'apport",
+ "type": "Contribution"
+ },
+ "submit": "Désactiver",
+ "success": "Désactivé avec succès",
+ "user": {
+ "message": "Souhaitez-vous vraiment désactiver l'utilisateur « {name} »?",
+ "title": "Désactiver l'utilisateur",
+ "type": "Utilisateur"
+ }
+ },
+ "donations": {
+ "amount-of-total": "{amount} de {total} € collectés",
+ "donate-now": "Faites un don",
+ "donations-for": "Dons pour"
+ },
+ "editor": {
+ "embed": {
+ "always_allow": "Autoriser toujours le contenu intégré par des fournisseurs tiers (ce paramètre peut être modifié à tout moment)",
+ "data_privacy_info": "Vos données n'ont pas encore été partagées avec des fournisseurs tiers. Si vous regardez cette vidéo, le fournisseur suivant recueillera probablement des données utilisateurs:",
+ "data_privacy_warning": "Attention à la confidentialité des données!",
+ "play_now": "Regarder maintenant"
+ },
+ "hashtag": {
+ "addHashtag": "Nouveau hashtag",
+ "addLetter": "Tapez une lettre",
+ "noHashtagsFound": "Aucun hashtag trouvé"
+ },
+ "mention": {
+ "noUsersFound": "Aucun utilisateur trouvé"
+ },
+ "placeholder": "Écrivez quelque chose d'inspirant..."
+ },
+ "filter-menu": {
+ "clearSearch": "Réinitialiser la recherche",
+ "hashtag-search": "Recherche de #{hashtag}",
+ "title": "Votre bulle de filtre"
+ },
+ "filter-posts": {
+ "categories": {
+ "all": "Toutes",
+ "header": "Catégories de contenu"
+ },
+ "followers": {
+ "label": "Utilisateurs que je suis"
+ },
+ "general": {
+ "header": "Filtrer par ...."
+ },
+ "language": {
+ "all": "Tous",
+ "header": "Langues"
+ }
+ },
+ "followButton": {
+ "follow": "Suivre",
+ "following": "Je suis les"
+ },
+ "index": {
+ "change-filter-settings": "Modifiez les paramètres de filtrage pour obtenir plus de résultats.",
+ "no-results": "Pas de contribution trouvée."
+ },
+ "login": {
+ "copy": "Si vous avez déjà un compte human-connection, connectez-vous ici.",
+ "email": "Votre mail",
+ "failure": "Adresse mail ou mot de passe incorrect.",
+ "forgotPassword": "Mot de passe oublié?",
+ "hello": "Bonjour",
+ "login": "Connexion",
+ "logout": "Déconnexion",
+ "moreInfo": "Qu'est-ce que Human Connection?",
+ "moreInfoHint": "à la page de présentation",
+ "moreInfoURL": "https://human-connection.org/fr/",
+ "no-account": "Vous n'avez pas de compte?",
+ "password": "Votre mot de passe",
+ "register": "S'inscrire",
+ "success": "Vous êtes connecté!"
+ },
+ "maintenance": {
+ "explanation": "Pour l'instant, nous faisons de la maintenance programmée, veuillez réessayer plus tard.",
+ "questions": "Des questions ou des préoccupations, envoyez un mail à",
+ "title": "Human Connection est en maintenance"
+ },
+ "moderation": {
+ "name": "Modération",
+ "reports": {
+ "createdAt": "Date",
+ "disabledBy": "désactivé par",
+ "empty": "Félicitations, rien à modérer.",
+ "name": "Signalisations",
+ "reasonCategory": "Catégorie",
+ "reasonDescription": "Description",
+ "reporter": "signalé par",
+ "submitter": "signalé par"
+ }
+ },
+ "notifications": {
+ "comment": "Commentaire",
+ "content": "Contenu",
+ "empty": "Désolé, vous n'avez pas de notifications pour le moment.",
+ "filterLabel": {
+ "all": "Tous",
+ "read": "Lire",
+ "unread": "Non lu"
+ },
+ "pageLink": "Toutes les notifications",
+ "post": "Post",
+ "reason": {
+ "commented_on_post": "Commenté sur votre post…",
+ "mentioned_in_comment": "Vous a mentionné dans un commentaire…",
+ "mentioned_in_post": "Vous a mentionné dans un post…"
+ },
+ "title": "Notifications",
+ "user": "Utilisateur"
+ },
+ "post": {
+ "comment": {
+ "submit": "Commenté",
+ "submitted": "Commentaire soumis",
+ "updated": "Changements sauvegardés"
+ },
+ "edited": "édité",
+ "menu": {
+ "delete": "Supprimer le Post",
+ "edit": "Modifier le Post",
+ "pin": "Épingler le Post",
+ "pinnedSuccessfully": "Poste épinglé avec succès!",
+ "unpin": "Retirer l'épingle du poste",
+ "unpinnedSuccessfully": "Épingle retirer du Post avec succès!"
+ },
+ "moreInfo": {
+ "description": "Ici vous pouvez trouver plus d'informations à ce sujet.",
+ "name": "Plus d'infos",
+ "title": "Plus d'information",
+ "titleOfCategoriesSection": "Catégories",
+ "titleOfHashtagsSection": "Hashtags",
+ "titleOfRelatedContributionsSection": "Articles Similaires"
+ },
+ "name": "Post",
+ "pinned": "Annonce",
+ "takeAction": {
+ "name": "Passez à l'action"
+ }
+ },
+ "profile": {
+ "commented": "Commentais",
+ "follow": "Suivre",
+ "followers": "Suiveurs",
+ "following": "Suivant",
+ "invites": {
+ "description": "Entrez leur adresse mail pour l'invitation.",
+ "emailPlaceholder": "Mail d'invitation",
+ "title": "Invitez quelqu'un à Human Connection!"
+ },
+ "memberSince": "Membre depuis",
+ "name": "Mon profil",
+ "network": {
+ "andMore": "et {number} plus…",
+ "followedBy": "est suivi par:",
+ "followedByNobody": "n'est suivi par personne.",
+ "following": "suit:",
+ "followingNobody": "ne suit personne.",
+ "title": "Réseau"
+ },
+ "shouted": "Recommandé",
+ "socialMedia": "Où d'autre puis-je trouver",
+ "userAnonym": "Anonyme"
+ },
+ "quotes": {
+ "african": {
+ "author": "Proverbe africain",
+ "quote": "Beaucoup de petites personnes dans beaucoup de petits endroits font beaucoup de petites choses, qui peuvent changer la face du monde."
+ }
+ },
+ "release": {
+ "cancel": "Annuler",
+ "comment": {
+ "error": "Vous avez déjà signalé le commentaire!",
+ "message": "Voulez-vous vraiment publier le commentaire de \"{name}\"?",
+ "title": "Publication des commentaires",
+ "type": "Commentaire"
+ },
+ "contribution": {
+ "error": "Vous avez déjà signalé la contribution !!",
+ "message": "Voulez-vous vraiment débloquer la contribution \"{name}\"?",
+ "title": "Versement de la contribution",
+ "type": "Contribution"
+ },
+ "submit": "Relâchez",
+ "success": "Relâchez avec succès!",
+ "user": {
+ "error": "Vous avez déjà signalé l'utilisateur!",
+ "message": "Voulez-vous vraiment libérer l'utilisateur \"{name}\"?",
+ "title": "Validation par l'utilisateur",
+ "type": "Utilisateur"
+ }
+ },
+ "report": {
+ "cancel": "Annuler",
+ "comment": {
+ "error": "Vous avez déjà rapporté le commentaire!",
+ "message": "Souhaitez-vous vraiment signaler l'utilisateur « {name} »?",
+ "title": "Signaler un commentaire",
+ "type": "Commentaire"
+ },
+ "contribution": {
+ "error": "Vous avez déjà rapporté la contribution!",
+ "message": "Souhaitez-vous vraiment signaler l'entrée « {name} »?",
+ "title": "Signaler l'entrée",
+ "type": "Apport"
+ },
+ "reason": {
+ "category": {
+ "invalid": "Veuillez sélectionner une catégorie valide",
+ "label": "Sélectionnez une catégorie:",
+ "options": {
+ "advert_products_services_commercial": "Publicité de produits et de services à des fins commerciaux.",
+ "criminal_behavior_violation_german_law": "Comportement criminel ou violation du droit allemand.",
+ "discrimination_etc": "Posts, commentaires, expressions ou insultes discriminatoires.",
+ "doxing": "La divulgation de renseignements personnels sans le consentement ou la menace d' (\"doxing\").",
+ "glorific_trivia_of_cruel_inhuman_acts": "Glorification ou banalisation d'actes de violence cruels ou inhumains.",
+ "intentional_intimidation_stalking_persecution": "L'intimidation, le harcèlement ou la persécution intentionnelle.",
+ "other": "Autres...",
+ "pornographic_content_links": "Publication ou partage de matériel clairement pornographique."
+ },
+ "placeholder": "Catégorie..."
+ },
+ "description": {
+ "label": "S'il vous plaît expliquer: Pourquoi voulez-vous signaler cela?",
+ "placeholder": "Informations complémentaires..."
+ }
+ },
+ "submit": "Envoyer le rapport",
+ "success": "Merci de nous avoir fait part de vos commentaires!",
+ "user": {
+ "error": "Vous avez déjà signalé l'utilisateur!",
+ "message": "Souhaitez-vous vraiment signaler l'utilisateur « {name} »?",
+ "title": "Signaler l'utilisateur",
+ "type": "Utilisateur"
+ }
+ },
+ "search": {
+ "failed": "Rien trouvé",
+ "hint": "Qu'est-ce que vous cherchez ?",
+ "placeholder": "Rechercher"
+ },
+ "settings": {
+ "data": {
+ "labelBio": "À propos de vous",
+ "labelCity": "Votre ville ou région",
+ "labelName": "Votre nom",
+ "labelSlug": "Votre nom d'utilisateur unique",
+ "name": "Vos données",
+ "namePlaceholder": "Fémanon Funny",
+ "success": "Vos données ont été mises à jour avec succès !"
+ },
+ "delete": {
+ "name": "Supprimer un compte"
+ },
+ "deleteUserAccount": {
+ "accountDescription": "Sachez que vos postes et commentaires sont importants pour notre communauté. Si vous voulez quand même les supprimer, vous devez les marquer ci-dessous.",
+ "accountWarning": "Vous NE POUVEZ PAS GÉRER et NE POUVEZ PAS RECOUVRIR votre compte, vos messages ou vos commentaires après avoir supprimé votre compte!",
+ "commentedCount": "Supprimer mes {count} commentaires",
+ "contributionsCount": "Supprimer mes {count} postes",
+ "name": "Supprimer un compte utilisateur",
+ "pleaseConfirm": "Action destructive! Saisissez “{confirm}” pour confirmer.",
+ "success": "Compte supprimer avec succès!"
+ },
+ "download": {
+ "name": "Télécharger les données"
+ },
+ "email": {
+ "change-successful": "Votre adresse mail a été modifiée avec succès.",
+ "labelEmail": "Changer votre adresse mail",
+ "labelNewEmail": "Nouvelle adresse mail",
+ "labelNonce": "Entrez votre code",
+ "name": "Votre mail",
+ "submitted": "Un mail pour vérifier votre adresse a été envoyé à {email}.",
+ "success": "Une nouvelle adresse mail a été enregistrée.",
+ "validation": {
+ "same-email": "Voici votre adresse mail actuelle"
+ },
+ "verification-error": {
+ "explanation": "Cela peut avoir différentes causes:",
+ "message": "Votre mail n'a pas pu être changé.",
+ "reason": {
+ "invalid-nonce": "Le code de confirmation est-il invalide?",
+ "no-email-request": "Êtes-vous certain d'avoir demandé un changement d'adresse mail?"
+ },
+ "support": "Si le problème persiste, veuillez nous contacter par mail à l'adresse suivante"
+ }
+ },
+ "embeds": {
+ "info-description": "Voici la liste des fournisseurs tiers dont le contenu peut être affiché sous forme de code tiers, par exemple sous la forme de vidéos intégrées.",
+ "name": "Fournisseurs tiers",
+ "status": {
+ "change": {
+ "allow": "Sûr",
+ "deny": "Non merci",
+ "question": "Est-ce que vous voulez que le code source intégrer vous soit toujours affiché?"
+ },
+ "description": "Par défaut, le code incorporé des fournisseurs tiers est",
+ "disabled": {
+ "off": "initialement non affiché",
+ "on": "affiché immédiatement"
+ }
+ }
+ },
+ "invites": {
+ "name": "Invite"
+ },
+ "languages": {
+ "name": "Langues"
+ },
+ "muted-users": {
+ "columns": {
+ "name": "Nom",
+ "slug": "Slug",
+ "unmute": ""
+ },
+ "empty": "Jusqu'à présent, vous n'avez bloqué personne.",
+ "explanation": {
+ "intro": "Si vous avez bloqué un autre utilisateur, voici ce qui se passe:",
+ "search": "Les postes des personnes bloquées disparaissent de vos résultats de recherche.",
+ "your-perspective": "Les postes de la personne bloquée n'apparaîtront dans votre fil d'actualités."
+ },
+ "how-to": "Vous pouvez bloquer d'autres utilisateurs sur leur page de profil via le menu de contenu.",
+ "mute": "Bloquer l'utilisateur",
+ "name": "Utilisateurs bloqués",
+ "unmute": "Débloquer l'utilisateur",
+ "unmuted": "{name} est à nouveau débloqué"
+ },
+ "name": "Paramètres",
+ "organizations": {
+ "name": "Mes organisations"
+ },
+ "privacy": {
+ "make-shouts-public": "",
+ "name": "",
+ "success-update": ""
+ },
+ "security": {
+ "change-password": {
+ "button": "Modifier le mot de passe",
+ "label-new-password": "Votre nouveau mot de passe",
+ "label-new-password-confirm": "Confirmez votre nouveau mot de passe",
+ "label-old-password": "Votre ancien mot de passe",
+ "message-new-password-confirm-required": "Confirmez votre nouveau mot de passe",
+ "message-new-password-missmatch": "Tapez à nouveau le même mot de passe",
+ "message-new-password-required": "Entrez un nouveau mot de passe",
+ "message-old-password-required": "Entrez votre ancien mot de passe",
+ "passwordSecurity": "Sécurité par mot de passe",
+ "passwordStrength0": "Mot de passe très peu sûr",
+ "passwordStrength1": "Mot de passe non sécurisé",
+ "passwordStrength2": "Mot de passe médiocre",
+ "passwordStrength3": "Mot de passe fort",
+ "passwordStrength4": "Mot de passe très fort",
+ "success": "Mot de passe modifié avec succès !"
+ },
+ "name": "Sécurité"
+ },
+ "social-media": {
+ "name": "Médias sociaux",
+ "placeholder": "Ajouter une URL pour les médias sociaux",
+ "requireUnique": "Vous avez déjà ajouté cette URL",
+ "submit": "Ajouter un lien",
+ "successAdd": "Les médias sociaux ont été ajoutés. Profil mis à jour !",
+ "successDelete": "Médias sociaux supprimé. Profil mis à jour !"
+ },
+ "validation": {
+ "slug": {
+ "alreadyTaken": "Ce nom d'utilisateur est déjà pris.",
+ "regex": "Les caractères autorisés ne sont que les lettres minuscules, les chiffres, les traits de soulignement et les traits d'union."
+ }
+ }
+ },
+ "shoutButton": {
+ "shouted": "recommandé"
+ },
+ "site": {
+ "back-to-login": "Retour à la page de connexion",
+ "bank": "compte bancaire",
+ "code-of-conduct": "Code de conduite",
+ "contact": "Contacter",
+ "data-privacy": "Protection des données",
+ "director": "Directeur Général",
+ "error-occurred": "Une erreur s'est produite.",
+ "faq": "FAQ",
+ "germany": "Allemagne",
+ "imprint": "Mentions légales",
+ "made": "Fabriqué avec ❤",
+ "register": "Numéro de registre",
+ "responsible": "Responsable selon § 55 Abs. 2 RStV (Allemagne)",
+ "taxident": "Numéro d'identification à la taxe sur la valeur ajoutée selon § 27 a de la loi sur la taxe sur la valeur ajoutée (Allemagne)",
+ "termsAndConditions": "Conditions générales",
+ "thanks": "Merci!",
+ "tribunal": "Tribunal de registre"
+ },
+ "store": {
+ "posts": {
+ "orderBy": {
+ "newest": {
+ "label": "Plus récent"
+ },
+ "oldest": {
+ "label": "Le plus ancien"
+ }
+ }
+ }
+ },
+ "termsAndConditions": {
+ "addition": {
+ "description": " https://human-connection.org/events/ ",
+ "title": "De plus, nous organisons régulièrement des événements où vous pouvez également partager vos impressions et poser vos questions. Ici, vous trouverez un aperçu actuel:"
+ },
+ "agree": "J'accepte!",
+ "code-of-conduct": {
+ "description": "Notre code de conduite sert de manuel pour l'apparence personnelle et l'interaction les uns avec les autres. Quiconque est actif en tant qu'utilisateur sur le réseau Human Connection, écrit des articles, commente ou établit des contacts avec d'autres utilisateurs, même en dehors du réseau, reconnaît que ces règles de conduite sont contractuel. https://alpha.human-connection.org/code-of-conduct ",
+ "title": "Code de conduite"
+ },
+ "errors-and-feedback": {
+ "description": "Nous mettons tout en œuvre pour que notre réseau et nos données soient sécurisés et disponibles. Chaque nouvelle version du logiciel passe par des tests automatisés et manuels. Cependant, des erreurs imprévues peuvent survenir. Par conséquent, nous sommes reconnaissants pour tous les bugs signalés. Nous vous invitons à signaler les bugs que vous avez découverts en envoyant un mail à support@human-connection.org.",
+ "title": "Erreurs et Feedback"
+ },
+ "help-and-questions": {
+ "description": "Pour obtenir de l'aide et des questions, nous avons compilé une foire aux questions (FAQ) complète pour vous. Vous pouvez les trouver ici: https://support.human-connection.org/kb/ ",
+ "title": "Aide et questions"
+ },
+ "moderation": {
+ "description": "Jusqu'à ce que nos possibilités financières nous permettent de mettre en œuvre le système de modération communautaire, nous modérons avec un système simplifié et avec notre propre personnel ou éventuellement des bénévoles. Nous formons ces modérateurs et c'est pour cette raison qu'ils sont les seuls à prendre les décisions appropriées. Ces modérateurs effectuent leur travail de manière anonyme. Vous pouvez nous signaler des postes, commentaires et utilisateurs (par exemple, s'ils fournissent des informations dans leur profil ou s'ils ont des images qui violent ces Conditions d'utilisation). Si vous nous signalez quelque chose, vous pouvez nous donner une raison et une brève explication. Nous examinerons ensuite ce que vous nous avez signalé et vous sanctionnerons si nécessaire, par exemple en bloquant des contributions, des commentaires ou des utilisateurs. Malheureusement, vous et la personne concernée ne recevrez pas de commentaires de notre part pour le moment, mais c'est à l'étape de la planification. Indépendamment de cela, nous nous réservons le droit d'imposer des sanctions de principe pour des raisons qui ne figurent pas ou pas encore dans notre Code de conduite ou dans les présentes conditions de service.",
+ "title": "Modération"
+ },
+ "newTermsAndConditions": "Nouvelles conditions générales",
+ "privacy-statement": {
+ "description": "Notre réseau est un réseau de connaissances et d'action sociale. Il est donc particulièrement important pour nous qu'autant de contenu que possible soit accessible au public. Au cours du développement de notre réseau, il y aura de plus en plus la possibilité de décider de la visibilité des données personnelles. Nous vous informerons de ces nouvelles fonctionnalités. Sinon, vous devriez toujours penser aux données personnelles que vous divulguez à votre sujet (ou à celui d'autres personnes). Cela vaut en particulier pour le contenu des messages et des commentaires, qui ont un caractère largement public. Plus tard, il y aura des possibilités de limiter la visibilité de votre profil. Une partie des conditions d'utilisation est notre déclaration de confidentialité, qui vous informe sur les différentes opérations de traitement des données dans notre réseau: https://human-connection.org/datenschutz/#netzwerk ex: https://human-connection.org/datenschutz/ Notre déclaration de confidentialité est adaptée à la situation juridique et aux caractéristiques de notre réseau et est toujours valable dans la version la plus récente.",
+ "title": "Déclaration de confidentialité"
+ },
+ "terms-of-service": {
+ "description": "Les conditions d'utilisation suivantes constituent la base de l'utilisation de notre réseau. Lorsque vous vous inscrivez, vous devez les accepter et nous vous informerons ultérieurement de tout changement qui pourrait survenir. Le réseau Human Connection Network est exploité en Allemagne et est donc soumis au droit allemand. Le tribunal compétent est celui de Kirchheim / Teck. Pour plus de détails, consultez notre site Internet: https://human-connection.org/en/imprint ",
+ "title": "Conditions d'utilisation"
+ },
+ "termsAndConditionsConfirmed": "J'ai lu et accepte les conditions générales.",
+ "termsAndConditionsNewConfirm": "J'ai lu et accepté les nouvelles conditions générales.",
+ "termsAndConditionsNewConfirmText": "Veuillez lire les nouvelles conditions d'utilisation dès maintenant !",
+ "use-and-license": {
+ "description": "Si un contenu que vous nous publiez est protégé par des droits de propriété intellectuelle, vous nous accordez une licence mondiale non exclusive, transférable, transférable et pouvant faire l'objet d'une sous-licence pour utiliser ce contenu à des fins de publication sur notre réseau. Cette licence expire lorsque vous supprimez votre contenu ou l'ensemble de votre compte. Rappelez-vous que d'autres personnes peuvent partager votre contenu et que nous ne pouvons pas le supprimer.",
+ "title": "Utilisation et licence"
+ }
+ },
+ "user": {
+ "avatar": {
+ "submitted": "Téléchargement réussi"
+ }
+ }
}
diff --git a/webapp/locales/it.json b/webapp/locales/it.json
index 4bf95dd5e..407ca5c14 100644
--- a/webapp/locales/it.json
+++ b/webapp/locales/it.json
@@ -1,747 +1,747 @@
{
- "login": {
- "copy": "Se sei gia registrato su Human Connection, accedi qui.",
- "login": "Accesso",
- "logout": "Logout",
- "email": "La tua email",
- "password": "La tua password",
- "moreInfo": "Che cosa è Human Connection?",
- "hello": "Ciao",
- "forgotPassword": "",
- "no-account": "",
- "register": "",
- "moreInfoURL": "",
- "moreInfoHint": "",
- "success": "",
- "failure": ""
+ "actions": {
+ "cancel": "",
+ "create": "Crea",
+ "delete": "Cancella",
+ "edit": "Modifica",
+ "loading": "Caricamento in corso",
+ "loadMore": "Carica di più",
+ "save": "Salva"
+ },
+ "admin": {
+ "categories": {
+ "categoryName": "Nome",
+ "name": "Categorie",
+ "postCount": "Messaggi"
},
- "profile": {
- "name": "Il mio profilo",
- "memberSince": "Membro dal",
- "follow": "Seguire",
- "followers": "Seguenti",
- "following": "Seguendo",
- "shouted": "Gridato",
- "commented": "Commentato",
- "userAnonym": "Anonymous",
- "socialMedia": "",
- "network": {
- "title": "",
- "following": "",
- "followingNobody": "",
- "followedBy": "",
- "followedByNobody": "",
- "andMore": ""
- },
- "invites": {
- "title": "",
- "description": "",
- "emailPlaceholder": ""
- }
- },
- "settings": {
- "name": "Impostazioni",
- "data": {
- "name": "I tuoi dati",
- "labelName": "Nome",
- "labelCity": "La tua città o regione",
- "labelBio": "Su di te",
- "labelSlug": "",
- "namePlaceholder": "Anonymous",
- "success": ""
- },
- "security": {
- "name": "Sicurezza",
- "change-password": {
- "button": "",
- "success": "",
- "label-old-password": "",
- "label-new-password": "",
- "label-new-password-confirm": "",
- "message-old-password-required": "",
- "message-new-password-required": "",
- "message-new-password-confirm-required": "",
- "message-new-password-missmatch": "",
- "passwordSecurity": "",
- "passwordStrength0": "",
- "passwordStrength1": "",
- "passwordStrength2": "",
- "passwordStrength3": "",
- "passwordStrength4": ""
- }
- },
- "invites": {
- "name": "Inviti"
- },
- "download": {
- "name": "Scaricamento dati"
- },
- "delete": {
- "name": "Elimina Account"
- },
- "organizations": {
- "name": "Mie organizzazioni"
- },
- "languages": {
- "name": "Lingue"
- },
- "email": {
- "validation": {
- "same-email": ""
- },
- "name": "",
- "labelEmail": "",
- "labelNewEmail": "",
- "labelNonce": "",
- "success": "",
- "submitted": "",
- "change-successful": "",
- "verification-error": {
- "message": "",
- "explanation": "",
- "reason": {
- "invalid-nonce": "",
- "no-email-request": ""
- },
- "support": ""
- }
- },
- "validation": {
- "slug": {
- "regex": "",
- "alreadyTaken": ""
- }
- },
- "deleteUserAccount": {
- "name": "Cancellare l'account utente",
- "contributionsCount": "Cancellare i miei {count} messaggi",
- "commentedCount": "Cancella i miei {count} commenti",
- "accountDescription": "Essere consapevoli che i tuoi post e commenti sono importanti per la nostra comunità. Se cancelli il tuo account utente, tutto scomparirà per sempre - e sarebbe un vero peccato!",
- "accountWarning": "Attenzione! Tu NON PUOI GESTIRE e NON PUOI RECUPERARE il tuo account, i tuoi messaggi o commenti dopo aver cancellato il tuo account!",
- "success": "Account eliminato con successo!",
- "pleaseConfirm": "Azione distruttiva! Digita “{confirm}” per confermare."
- },
- "embeds": {
- "name": "",
- "info-description": "Ecco l'elenco dei fornitori di terze parti i cui contenuti possono essere visualizzati come codice di terze parti, ad esempio sotto forma di video incorporati.",
- "status": {
- "description": "",
- "disabled": {
- "off": "",
- "on": ""
- },
- "change": {
- "question": "",
- "allow": "",
- "deny": ""
- }
- }
- },
- "social-media": {
- "name": "",
- "placeholder": "",
- "requireUnique": "",
- "submit": "",
- "successAdd": "Social media aggiunti. \nProfilo utente aggiornato ",
- "successDelete": "Social media cancellati. Profilo utente aggiornato!"
- },
- "muted-users": {
- "name": null,
- "explanation": {
- "intro": null,
- "your-perspective": null,
- "search": null
- },
- "columns": {
- "name": null,
- "slug": null,
- "unmute": null
- },
- "empty": null,
- "how-to": null,
- "mute": null,
- "unmute": null,
- "unmuted": null
- },
- "privacy": {
- "name": "",
- "make-shouts-public": "",
- "success-update": ""
- }
- },
- "admin": {
- "name": "Admin",
- "dashboard": {
- "name": "Cruscotto",
- "users": "Utenti",
- "posts": "Messaggi",
- "comments": "Commenti",
- "notifications": "Notifiche",
- "organizations": "Organizzazioni",
- "projects": "Progetti",
- "invites": "Inviti",
- "follows": "Segue",
- "shouts": "Gridi"
- },
- "organizations": {
- "name": "Organizzazioni"
- },
- "users": {
- "name": "Utenti",
- "form": {
- "placeholder": ""
- },
- "table": {
- "columns": {
- "number": "",
- "name": "",
- "email": "",
- "slug": "",
- "role": "",
- "createdAt": ""
- }
- },
- "empty": ""
- },
- "pages": {
- "name": "Pagine"
- },
- "notifications": {
- "name": "Notifiche"
- },
- "categories": {
- "name": "Categorie",
- "categoryName": "Nome",
- "postCount": "Messaggi"
- },
- "tags": {
- "name": "Tag",
- "tagCountUnique": "Utenti",
- "tagCount": "Messaggi"
- },
- "settings": {
- "name": "Impostazioni"
- },
- "hashtags": {
- "name": "",
- "number": "",
- "nameOfHashtag": "",
- "tagCountUnique": "",
- "tagCount": ""
- },
- "invites": {
- "name": "",
- "title": "",
- "description": ""
- },
- "donations": {
- "name": "Info donazioni",
- "goal": "Donazioni mensili necessarie",
- "progress": "Donazioni raccolte finora",
- "successfulUpdate": "Informazioni sulle donazioni aggiornate con successo!"
- }
- },
- "post": {
- "name": "Messaggio",
- "moreInfo": {
- "name": "Ulteriori informazioni",
- "title": "",
- "description": "",
- "titleOfCategoriesSection": "",
- "titleOfHashtagsSection": "",
- "titleOfRelatedContributionsSection": ""
- },
- "takeAction": {
- "name": "Agire"
- },
- "pinned": "",
- "menu": {
- "edit": "",
- "delete": "",
- "pin": "",
- "pinnedSuccessfully": "",
- "unpin": "",
- "unpinnedSuccessfully": ""
- },
- "comment": {
- "submit": "",
- "submitted": "",
- "updated": ""
- },
- "edited": ""
- },
- "quotes": {
- "african": {
- "quote": "Molte piccole persone in molti piccoli luoghi fanno molte piccole cose, che possono cambiare la faccia del mondo.",
- "author": "Proverbio africano"
- }
- },
- "common": {
- "post": "Messaggio ::: Messaggi",
- "comment": "Commento ::: Commenti",
- "letsTalk": "Discutiamo",
- "versus": "Verso",
- "moreInfo": "Ulteriori informazioni",
- "takeAction": "Agire",
- "shout": "Grido ::: Gridi",
- "user": "Utente ::: Utenti",
- "category": "Categoria ::: Categorie",
- "organization": "Organizzazione ::: Organizzazioni",
- "project": "Progetto ::: Progetti",
- "tag": "Tag ::: Tag",
- "name": "Nome",
- "loadMore": "Caricare di più",
- "loading": "Caricamento in corso",
- "reportContent": "",
- "validations": {
- "email": "",
- "url": "",
- "categories": ""
- }
- },
- "actions": {
- "loading": "Caricamento in corso",
- "loadMore": "Carica di più",
- "create": "Crea",
- "save": "Salva",
- "edit": "Modifica",
- "delete": "Cancella",
- "cancel": ""
- },
- "moderation": {
- "name": "",
- "reports": {
- "empty": "",
- "name": "",
- "reporter": "",
- "submitter": "",
- "disabledBy": "",
- "reasonCategory": "",
- "reasonDescription": "",
- "createdAt": ""
- }
- },
- "disable": {
- "user": {
- "title": "",
- "type": "",
- "message": ""
- },
- "contribution": {
- "title": "",
- "type": "",
- "message": ""
- },
- "comment": {
- "title": "",
- "type": "",
- "message": ""
- },
- "submit": "",
- "cancel": "",
- "success": ""
- },
- "report": {
- "submit": "",
- "cancel": "",
- "user": {
- "title": "",
- "type": "",
- "message": "",
- "error": ""
- },
- "contribution": {
- "title": "",
- "type": "",
- "message": "",
- "error": ""
- },
- "comment": {
- "title": "",
- "type": "",
- "message": "",
- "error": ""
- },
- "success": "",
- "reason": {
- "category": {
- "label": "",
- "placeholder": "",
- "options": {
- "discrimination_etc": "",
- "pornographic_content_links": "",
- "glorific_trivia_of_cruel_inhuman_acts": "",
- "doxing": "",
- "intentional_intimidation_stalking_persecution": "",
- "advert_products_services_commercial": "",
- "criminal_behavior_violation_german_law": "",
- "other": ""
- },
- "invalid": ""
- },
- "description": {
- "label": "",
- "placeholder": ""
- }
- }
- },
- "contribution": {
- "edit": "",
- "delete": "",
- "title": "",
- "newPost": "",
- "filterFollow": "",
- "filterALL": "",
- "success": "",
- "languageSelectLabel": "",
- "categories": {
- "infoSelectedNoOfMaxCategories": ""
- },
- "emotions-label": {
- "funny": "",
- "happy": "",
- "surprised": "",
- "cry": "",
- "angry": ""
- },
- "category": {
- "name": {
- "freedom-of-speech": "",
- "consumption-sustainability": "",
- "global-peace-nonviolence": "",
- "just-for-fun": "",
- "happiness-values": "",
- "health-wellbeing": "",
- "environment-nature": "",
- "animal-protection": "",
- "human-rights-justice": "",
- "education-sciences": "",
- "cooperation-development": "",
- "democracy-politics": "",
- "economy-finances": "",
- "energy-technology": "",
- "it-internet-data-privacy": "",
- "art-culture-sport": ""
- }
- },
- "teaserImage": {
- "cropperConfirm": "Confermare"
- },
- "languageSelectText": ""
- },
- "comment": {
- "edit": "",
- "delete": "",
- "content": {
- "unavailable-placeholder": ""
- },
- "menu": {
- "edit": "",
- "delete": ""
- },
- "show": {
- "more": "",
- "less": ""
- },
- "edited": ""
- },
- "followButton": {
- "follow": "",
- "following": ""
- },
- "shoutButton": {
- "shouted": ""
- },
- "search": {
- "placeholder": "",
- "hint": "",
- "failed": ""
- },
- "components": {
- "password-reset": {
- "request": {
- "title": "",
- "form": {
- "description": "",
- "submit": "",
- "submitted": ""
- }
- },
- "change-password": {
- "success": "",
- "error": "Modifica della password non riuscita. Forse il codice di sicurezza non era corretto?",
- "help": ""
- }
- },
- "enter-nonce": {
- "form": {
- "nonce": "",
- "description": "",
- "next": "",
- "validations": {
- "length": ""
- }
- }
- },
- "registration": {
- "signup": {
- "unavailable": "",
- "title": "",
- "form": {
- "description": "",
- "terms-and-condition": "",
- "data-privacy": "",
- "minimum-age": "",
- "invitation-code": "",
- "errors": {
- "email-exists": "",
- "invalid-invitation-token": "Sembra che l'invito sia già stato utilizzato. I link di invito possono essere utilizzati una sola volta."
- },
- "submit": "",
- "success": ""
- }
- },
- "create-user-account": {
- "title": "",
- "success": "",
- "error": "",
- "help": ""
- }
- }
- },
- "store": {
- "posts": {
- "orderBy": {
- "newest": {
- "label": ""
- },
- "oldest": {
- "label": ""
- }
- }
- }
- },
- "maintenance": {
- "title": "",
- "explanation": "",
- "questions": ""
- },
- "index": {
- "no-results": "",
- "change-filter-settings": ""
- },
- "filter-menu": {
- "title": "",
- "hashtag-search": "",
- "clearSearch": ""
- },
- "filter-posts": {
- "categories": {
- "header": "",
- "all": ""
- },
- "general": {
- "header": ""
- },
- "followers": {
- "label": ""
- },
- "language": {
- "header": "",
- "all": ""
- }
- },
- "site": {
- "thanks": "",
- "error-occurred": "",
- "made": "Con ❤ fatto",
- "imprint": "Impressum",
- "termsAndConditions": "",
- "data-privacy": "protezione dei dati",
- "contact": "Contatto",
- "tribunal": "registro tribunale",
- "register": "numero di registro",
- "director": "Direttore Generale",
- "taxident": "Numero di identificazione dell'imposta sul valore aggiunto ai sensi del § 27 a Legge sull'imposta sul valore aggiunto (Germania)",
- "responsible": "Responsabile ai sensi del § 55 Abs. 2 RStV (Germania)",
- "bank": "conto bancario",
- "germany": "Germania",
- "code-of-conduct": "",
- "back-to-login": "",
- "faq": ""
- },
- "editor": {
- "placeholder": "",
- "mention": {
- "noUsersFound": ""
- },
- "hashtag": {
- "noHashtagsFound": "",
- "addHashtag": "",
- "addLetter": ""
- },
- "embed": {
- "data_privacy_warning": "",
- "data_privacy_info": "I tuoi dati non sono ancora stati condivisi con fornitori terzi. Se continui a guardare questo video, il seguente fornitore probabilmente raccoglierà i dati dell'utente:",
- "play_now": "",
- "always_allow": ""
- }
- },
- "notifications": {
- "reason": {
- "mentioned_in_post": "",
- "mentioned_in_comment": "",
- "commented_on_post": ""
- },
- "comment": "",
- "title": "",
- "pageLink": "",
- "post": "",
- "user": "",
- "content": "",
- "filterLabel": {
- "all": "",
- "read": "",
- "unread": ""
- },
- "empty": ""
- },
- "delete": {
- "submit": "",
- "cancel": "",
- "contribution": {
- "title": "",
- "type": "",
- "message": "",
- "success": ""
- },
- "comment": {
- "title": "",
- "type": "",
- "message": "",
- "success": ""
- }
- },
- "release": {
- "submit": "",
- "cancel": "",
- "success": "",
- "user": {
- "title": "",
- "type": "",
- "message": "",
- "error": ""
- },
- "contribution": {
- "title": "",
- "type": "",
- "message": "",
- "error": ""
- },
- "comment": {
- "title": "",
- "type": "",
- "message": "",
- "error": ""
- }
- },
- "user": {
- "avatar": {
- "submitted": ""
- }
- },
- "code-of-conduct": {
- "subheader": "",
- "preamble": {
- "title": "",
- "description": "Human Connection è una rete di conoscenza e azione sociale senza scopo di lucro della prossima generazione. Dalle persone - per le persone. Open Source, equo e trasparente. Per un cambiamento locale e globale positivo in tutte le aree della vita. Ridisegniamo completamente lo scambio pubblico di conoscenze, idee e progetti. Le funzioni di Human Connection riuniscono le persone - offline e online - in modo che possiamo rendere il mondo un posto migliore."
- },
- "purpose": {
- "title": "",
- "description": "Con questo codice di condotta regoliamo i principi essenziali di comportamento nel nostro social network. La Carta dei diritti umani delle Nazioni Unite è il nostro orientamento e costituisce il cuore della nostra comprensione dei valori. Il codice di condotta funge da principio guida per il nostro aspetto personale e l'interazione reciproca. Chiunque sia attivo come utente nella rete di connessione umana, scrive articoli, commenti o contatta altri utenti, compresi quelli esterni alla rete, riconosce queste regole di condotta come vincolanti."
- },
- "expected-behaviour": {
- "title": "",
- "description": "",
- "list": {
- "0": "",
- "1": "",
- "2": "",
- "3": "Fai attenzione a ciò che ti circonda e ai tuoi compagni partecipanti. Avvisare i leader della comunità se si nota una situazione pericolosa, qualcuno in difficoltà o violazioni del presente Codice di condotta, anche se sembrano insignificanti."
- }
- },
- "unacceptable-behaviour": {
- "title": "",
- "description": "",
- "list": {
- "0": "Posti discriminatori, commenti, dichiarazioni o insulti, in particolare quelli relativi a genere, orientamento sessuale, razza, religione, orientamento politico o filosofico o disabilità.",
- "1": "Pubblicazione o collegamento di materiale chiaramente pornografico.",
- "2": "Glorificazione o banalizzazione di atti di violenza crudele o disumana.",
- "3": "La divulgazione di informazioni personali altrui senza il loro consenso o minaccia di (\"doxing\").",
- "4": "Intimidazione intenzionale, stalking o persecuzione.",
- "5": "Pubblicità di prodotti e servizi a fini commerciali.",
- "6": "Comportamento criminale o violazione della legge tedesca.",
- "7": "Sostenere o incoraggiare tale condotta."
- }
- },
- "consequences": {
- "title": "Conseguenze di comportamenti inaccettabilil",
- "description": "Se un membro della comunità manifesta comportamenti inaccettabili, gli operatori, i moderatori e gli amministratori responsabili della rete possono adottare le misure appropriate, inclusi ma non limitati a:",
- "list": {
- "0": "Richiesta di cessazione immediata di comportamenti inaccettabili",
- "1": "Blocco o eliminazione di commenti",
- "2": "Esclusione temporanea dal rispettivo posto o contributo",
- "3": "Blocco o eliminazione di contenuti",
- "4": "Revoca temporanea delle autorizzazioni di scrittura",
- "5": "Esclusione temporanea dalla rete",
- "6": "Esclusione definitiva dalla rete",
- "7": "Violazioni della legge tedesca possono essere segnalate."
- }
- },
- "get-help": "Se sei soggetto o testimone di un comportamento inaccettabile, o se hai altre preoccupazioni, ti preghiamo di avvisare al più presto un organizzatore della comunità e di fare riferimento al contenuto corrispondente:"
- },
- "termsAndConditions": {
- "newTermsAndConditions": "Nuovi Termini e Condizioni",
- "termsAndConditionsConfirmed": "Ho letto e confermato i Termini e condizioni <\/a> .",
- "termsAndConditionsNewConfirmText": "Si prega di leggere le nuove condizioni d'uso ora!",
- "termsAndConditionsNewConfirm": "Ho letto e accetto le nuove condizioni generali di contratto.",
- "agree": "Sono d'accordo!",
- "terms-of-service": {
- "title": "Termini di servizio",
- "description": "Le seguenti condizioni d'uso costituiscono la base per l'utilizzo della nostra rete. Quando ti registri, devi accettarli e ti informeremo in seguito di eventuali modifiche che potrebbero aver luogo. La rete di connessione umana è gestita in Germania ed è quindi soggetta alla legge tedesca. Il foro competente è Kirchheim \/ Teck. Per i dettagli, consulta la nostra impronta: https:\/\/human-connection.org\/imprint <\/a>"
- },
- "use-and-license": {
- "title": "Uso e licenza",
- "description": "Se qualsiasi contenuto pubblicato su di noi è protetto da diritti di proprietà intellettuale, l'utente ci concede una licenza mondiale, non esclusiva, trasferibile e sub-licenziabile, per l'utilizzo di tali contenuti per la pubblicazione nella nostra rete. Questa licenza scade quando si elimina il contenuto o l'intero account. Ricorda che altri potrebbero condividere i tuoi contenuti e noi non possiamo cancellarli."
- },
- "privacy-statement": {
- "title": "Informativa sulla Privacy",
- "description": "La nostra rete è una rete di conoscenza e azione sociale. Per noi è quindi particolarmente importante che il maggior numero possibile di contenuti sia accessibile al pubblico. Nel corso dello sviluppo della nostra rete ci sarà sempre più la possibilità di decidere sulla visibilità dei dati personali. Ti informeremo su queste nuove funzionalità. Altrimenti, dovresti sempre pensare a quali dati personali divulghi su te stesso (o altri). Ciò vale in particolare per il contenuto di post e commenti, poiché questi hanno un carattere ampiamente pubblico. Successivamente ci saranno possibilità di limitare la visibilità del tuo profilo. Parte dei termini di servizio è la nostra informativa sulla privacy, che ti informa sulle singole operazioni di trattamento dei dati nella nostra rete: https:\/\/human-connection.org\/datenschutz\/#netzwerk <\/a> bzw. https:\/\/human-connection.org\/datenschutz\/ <\/a> La nostra informativa sulla privacy è adattata alla situazione legale e caratteristiche della nostra rete ed è sempre valido nella versione più recente."
- },
- "code-of-conduct": {
- "title": "Codice di condotta",
- "description": "Il nostro codice di condotta funge da manuale per l'aspetto personale e l'interazione reciproca. Chiunque sia attivo come utente nella rete di Human Connection, scrive articoli, commenti o contatta altri utenti, anche al di fuori della rete, riconosce queste regole di condotta come vincolanti. https:\/\/alpha.human-connection.org\/code-of-conduct <\/a>"
- },
- "moderation": {
- "title": "Moderazione",
- "description": "Fino a quando le nostre possibilità finanziarie ci permettono di implementare il sistema di moderazione comunitaria, abbiamo moderato con un sistema semplificato e con personale proprio o eventualmente volontario. Formiamo questi moderatori e per questo motivo solo loro prendono le decisioni appropriate. Questi moderatori svolgono il loro lavoro in forma anonima. È possibile segnalare a noi messaggi, commenti e utenti (ad esempio, se forniscono informazioni nel loro profilo o se hanno immagini che violano queste Condizioni d'uso). Se ci segnalate qualcosa, potete darci una ragione e una breve spiegazione. Dopodiché daremo un'occhiata a ciò che hai segnalato e, se necessario, ti sanzioneremo, ad esempio bloccando i contributi, i commenti o gli utenti. Purtroppo, lei e la persona interessata non riceverà alcun feedback da parte nostra in questo momento, ma questo è in fase di pianificazione. Indipendentemente da ciò, ci riserviamo il diritto di imporre sanzioni in linea di principio per motivi che non sono o non sono ancora elencati nel nostro Codice di condotta o nei presenti termini di servizio."
- },
- "errors-and-feedback": {
- "title": "Errori e feedback",
- "description": "Facciamo ogni sforzo per mantenere la nostra rete e i nostri dati al sicuro e disponibili. Ogni nuova versione del software viene sottoposta a test sia automatizzati che manuali. Tuttavia, possono verificarsi errori imprevisti. Pertanto, siamo grati per tutti i bug segnalati. Siete invitati a segnalare eventuali bug che si scopre inviando un'e-mail al supporto presso support@human-connection.org"
- },
- "help-and-questions": {
- "title": "Aiuto e domande",
- "description": "Per aiuto e domande abbiamo compilato per voi una raccolta completa di domande e risposte alle domande più frequenti (FAQ). Potete trovarli qui: https:<\/a>\/\/support.human-connection.org\/kb\/ "
- },
- "addition": {
- "title": "Inoltre, teniamo regolarmente eventi in cui puoi anche condividere le tue impressioni e porre domande. Puoi trovare una panoramica attuale qui:",
- "description": "Https:\/\/human-connection. org\/eventi\/"
- }
+ "dashboard": {
+ "comments": "Commenti",
+ "follows": "Segue",
+ "invites": "Inviti",
+ "name": "Cruscotto",
+ "notifications": "Notifiche",
+ "organizations": "Organizzazioni",
+ "posts": "Messaggi",
+ "projects": "Progetti",
+ "shouts": "Gridi",
+ "users": "Utenti"
},
"donations": {
- "donations-for": "Donazioni per",
- "donate-now": "Dona ora",
- "amount-of-total": "{amount} of {total} € collezionato"
+ "goal": "Donazioni mensili necessarie",
+ "name": "Info donazioni",
+ "progress": "Donazioni raccolte finora",
+ "successfulUpdate": "Informazioni sulle donazioni aggiornate con successo!"
+ },
+ "hashtags": {
+ "name": "",
+ "nameOfHashtag": "",
+ "number": "",
+ "tagCount": "",
+ "tagCountUnique": ""
+ },
+ "invites": {
+ "description": "",
+ "name": "",
+ "title": ""
+ },
+ "name": "Admin",
+ "notifications": {
+ "name": "Notifiche"
+ },
+ "organizations": {
+ "name": "Organizzazioni"
+ },
+ "pages": {
+ "name": "Pagine"
+ },
+ "settings": {
+ "name": "Impostazioni"
+ },
+ "tags": {
+ "name": "Tag",
+ "tagCount": "Messaggi",
+ "tagCountUnique": "Utenti"
+ },
+ "users": {
+ "empty": "",
+ "form": {
+ "placeholder": ""
+ },
+ "name": "Utenti",
+ "table": {
+ "columns": {
+ "createdAt": "",
+ "email": "",
+ "name": "",
+ "number": "",
+ "role": "",
+ "slug": ""
+ }
+ }
}
+ },
+ "code-of-conduct": {
+ "consequences": {
+ "description": "Se un membro della comunità manifesta comportamenti inaccettabili, gli operatori, i moderatori e gli amministratori responsabili della rete possono adottare le misure appropriate, inclusi ma non limitati a:",
+ "list": {
+ "0": "Richiesta di cessazione immediata di comportamenti inaccettabili",
+ "1": "Blocco o eliminazione di commenti",
+ "2": "Esclusione temporanea dal rispettivo posto o contributo",
+ "3": "Blocco o eliminazione di contenuti",
+ "4": "Revoca temporanea delle autorizzazioni di scrittura",
+ "5": "Esclusione temporanea dalla rete",
+ "6": "Esclusione definitiva dalla rete",
+ "7": "Violazioni della legge tedesca possono essere segnalate."
+ },
+ "title": "Conseguenze di comportamenti inaccettabilil"
+ },
+ "expected-behaviour": {
+ "description": "",
+ "list": {
+ "0": "",
+ "1": "",
+ "2": "",
+ "3": "Fai attenzione a ciò che ti circonda e ai tuoi compagni partecipanti. Avvisare i leader della comunità se si nota una situazione pericolosa, qualcuno in difficoltà o violazioni del presente Codice di condotta, anche se sembrano insignificanti."
+ },
+ "title": ""
+ },
+ "get-help": "Se sei soggetto o testimone di un comportamento inaccettabile, o se hai altre preoccupazioni, ti preghiamo di avvisare al più presto un organizzatore della comunità e di fare riferimento al contenuto corrispondente:",
+ "preamble": {
+ "description": "Human Connection è una rete di conoscenza e azione sociale senza scopo di lucro della prossima generazione. Dalle persone - per le persone. Open Source, equo e trasparente. Per un cambiamento locale e globale positivo in tutte le aree della vita. Ridisegniamo completamente lo scambio pubblico di conoscenze, idee e progetti. Le funzioni di Human Connection riuniscono le persone - offline e online - in modo che possiamo rendere il mondo un posto migliore.",
+ "title": ""
+ },
+ "purpose": {
+ "description": "Con questo codice di condotta regoliamo i principi essenziali di comportamento nel nostro social network. La Carta dei diritti umani delle Nazioni Unite è il nostro orientamento e costituisce il cuore della nostra comprensione dei valori. Il codice di condotta funge da principio guida per il nostro aspetto personale e l'interazione reciproca. Chiunque sia attivo come utente nella rete di connessione umana, scrive articoli, commenti o contatta altri utenti, compresi quelli esterni alla rete, riconosce queste regole di condotta come vincolanti.",
+ "title": ""
+ },
+ "subheader": "",
+ "unacceptable-behaviour": {
+ "description": "",
+ "list": {
+ "0": "Posti discriminatori, commenti, dichiarazioni o insulti, in particolare quelli relativi a genere, orientamento sessuale, razza, religione, orientamento politico o filosofico o disabilità.",
+ "1": "Pubblicazione o collegamento di materiale chiaramente pornografico.",
+ "2": "Glorificazione o banalizzazione di atti di violenza crudele o disumana.",
+ "3": "La divulgazione di informazioni personali altrui senza il loro consenso o minaccia di (\"doxing\").",
+ "4": "Intimidazione intenzionale, stalking o persecuzione.",
+ "5": "Pubblicità di prodotti e servizi a fini commerciali.",
+ "6": "Comportamento criminale o violazione della legge tedesca.",
+ "7": "Sostenere o incoraggiare tale condotta."
+ },
+ "title": ""
+ }
+ },
+ "comment": {
+ "content": {
+ "unavailable-placeholder": ""
+ },
+ "delete": "",
+ "edit": "",
+ "edited": "",
+ "menu": {
+ "delete": "",
+ "edit": ""
+ },
+ "show": {
+ "less": "",
+ "more": ""
+ }
+ },
+ "common": {
+ "category": "Categoria ::: Categorie",
+ "comment": "Commento ::: Commenti",
+ "letsTalk": "Discutiamo",
+ "loading": "Caricamento in corso",
+ "loadMore": "Caricare di più",
+ "moreInfo": "Ulteriori informazioni",
+ "name": "Nome",
+ "organization": "Organizzazione ::: Organizzazioni",
+ "post": "Messaggio ::: Messaggi",
+ "project": "Progetto ::: Progetti",
+ "reportContent": "",
+ "shout": "Grido ::: Gridi",
+ "tag": "Tag ::: Tag",
+ "takeAction": "Agire",
+ "user": "Utente ::: Utenti",
+ "validations": {
+ "categories": "",
+ "email": "",
+ "url": ""
+ },
+ "versus": "Verso"
+ },
+ "components": {
+ "enter-nonce": {
+ "form": {
+ "description": "",
+ "next": "",
+ "nonce": "",
+ "validations": {
+ "length": ""
+ }
+ }
+ },
+ "password-reset": {
+ "change-password": {
+ "error": "Modifica della password non riuscita. Forse il codice di sicurezza non era corretto?",
+ "help": "",
+ "success": ""
+ },
+ "request": {
+ "form": {
+ "description": "",
+ "submit": "",
+ "submitted": ""
+ },
+ "title": ""
+ }
+ },
+ "registration": {
+ "create-user-account": {
+ "error": "",
+ "help": "",
+ "success": "",
+ "title": ""
+ },
+ "signup": {
+ "form": {
+ "data-privacy": "",
+ "description": "",
+ "errors": {
+ "email-exists": "",
+ "invalid-invitation-token": "Sembra che l'invito sia già stato utilizzato. I link di invito possono essere utilizzati una sola volta."
+ },
+ "invitation-code": "",
+ "minimum-age": "",
+ "submit": "",
+ "success": "",
+ "terms-and-condition": ""
+ },
+ "title": "",
+ "unavailable": ""
+ }
+ }
+ },
+ "contribution": {
+ "categories": {
+ "infoSelectedNoOfMaxCategories": ""
+ },
+ "category": {
+ "name": {
+ "animal-protection": "",
+ "art-culture-sport": "",
+ "consumption-sustainability": "",
+ "cooperation-development": "",
+ "democracy-politics": "",
+ "economy-finances": "",
+ "education-sciences": "",
+ "energy-technology": "",
+ "environment-nature": "",
+ "freedom-of-speech": "",
+ "global-peace-nonviolence": "",
+ "happiness-values": "",
+ "health-wellbeing": "",
+ "human-rights-justice": "",
+ "it-internet-data-privacy": "",
+ "just-for-fun": ""
+ }
+ },
+ "delete": "",
+ "edit": "",
+ "emotions-label": {
+ "angry": "",
+ "cry": "",
+ "funny": "",
+ "happy": "",
+ "surprised": ""
+ },
+ "filterALL": "",
+ "filterFollow": "",
+ "languageSelectLabel": "",
+ "languageSelectText": "",
+ "newPost": "",
+ "success": "",
+ "teaserImage": {
+ "cropperConfirm": "Confermare"
+ },
+ "title": ""
+ },
+ "delete": {
+ "cancel": "",
+ "comment": {
+ "message": "",
+ "success": "",
+ "title": "",
+ "type": ""
+ },
+ "contribution": {
+ "message": "",
+ "success": "",
+ "title": "",
+ "type": ""
+ },
+ "submit": ""
+ },
+ "disable": {
+ "cancel": "",
+ "comment": {
+ "message": "",
+ "title": "",
+ "type": ""
+ },
+ "contribution": {
+ "message": "",
+ "title": "",
+ "type": ""
+ },
+ "submit": "",
+ "success": "",
+ "user": {
+ "message": "",
+ "title": "",
+ "type": ""
+ }
+ },
+ "donations": {
+ "amount-of-total": "{amount} of {total} € collezionato",
+ "donate-now": "Dona ora",
+ "donations-for": "Donazioni per"
+ },
+ "editor": {
+ "embed": {
+ "always_allow": "",
+ "data_privacy_info": "I tuoi dati non sono ancora stati condivisi con fornitori terzi. Se continui a guardare questo video, il seguente fornitore probabilmente raccoglierà i dati dell'utente:",
+ "data_privacy_warning": "",
+ "play_now": ""
+ },
+ "hashtag": {
+ "addHashtag": "",
+ "addLetter": "",
+ "noHashtagsFound": ""
+ },
+ "mention": {
+ "noUsersFound": ""
+ },
+ "placeholder": ""
+ },
+ "filter-menu": {
+ "clearSearch": "",
+ "hashtag-search": "",
+ "title": ""
+ },
+ "filter-posts": {
+ "categories": {
+ "all": "",
+ "header": ""
+ },
+ "followers": {
+ "label": ""
+ },
+ "general": {
+ "header": ""
+ },
+ "language": {
+ "all": "",
+ "header": ""
+ }
+ },
+ "followButton": {
+ "follow": "",
+ "following": ""
+ },
+ "index": {
+ "change-filter-settings": "",
+ "no-results": ""
+ },
+ "login": {
+ "copy": "Se sei gia registrato su Human Connection, accedi qui.",
+ "email": "La tua email",
+ "failure": "",
+ "forgotPassword": "",
+ "hello": "Ciao",
+ "login": "Accesso",
+ "logout": "Logout",
+ "moreInfo": "Che cosa è Human Connection?",
+ "moreInfoHint": "",
+ "moreInfoURL": "",
+ "no-account": "",
+ "password": "La tua password",
+ "register": "",
+ "success": ""
+ },
+ "maintenance": {
+ "explanation": "",
+ "questions": "",
+ "title": ""
+ },
+ "moderation": {
+ "name": "",
+ "reports": {
+ "createdAt": "",
+ "disabledBy": "",
+ "empty": "",
+ "name": "",
+ "reasonCategory": "",
+ "reasonDescription": "",
+ "reporter": "",
+ "submitter": ""
+ }
+ },
+ "notifications": {
+ "comment": "",
+ "content": "",
+ "empty": "",
+ "filterLabel": {
+ "all": "",
+ "read": "",
+ "unread": ""
+ },
+ "pageLink": "",
+ "post": "",
+ "reason": {
+ "commented_on_post": "",
+ "mentioned_in_comment": "",
+ "mentioned_in_post": ""
+ },
+ "title": "",
+ "user": ""
+ },
+ "post": {
+ "comment": {
+ "submit": "",
+ "submitted": "",
+ "updated": ""
+ },
+ "edited": "",
+ "menu": {
+ "delete": "",
+ "edit": "",
+ "pin": "",
+ "pinnedSuccessfully": "",
+ "unpin": "",
+ "unpinnedSuccessfully": ""
+ },
+ "moreInfo": {
+ "description": "",
+ "name": "Ulteriori informazioni",
+ "title": "",
+ "titleOfCategoriesSection": "",
+ "titleOfHashtagsSection": "",
+ "titleOfRelatedContributionsSection": ""
+ },
+ "name": "Messaggio",
+ "pinned": "",
+ "takeAction": {
+ "name": "Agire"
+ }
+ },
+ "profile": {
+ "commented": "Commentato",
+ "follow": "Seguire",
+ "followers": "Seguenti",
+ "following": "Seguendo",
+ "invites": {
+ "description": "",
+ "emailPlaceholder": "",
+ "title": ""
+ },
+ "memberSince": "Membro dal",
+ "name": "Il mio profilo",
+ "network": {
+ "andMore": "",
+ "followedBy": "",
+ "followedByNobody": "",
+ "following": "",
+ "followingNobody": "",
+ "title": ""
+ },
+ "shouted": "Gridato",
+ "socialMedia": "",
+ "userAnonym": "Anonymous"
+ },
+ "quotes": {
+ "african": {
+ "author": "Proverbio africano",
+ "quote": "Molte piccole persone in molti piccoli luoghi fanno molte piccole cose, che possono cambiare la faccia del mondo."
+ }
+ },
+ "release": {
+ "cancel": "",
+ "comment": {
+ "error": "",
+ "message": "",
+ "title": "",
+ "type": ""
+ },
+ "contribution": {
+ "error": "",
+ "message": "",
+ "title": "",
+ "type": ""
+ },
+ "submit": "",
+ "success": "",
+ "user": {
+ "error": "",
+ "message": "",
+ "title": "",
+ "type": ""
+ }
+ },
+ "report": {
+ "cancel": "",
+ "comment": {
+ "error": "",
+ "message": "",
+ "title": "",
+ "type": ""
+ },
+ "contribution": {
+ "error": "",
+ "message": "",
+ "title": "",
+ "type": ""
+ },
+ "reason": {
+ "category": {
+ "invalid": "",
+ "label": "",
+ "options": {
+ "advert_products_services_commercial": "",
+ "criminal_behavior_violation_german_law": "",
+ "discrimination_etc": "",
+ "doxing": "",
+ "glorific_trivia_of_cruel_inhuman_acts": "",
+ "intentional_intimidation_stalking_persecution": "",
+ "other": "",
+ "pornographic_content_links": ""
+ },
+ "placeholder": ""
+ },
+ "description": {
+ "label": "",
+ "placeholder": ""
+ }
+ },
+ "submit": "",
+ "success": "",
+ "user": {
+ "error": "",
+ "message": "",
+ "title": "",
+ "type": ""
+ }
+ },
+ "search": {
+ "failed": "",
+ "hint": "",
+ "placeholder": ""
+ },
+ "settings": {
+ "data": {
+ "labelBio": "Su di te",
+ "labelCity": "La tua città o regione",
+ "labelName": "Nome",
+ "labelSlug": "",
+ "name": "I tuoi dati",
+ "namePlaceholder": "Anonymous",
+ "success": ""
+ },
+ "delete": {
+ "name": "Elimina Account"
+ },
+ "deleteUserAccount": {
+ "accountDescription": "Essere consapevoli che i tuoi post e commenti sono importanti per la nostra comunità. Se cancelli il tuo account utente, tutto scomparirà per sempre - e sarebbe un vero peccato!",
+ "accountWarning": "Attenzione! Tu NON PUOI GESTIRE e NON PUOI RECUPERARE il tuo account, i tuoi messaggi o commenti dopo aver cancellato il tuo account!",
+ "commentedCount": "Cancella i miei {count} commenti",
+ "contributionsCount": "Cancellare i miei {count} messaggi",
+ "name": "Cancellare l'account utente",
+ "pleaseConfirm": "Azione distruttiva! Digita “{confirm}” per confermare.",
+ "success": "Account eliminato con successo!"
+ },
+ "download": {
+ "name": "Scaricamento dati"
+ },
+ "email": {
+ "change-successful": "",
+ "labelEmail": "",
+ "labelNewEmail": "",
+ "labelNonce": "",
+ "name": "",
+ "submitted": "",
+ "success": "",
+ "validation": {
+ "same-email": ""
+ },
+ "verification-error": {
+ "explanation": "",
+ "message": "",
+ "reason": {
+ "invalid-nonce": "",
+ "no-email-request": ""
+ },
+ "support": ""
+ }
+ },
+ "embeds": {
+ "info-description": "Ecco l'elenco dei fornitori di terze parti i cui contenuti possono essere visualizzati come codice di terze parti, ad esempio sotto forma di video incorporati.",
+ "name": "",
+ "status": {
+ "change": {
+ "allow": "",
+ "deny": "",
+ "question": ""
+ },
+ "description": "",
+ "disabled": {
+ "off": "",
+ "on": ""
+ }
+ }
+ },
+ "invites": {
+ "name": "Inviti"
+ },
+ "languages": {
+ "name": "Lingue"
+ },
+ "muted-users": {
+ "columns": {
+ "name": null,
+ "slug": null,
+ "unmute": null
+ },
+ "empty": null,
+ "explanation": {
+ "intro": null,
+ "search": null,
+ "your-perspective": null
+ },
+ "how-to": null,
+ "mute": null,
+ "name": null,
+ "unmute": null,
+ "unmuted": null
+ },
+ "name": "Impostazioni",
+ "organizations": {
+ "name": "Mie organizzazioni"
+ },
+ "privacy": {
+ "make-shouts-public": "",
+ "name": "",
+ "success-update": ""
+ },
+ "security": {
+ "change-password": {
+ "button": "",
+ "label-new-password": "",
+ "label-new-password-confirm": "",
+ "label-old-password": "",
+ "message-new-password-confirm-required": "",
+ "message-new-password-missmatch": "",
+ "message-new-password-required": "",
+ "message-old-password-required": "",
+ "passwordSecurity": "",
+ "passwordStrength0": "",
+ "passwordStrength1": "",
+ "passwordStrength2": "",
+ "passwordStrength3": "",
+ "passwordStrength4": "",
+ "success": ""
+ },
+ "name": "Sicurezza"
+ },
+ "social-media": {
+ "name": "",
+ "placeholder": "",
+ "requireUnique": "",
+ "submit": "",
+ "successAdd": "Social media aggiunti. \nProfilo utente aggiornato ",
+ "successDelete": "Social media cancellati. Profilo utente aggiornato!"
+ },
+ "validation": {
+ "slug": {
+ "alreadyTaken": "",
+ "regex": ""
+ }
+ }
+ },
+ "shoutButton": {
+ "shouted": ""
+ },
+ "site": {
+ "back-to-login": "",
+ "bank": "conto bancario",
+ "code-of-conduct": "",
+ "contact": "Contatto",
+ "data-privacy": "protezione dei dati",
+ "director": "Direttore Generale",
+ "error-occurred": "",
+ "faq": "",
+ "germany": "Germania",
+ "imprint": "Impressum",
+ "made": "Con ❤ fatto",
+ "register": "numero di registro",
+ "responsible": "Responsabile ai sensi del § 55 Abs. 2 RStV (Germania)",
+ "taxident": "Numero di identificazione dell'imposta sul valore aggiunto ai sensi del § 27 a Legge sull'imposta sul valore aggiunto (Germania)",
+ "termsAndConditions": "",
+ "thanks": "",
+ "tribunal": "registro tribunale"
+ },
+ "store": {
+ "posts": {
+ "orderBy": {
+ "newest": {
+ "label": ""
+ },
+ "oldest": {
+ "label": ""
+ }
+ }
+ }
+ },
+ "termsAndConditions": {
+ "addition": {
+ "description": "Https://human-connection. org/eventi/",
+ "title": "Inoltre, teniamo regolarmente eventi in cui puoi anche condividere le tue impressioni e porre domande. Puoi trovare una panoramica attuale qui:"
+ },
+ "agree": "Sono d'accordo!",
+ "code-of-conduct": {
+ "description": "Il nostro codice di condotta funge da manuale per l'aspetto personale e l'interazione reciproca. Chiunque sia attivo come utente nella rete di Human Connection, scrive articoli, commenti o contatta altri utenti, anche al di fuori della rete, riconosce queste regole di condotta come vincolanti. https://alpha.human-connection.org/code-of-conduct ",
+ "title": "Codice di condotta"
+ },
+ "errors-and-feedback": {
+ "description": "Facciamo ogni sforzo per mantenere la nostra rete e i nostri dati al sicuro e disponibili. Ogni nuova versione del software viene sottoposta a test sia automatizzati che manuali. Tuttavia, possono verificarsi errori imprevisti. Pertanto, siamo grati per tutti i bug segnalati. Siete invitati a segnalare eventuali bug che si scopre inviando un'e-mail al supporto presso support@human-connection.org",
+ "title": "Errori e feedback"
+ },
+ "help-and-questions": {
+ "description": "Per aiuto e domande abbiamo compilato per voi una raccolta completa di domande e risposte alle domande più frequenti (FAQ). Potete trovarli qui: https://support.human-connection.org/kb/ ",
+ "title": "Aiuto e domande"
+ },
+ "moderation": {
+ "description": "Fino a quando le nostre possibilità finanziarie ci permettono di implementare il sistema di moderazione comunitaria, abbiamo moderato con un sistema semplificato e con personale proprio o eventualmente volontario. Formiamo questi moderatori e per questo motivo solo loro prendono le decisioni appropriate. Questi moderatori svolgono il loro lavoro in forma anonima. È possibile segnalare a noi messaggi, commenti e utenti (ad esempio, se forniscono informazioni nel loro profilo o se hanno immagini che violano queste Condizioni d'uso). Se ci segnalate qualcosa, potete darci una ragione e una breve spiegazione. Dopodiché daremo un'occhiata a ciò che hai segnalato e, se necessario, ti sanzioneremo, ad esempio bloccando i contributi, i commenti o gli utenti. Purtroppo, lei e la persona interessata non riceverà alcun feedback da parte nostra in questo momento, ma questo è in fase di pianificazione. Indipendentemente da ciò, ci riserviamo il diritto di imporre sanzioni in linea di principio per motivi che non sono o non sono ancora elencati nel nostro Codice di condotta o nei presenti termini di servizio.",
+ "title": "Moderazione"
+ },
+ "newTermsAndConditions": "Nuovi Termini e Condizioni",
+ "privacy-statement": {
+ "description": "La nostra rete è una rete di conoscenza e azione sociale. Per noi è quindi particolarmente importante che il maggior numero possibile di contenuti sia accessibile al pubblico. Nel corso dello sviluppo della nostra rete ci sarà sempre più la possibilità di decidere sulla visibilità dei dati personali. Ti informeremo su queste nuove funzionalità. Altrimenti, dovresti sempre pensare a quali dati personali divulghi su te stesso (o altri). Ciò vale in particolare per il contenuto di post e commenti, poiché questi hanno un carattere ampiamente pubblico. Successivamente ci saranno possibilità di limitare la visibilità del tuo profilo. Parte dei termini di servizio è la nostra informativa sulla privacy, che ti informa sulle singole operazioni di trattamento dei dati nella nostra rete: https://human-connection.org/datenschutz/#netzwerk bzw. https://human-connection.org/datenschutz/ La nostra informativa sulla privacy è adattata alla situazione legale e caratteristiche della nostra rete ed è sempre valido nella versione più recente.",
+ "title": "Informativa sulla Privacy"
+ },
+ "terms-of-service": {
+ "description": "Le seguenti condizioni d'uso costituiscono la base per l'utilizzo della nostra rete. Quando ti registri, devi accettarli e ti informeremo in seguito di eventuali modifiche che potrebbero aver luogo. La rete di connessione umana è gestita in Germania ed è quindi soggetta alla legge tedesca. Il foro competente è Kirchheim / Teck. Per i dettagli, consulta la nostra impronta: https://human-connection.org/imprint ",
+ "title": "Termini di servizio"
+ },
+ "termsAndConditionsConfirmed": "Ho letto e confermato i Termini e condizioni .",
+ "termsAndConditionsNewConfirm": "Ho letto e accetto le nuove condizioni generali di contratto.",
+ "termsAndConditionsNewConfirmText": "Si prega di leggere le nuove condizioni d'uso ora!",
+ "use-and-license": {
+ "description": "Se qualsiasi contenuto pubblicato su di noi è protetto da diritti di proprietà intellettuale, l'utente ci concede una licenza mondiale, non esclusiva, trasferibile e sub-licenziabile, per l'utilizzo di tali contenuti per la pubblicazione nella nostra rete. Questa licenza scade quando si elimina il contenuto o l'intero account. Ricorda che altri potrebbero condividere i tuoi contenuti e noi non possiamo cancellarli.",
+ "title": "Uso e licenza"
+ }
+ },
+ "user": {
+ "avatar": {
+ "submitted": ""
+ }
+ }
}
diff --git a/webapp/locales/nl.json b/webapp/locales/nl.json
index b780a1e36..64643133c 100644
--- a/webapp/locales/nl.json
+++ b/webapp/locales/nl.json
@@ -1,176 +1,176 @@
{
- "site": {
- "made": "Met ❤ gemaakt",
- "imprint": "Afdruk",
- "termsAc": "Gebruiksvoorwaarden",
- "data-privacy": "gegevensbescherming",
- "contact": "contact",
- "tribunal": "registerrechtbank",
- "register": "inschrijfnummer",
- "director": "Directeur",
- "taxident": "Identificatienummer voor de belasting over de toegevoegde waarde overeenkomstig § 27 a Wet op de belasting over de toegevoegde waarde (Duitsland).",
- "responsible": "Verantwoordelijk volgens § 55 Abs. 2 RStV (Duitsland).",
- "bank": "bankrekening",
- "germany": "Duitsland"
- },
- "login": {
- "copy": "Als u al een mini-aansluiting account heeft, log dan hier in.",
- "login": "Inloggen",
- "logout": "Uitloggen",
- "email": "Uw E-mail",
- "password": "Uw Wachtwoord",
- "moreInfo": "Wat is Human Connection?",
- "hello": "Hallo"
- },
- "profile": {
- "name": "Mijn profiel",
- "memberSince": "Lid sinds",
- "follow": "Volgen",
- "followers": "Volgelingen",
- "following": "Volgt"
- },
- "settings": {
- "name": "Instellingen",
- "data": {
- "name": "Uw gegevens"
- },
- "security": {
- "name": "Veiligheid"
- },
- "invites": {
- "name": "Uitnodigingen"
- },
- "download": {
- "name": "Gegevens downloaden"
- },
- "delete": {
- "name": "Account verwijderen"
- },
- "organizations": {
- "name": "Mijn Organisaties"
- },
- "languages": {
- "name": "Talen"
- }
+ "actions": {
+ "cancel": "Annuleren"
},
"admin": {
- "name": "Admin",
+ "categories": {
+ "categoryName": "Naam",
+ "name": "Categorieën",
+ "postCount": "Berichten"
+ },
"dashboard": {
- "name": "Dashboard",
- "users": "Gebruikers",
- "posts": "Berichten",
"comments": "Opmerkingen",
+ "follows": "Volgt",
+ "invites": "Uitnodigingen",
+ "name": "Dashboard",
"notifications": "Meldingen",
"organizations": "Organisaties",
+ "posts": "Berichten",
"projects": "Projecten",
- "invites": "Uitnodigingen",
- "follows": "Volgt",
- "shouts": "Shouts"
+ "shouts": "Shouts",
+ "users": "Gebruikers"
+ },
+ "name": "Admin",
+ "notifications": {
+ "name": "Meldingen"
},
"organizations": {
"name": "Organisaties"
},
- "users": {
- "name": "Gebruikers"
- },
"pages": {
"name": "Pages"
},
- "notifications": {
- "name": "Meldingen"
- },
- "categories": {
- "name": "Categorieën",
- "categoryName": "Naam",
- "postCount": "Berichten"
+ "settings": {
+ "name": "Instellingen"
},
"tags": {
"name": "Tags",
- "tagCountUnique": "Gebruikers",
- "tagCount": "Berichten"
+ "tagCount": "Berichten",
+ "tagCountUnique": "Gebruikers"
},
- "settings": {
- "name": "Instellingen"
+ "users": {
+ "name": "Gebruikers"
}
},
- "post": {
- "name": "Post",
- "moreInfo": {
- "name": "Meer info"
- },
- "takeAction": {
- "name": "Onderneem actie"
- }
- },
- "quotes": {
- "african": {
- "quote": "Veel kleine mensen op veel kleine plaatsen doen veel kleine dingen, die het gezicht van de wereld kunnen veranderen.",
- "author": "Afrikaans spreekwoord"
- }
+ "comment": {
+ "delete": "Commentaar verwijderen",
+ "edit": "Commentaar bewerken"
},
"common": {
- "post": "Bericht ::: Berichten",
+ "category": "Categorie ::: Categorieën",
"comment": "Opmerking ::: Opmerkingen",
"letsTalk": "Laten we praten",
- "versus": "Versus",
- "moreInfo": "Meer info",
- "takeAction": "Onderneem actie",
- "shout": "Shout ::: Shouts",
- "user": "Gebruiker ::: Gebruikers",
- "category": "Categorie ::: Categorieën",
- "organization": "Organisatie ::: Organisaties",
- "project": "Project ::: Projecten",
- "tag": "Tag ::: Tags",
- "name": "Naam",
- "loadMore": "meer laden",
"loading": "inlading",
- "reportContent": "Melden"
- },
- "disable": {
- "comment": {
- "title": "Commentaar uitschakelen",
- "type": "Melding",
- "message": "Wilt u de reactie van \" {name} \" echt uitschakelen ?"
- }
- },
- "report": {
- "submit": "Verzenden",
- "cancel": "Annuleren",
- "user": {
- "title": "Gebruiker melden",
- "type": "Gebruiker",
- "message": "Wilt u echt het commentaar van \"{name}\" melden?"
- },
- "contribution": {
- "title": "Bijdrage melden",
- "type": "Bijdrage",
- "message": "Wilt u echt het commentaar van \"{name}\" melden?"
- },
- "comment": {
- "title": "Reactie melden",
- "type": "Melding",
- "message": "Wilt u echt het commentaar van \"{name}\" melden?"
- }
- },
- "actions": {
- "cancel": "Annuleren"
+ "loadMore": "meer laden",
+ "moreInfo": "Meer info",
+ "name": "Naam",
+ "organization": "Organisatie ::: Organisaties",
+ "post": "Bericht ::: Berichten",
+ "project": "Project ::: Projecten",
+ "reportContent": "Melden",
+ "shout": "Shout ::: Shouts",
+ "tag": "Tag ::: Tags",
+ "takeAction": "Onderneem actie",
+ "user": "Gebruiker ::: Gebruikers",
+ "versus": "Versus"
},
"contribution": {
- "edit": "Bijdrage bewerken",
"delete": "Bijdrage verwijderen",
+ "edit": "Bijdrage bewerken",
"teaserImage": {
"cropperConfirm": "Bevestigen"
}
},
- "comment": {
- "edit": "Commentaar bewerken",
- "delete": "Commentaar verwijderen"
+ "disable": {
+ "comment": {
+ "message": "Wilt u de reactie van \" {name} \" echt uitschakelen ?",
+ "title": "Commentaar uitschakelen",
+ "type": "Melding"
+ }
},
"followButton": {
"follow": "Volgen",
"following": "Volgt"
},
+ "login": {
+ "copy": "Als u al een mini-aansluiting account heeft, log dan hier in.",
+ "email": "Uw E-mail",
+ "hello": "Hallo",
+ "login": "Inloggen",
+ "logout": "Uitloggen",
+ "moreInfo": "Wat is Human Connection?",
+ "password": "Uw Wachtwoord"
+ },
+ "post": {
+ "moreInfo": {
+ "name": "Meer info"
+ },
+ "name": "Post",
+ "takeAction": {
+ "name": "Onderneem actie"
+ }
+ },
+ "profile": {
+ "follow": "Volgen",
+ "followers": "Volgelingen",
+ "following": "Volgt",
+ "memberSince": "Lid sinds",
+ "name": "Mijn profiel"
+ },
+ "quotes": {
+ "african": {
+ "author": "Afrikaans spreekwoord",
+ "quote": "Veel kleine mensen op veel kleine plaatsen doen veel kleine dingen, die het gezicht van de wereld kunnen veranderen."
+ }
+ },
+ "report": {
+ "cancel": "Annuleren",
+ "comment": {
+ "message": "Wilt u echt het commentaar van \"{name}\" melden?",
+ "title": "Reactie melden",
+ "type": "Melding"
+ },
+ "contribution": {
+ "message": "Wilt u echt het commentaar van \"{name}\" melden?",
+ "title": "Bijdrage melden",
+ "type": "Bijdrage"
+ },
+ "submit": "Verzenden",
+ "user": {
+ "message": "Wilt u echt het commentaar van \"{name}\" melden?",
+ "title": "Gebruiker melden",
+ "type": "Gebruiker"
+ }
+ },
+ "settings": {
+ "data": {
+ "name": "Uw gegevens"
+ },
+ "delete": {
+ "name": "Account verwijderen"
+ },
+ "download": {
+ "name": "Gegevens downloaden"
+ },
+ "invites": {
+ "name": "Uitnodigingen"
+ },
+ "languages": {
+ "name": "Talen"
+ },
+ "name": "Instellingen",
+ "organizations": {
+ "name": "Mijn Organisaties"
+ },
+ "security": {
+ "name": "Veiligheid"
+ }
+ },
"shoutButton": {
"shouted": "uitgeroepen"
+ },
+ "site": {
+ "bank": "bankrekening",
+ "contact": "contact",
+ "data-privacy": "gegevensbescherming",
+ "director": "Directeur",
+ "germany": "Duitsland",
+ "imprint": "Afdruk",
+ "made": "Met ❤ gemaakt",
+ "register": "inschrijfnummer",
+ "responsible": "Verantwoordelijk volgens § 55 Abs. 2 RStV (Duitsland).",
+ "taxident": "Identificatienummer voor de belasting over de toegevoegde waarde overeenkomstig § 27 a Wet op de belasting over de toegevoegde waarde (Duitsland).",
+ "termsAc": "Gebruiksvoorwaarden",
+ "tribunal": "registerrechtbank"
}
}
diff --git a/webapp/locales/pl.json b/webapp/locales/pl.json
index 9f9174caa..8b4dbf59a 100644
--- a/webapp/locales/pl.json
+++ b/webapp/locales/pl.json
@@ -1,81 +1,191 @@
{
- "components": {
- "password-reset": {
- "request": {
- "title": "Zresetuj hasło",
- "form": {
- "description": "Na podany adres e-mail zostanie wysłany email z resetem hasła.",
- "submit": "Poproś o wiadomość e-mail",
- "submitted": "Na adres {email} została wysłana wiadomość z dalszymi instrukcjami."
- }
- },
- "change-password": {
- "success": "Zmiana hasła zakończyła się sukcesem!",
- "error": "Zmiana hasła nie powiodła się. Może kod bezpieczeństwa nie był poprawny?",
- "help": "W przypadku problemów, zachęcamy do zwrócenia się o pomoc, wysyłając do nas wiadomość e-mail:"
- }
+ "actions": {
+ "cancel": "Odwołaj",
+ "create": "Tworzenie",
+ "delete": "Usuń",
+ "edit": "Edycja",
+ "loading": "załadunek",
+ "loadMore": "Obciążenie więcej",
+ "save": "Oszczędzaj"
+ },
+ "admin": {
+ "categories": {
+ "categoryName": "Nazwa",
+ "name": "Kategorie",
+ "postCount": "Stanowiska"
},
+ "dashboard": {
+ "comments": "Komentarze",
+ "follows": "Podąża za",
+ "invites": "Zaprasza",
+ "name": "Tablica rozdzielcza",
+ "notifications": "Powiadomienia",
+ "organizations": "Organizacje",
+ "posts": "Stanowiska",
+ "projects": "Projekty",
+ "shouts": "Zalecane",
+ "users": "Użytkownicy"
+ },
+ "name": "Admin",
+ "notifications": {
+ "name": "Powiadomienia"
+ },
+ "organizations": {
+ "name": "Organizacje"
+ },
+ "pages": {
+ "name": "Strony"
+ },
+ "settings": {
+ "name": "Ustawienia"
+ },
+ "tags": {
+ "name": "Znaczniki",
+ "tagCount": "Stanowiska",
+ "tagCountUnique": "Użytkownicy"
+ },
+ "users": {
+ "name": "Użytkownicy"
+ }
+ },
+ "comment": {
+ "content": {
+ "unavailable-placeholder": " ...ten komentarz nie jest już dostępny."
+ },
+ "menu": {
+ "delete": "Usuń komentarz",
+ "edit": "Edytuj komentarz"
+ },
+ "show": {
+ "less": "Pokaż mniej",
+ "more": "Pokaż więcej"
+ }
+ },
+ "common": {
+ "category": "Kategoria ::: Kategorie",
+ "comment": "Komentarz ::: Komentarze",
+ "letsTalk": "Porozmawiajmy",
+ "loading": "załadunek",
+ "loadMore": "Obciążenie więcej",
+ "moreInfo": "Więcej informacji",
+ "name": "Nazwa",
+ "organization": "Organization ::: Organizations",
+ "post": "Poczta ::: Posty",
+ "project": "Projekt ::: Projekty",
+ "reportContent": "Sprawozdanie",
+ "shout": "przekazanie sprawy ::: Polecam tę stronę",
+ "tag": "Znacznik ::: Znaczniki",
+ "takeAction": "Podejmij działania",
+ "user": "Użytkownik ::: Użytkownicy",
+ "validations": {
+ "email": "musi być ważny adres e-mail."
+ },
+ "versus": "werset"
+ },
+ "components": {
"enter-nonce": {
"form": {
- "nonce": "Wprowadź swój kod",
"description": "Otwórz swoją skrzynkę odbiorczą i wpisz kod, który do Ciebie wysłaliśmy.",
"next": "Kontynuuj",
+ "nonce": "Wprowadź swój kod",
"validations": {
"length": "musi mieć długość 6 znaków."
}
}
+ },
+ "password-reset": {
+ "change-password": {
+ "error": "Zmiana hasła nie powiodła się. Może kod bezpieczeństwa nie był poprawny?",
+ "help": "W przypadku problemów, zachęcamy do zwrócenia się o pomoc, wysyłając do nas wiadomość e-mail:",
+ "success": "Zmiana hasła zakończyła się sukcesem!"
+ },
+ "request": {
+ "form": {
+ "description": "Na podany adres e-mail zostanie wysłany email z resetem hasła.",
+ "submit": "Poproś o wiadomość e-mail",
+ "submitted": "Na adres {email} została wysłana wiadomość z dalszymi instrukcjami."
+ },
+ "title": "Zresetuj hasło"
+ }
}
},
- "filter-menu": {
- "title": "Twoja bańka filtrująca"
+ "contribution": {
+ "categories": {
+ "infoSelectedNoOfMaxCategories": "{chosen} z {max} wybrane kategorie"
+ },
+ "filterALL": "Pokaż wszystkie wpisy",
+ "filterFollow": "Pokaż wpisy użytkowników, których śledzę",
+ "languageSelectLabel": "Język",
+ "newPost": "Utwórz nowy wpis",
+ "success": "Zapisano!",
+ "teaserImage": {
+ "cropperConfirm": "Potwierdzać"
+ }
},
- "site": {
- "made": "Z ❤ zrobiony",
- "imprint": "Nadruk",
- "termsAc": "Warunki użytkowania",
- "data-privacy": "ochrona danych",
- "contact": "Kontakt",
- "tribunal": "sąd rejestrowy",
- "register": "numer rejestracyjny",
- "director": "Dyrektor zarządzający",
- "taxident": "Numer identyfikacyjny podatku od wartości dodanej zgodnie z § 27 a Ustawa o podatku od wartości dodanej (Niemcy)",
- "responsible": "Odpowiedzialny zgodnie z § 55 Abs. 2 RStV (Niemcy)",
- "bank": "rachunek bankowy",
- "germany": "Niemcy"
+ "delete": {
+ "cancel": "Odwołaj",
+ "comment": {
+ "message": "Czy na pewno chcesz ukryć komentarz użytkownika \" {name} \"?",
+ "title": "Usuń komentarz",
+ "type": "Komentarz"
+ },
+ "contribution": {
+ "message": "Czy na pewno chcesz ukryć wpis \" {name} \"?",
+ "success": "Wyślij pomyślnie usunięty!",
+ "title": "Ukryj wpis",
+ "type": "Wpis / Post"
+ },
+ "submit": "Usuń"
},
- "login": {
- "copy": "Jeśli masz już konto Human Connection, zaloguj się tutaj.",
- "login": "Logowanie",
- "logout": "Wyloguj się",
- "email": "Twój adres e-mail",
- "password": "Twoje hasło",
- "forgotPassword": "Zapomniałeś hasła?",
- "moreInfo": "Co to jest Human Connection?",
- "moreInfoURL": "https://human-connection.org/en/",
- "moreInfoHint": "idź po więcej szczegółów",
- "hello": "Cześć"
+ "disable": {
+ "cancel": "Anuluj",
+ "comment": {
+ "message": "Naprawdę chcesz wyłączyć komentarz \"{name}\"?",
+ "title": "Wyłącz komentarz",
+ "type": "Komentarz"
+ },
+ "contribution": {
+ "message": "Naprawdę chcesz unieszkodliwić ten wkład \"{name}\"?",
+ "title": "Wyłącz Wkład",
+ "type": "Wkład"
+ },
+ "submit": "Deaktywuj",
+ "success": "Zdeaktywowano",
+ "user": {
+ "message": "Czy naprawdę chcesz wyłączyć użytkownika \"{name}\"?",
+ "title": "Wyłączenie użytkownika",
+ "type": "Użytkownik"
+ }
},
"editor": {
"placeholder": "Napisz coś inspirującego..."
},
- "profile": {
- "name": "Mój profil",
- "memberSince": "Członek od",
- "follow": "Obserwuj",
- "followers": "Obserwujący",
- "following": "Obserwowani",
- "shouted": "Krzyknij",
- "commented": "Skomentuj",
- "userAnonym": "Anonymous",
- "socialMedia": "Gdzie jeszcze mogę znaleźć",
- "network": {
- "title": "Sieć",
- "following": "obserwuje:",
- "followingNobody": "nikogo nie obserwuje.",
- "followedBy": "jest obserwowany:",
- "followedByNobody": "nikt go nie obserwuje.",
- "and": "i",
- "more": "więcej"
+ "filter-menu": {
+ "title": "Twoja bańka filtrująca"
+ },
+ "followButton": {
+ "follow": "naśladować",
+ "following": "w skutek"
+ },
+ "login": {
+ "copy": "Jeśli masz już konto Human Connection, zaloguj się tutaj.",
+ "email": "Twój adres e-mail",
+ "forgotPassword": "Zapomniałeś hasła?",
+ "hello": "Cześć",
+ "login": "Logowanie",
+ "logout": "Wyloguj się",
+ "moreInfo": "Co to jest Human Connection?",
+ "moreInfoHint": "idź po więcej szczegółów",
+ "moreInfoURL": "https://human-connection.org/en/",
+ "password": "Twoje hasło"
+ },
+ "moderation": {
+ "name": "Umiarkowanie",
+ "reports": {
+ "disabledBy": "deaktywowane przez",
+ "empty": "Gratulacje, moderacja nie jest potrzebna",
+ "name": "Raporty",
+ "submitter": "zgłoszone przez"
}
},
"notifications": {
@@ -83,61 +193,147 @@
"mentioned": "wspomiał o Tobie we wpisie"
}
},
+ "post": {
+ "comment": {
+ "submit": "Komentarz",
+ "submitted": "Komentarz dodany"
+ },
+ "menu": {
+ "delete": "Usuń wpis",
+ "edit": "Edytuj wpis"
+ },
+ "moreInfo": {
+ "name": "Więcej informacji"
+ },
+ "name": "Poczta",
+ "takeAction": {
+ "name": "Podejmij działanie"
+ }
+ },
+ "profile": {
+ "commented": "Skomentuj",
+ "follow": "Obserwuj",
+ "followers": "Obserwujący",
+ "following": "Obserwowani",
+ "memberSince": "Członek od",
+ "name": "Mój profil",
+ "network": {
+ "and": "i",
+ "followedBy": "jest obserwowany:",
+ "followedByNobody": "nikt go nie obserwuje.",
+ "following": "obserwuje:",
+ "followingNobody": "nikogo nie obserwuje.",
+ "more": "więcej",
+ "title": "Sieć"
+ },
+ "shouted": "Krzyknij",
+ "socialMedia": "Gdzie jeszcze mogę znaleźć",
+ "userAnonym": "Anonymous"
+ },
+ "quotes": {
+ "african": {
+ "author": "Afrykańskie przysłowie",
+ "quote": "Wielu małych ludzi w wielu małych miejscowościach robi wiele małych rzeczy, które mogą zmienić oblicze świata."
+ }
+ },
+ "release": {
+ "cancel": "Anuluj",
+ "comment": {
+ "message": "Czy na pewno chcesz zgłosić komentarz użytkownika \" {name} \"?",
+ "title": "Zgłoś komentarz",
+ "type": "Komentarz"
+ },
+ "contribution": {
+ "message": "Czy na pewno chcesz zgłosić wpis użytkownika \" {name} \"?",
+ "title": "Zgłoś wpis",
+ "type": "Wpis"
+ },
+ "submit": "Zgłoś",
+ "success": "Zgłoszono pomyślnie!",
+ "user": {
+ "message": "Czy na pewno chcesz zgłosić użytkownika \" {name} \"?",
+ "title": "Zgłoś użytkownika",
+ "type": "Użytkownik"
+ }
+ },
+ "report": {
+ "cancel": "Anuluj",
+ "comment": {
+ "error": "Zgłosiłeś już komentarz!",
+ "message": "Czy na pewno chcesz zgłosić komentarz użytkownika\" {name} \"?",
+ "title": "Sprawozdanie Komentarz",
+ "type": "Komentarz"
+ },
+ "contribution": {
+ "error": "Zgłosiłeś już ten wkład!",
+ "message": "Czy na pewno chcesz zgłosić ten wpis użytkownika \" {name} \"?",
+ "title": "Zgłoś wpis",
+ "type": "Wpis / Post"
+ },
+ "submit": "Wyślij raport",
+ "success": "Dziękujemy za Twoje zgłoszenie!",
+ "user": {
+ "error": "Zgłosiłeś już użytkownika!",
+ "message": "Czy na pewno chcesz zgłosić użytkownika \" {name} \"?",
+ "title": "Raport Użytkownik",
+ "type": "Użytkownik"
+ }
+ },
"search": {
- "placeholder": "Szukaj",
+ "failed": "Niczego nie znaleziono",
"hint": "Czego szukasz?",
- "failed": "Niczego nie znaleziono"
+ "placeholder": "Szukaj"
},
"settings": {
- "name": "Ustawienia",
"data": {
- "name": "Twoje dane",
- "labelName": "Twoje dane",
- "namePlaceholder": "Anonymous",
- "labelCity": "Twoje miasto lub region",
"labelBio": "O Tobie",
+ "labelCity": "Twoje miasto lub region",
+ "labelName": "Twoje dane",
+ "name": "Twoje dane",
+ "namePlaceholder": "Anonymous",
"success": "Twoje dane zostały pomyślnie zaktualizowane!"
},
+ "deleteUserAccount": {
+ "accountDescription": "Be aware that your Post and Comments are important to our community. If you still choose to delete them, you have to mark them below.",
+ "accountWarning": "Po usunięcie Twojego konta, nie możesz ZARZĄDZAĆ ani ODZYSKAĆ danych, wpisów oraz komentarzy!",
+ "commentedCount": "Usuń {count} moich komentarzy",
+ "contributionsCount": "Usuń {count} moich postów",
+ "name": "Usuń dane",
+ "pleaseConfirm": "Uwaga, niebezpieczeństwo! Wpisz „{confirm}”, aby potwierdzić.",
+ "success": "Konto zostało usunięte"
+ },
+ "download": {
+ "name": "Pobierz dane"
+ },
+ "invites": {
+ "name": "Zaproszenia"
+ },
+ "languages": {
+ "name": "Języki"
+ },
+ "name": "Ustawienia",
+ "organizations": {
+ "name": "My Organizations"
+ },
"security": {
- "name": "Bezpieczeństwo",
"change-password": {
"button": "Zmień hasło",
- "success": "Hasło zostało zmienione!",
- "label-old-password": "Stare hasło",
"label-new-password": "Nowe hasło",
"label-new-password-confirm": "Potwierdź nowe hasło",
- "message-old-password-required": "Podaj stare hasło",
- "message-new-password-required": "Wprowadź nowe hasło",
+ "label-old-password": "Stare hasło",
"message-new-password-confirm-required": "Potwierdź nowe hasło",
"message-new-password-missmatch": "Wpisz to samo hasło ponownie",
+ "message-new-password-required": "Wprowadź nowe hasło",
+ "message-old-password-required": "Podaj stare hasło",
"passwordSecurity": "Siła hasła",
"passwordStrength0": "Hasło bardzo słabe",
"passwordStrength1": "Hasło słabe",
"passwordStrength2": "Hasło średnie",
"passwordStrength3": "Hasło silne",
- "passwordStrength4": "Hasło bardzo silne"
- }
- },
- "invites": {
- "name": "Zaproszenia"
- },
- "download": {
- "name": "Pobierz dane"
- },
- "deleteUserAccount": {
- "name": "Usuń dane",
- "contributionsCount": "Usuń {count} moich postów",
- "commentedCount": "Usuń {count} moich komentarzy",
- "accountDescription": "Be aware that your Post and Comments are important to our community. If you still choose to delete them, you have to mark them below.",
- "accountWarning": "Po usunięcie Twojego konta, nie możesz ZARZĄDZAĆ ani ODZYSKAĆ danych, wpisów oraz komentarzy!",
- "success": "Konto zostało usunięte",
- "pleaseConfirm": "Uwaga, niebezpieczeństwo! Wpisz „{confirm}”, aby potwierdzić."
- },
- "organizations": {
- "name": "My Organizations"
- },
- "languages": {
- "name": "Języki"
+ "passwordStrength4": "Hasło bardzo silne",
+ "success": "Hasło zostało zmienione!"
+ },
+ "name": "Bezpieczeństwo"
},
"social-media": {
"name": "Media społecznościowe",
@@ -147,223 +343,26 @@
"successDelete": "Usunięto społeczność. Profil zaktualizowany!"
}
},
- "admin": {
- "name": "Admin",
- "dashboard": {
- "name": "Tablica rozdzielcza",
- "users": "Użytkownicy",
- "posts": "Stanowiska",
- "comments": "Komentarze",
- "notifications": "Powiadomienia",
- "organizations": "Organizacje",
- "projects": "Projekty",
- "invites": "Zaprasza",
- "follows": "Podąża za",
- "shouts": "Zalecane"
- },
- "organizations": {
- "name": "Organizacje"
- },
- "users": {
- "name": "Użytkownicy"
- },
- "pages": {
- "name": "Strony"
- },
- "notifications": {
- "name": "Powiadomienia"
- },
- "categories": {
- "name": "Kategorie",
- "categoryName": "Nazwa",
- "postCount": "Stanowiska"
- },
- "tags": {
- "name": "Znaczniki",
- "tagCountUnique": "Użytkownicy",
- "tagCount": "Stanowiska"
- },
- "settings": {
- "name": "Ustawienia"
- }
- },
- "post": {
- "name": "Poczta",
- "moreInfo": {
- "name": "Więcej informacji"
- },
- "takeAction": {
- "name": "Podejmij działanie"
- },
- "menu": {
- "edit": "Edytuj wpis",
- "delete": "Usuń wpis"
- },
- "comment": {
- "submit": "Komentarz",
- "submitted": "Komentarz dodany"
- }
- },
- "comment": {
- "content": {
- "unavailable-placeholder": " ...ten komentarz nie jest już dostępny."
- },
- "menu": {
- "edit": "Edytuj komentarz",
- "delete": "Usuń komentarz"
- },
- "show": {
- "more": "Pokaż więcej",
- "less": "Pokaż mniej"
- }
-
- },
- "quotes": {
- "african": {
- "quote": "Wielu małych ludzi w wielu małych miejscowościach robi wiele małych rzeczy, które mogą zmienić oblicze świata.",
- "author": "Afrykańskie przysłowie"
- }
- },
- "common": {
- "post": "Poczta ::: Posty",
- "comment": "Komentarz ::: Komentarze",
- "letsTalk": "Porozmawiajmy",
- "versus": "werset",
- "moreInfo": "Więcej informacji",
- "takeAction": "Podejmij działania",
- "shout": "przekazanie sprawy ::: Polecam tę stronę",
- "user": "Użytkownik ::: Użytkownicy",
- "category": "Kategoria ::: Kategorie",
- "organization": "Organization ::: Organizations",
- "project": "Projekt ::: Projekty",
- "tag": "Znacznik ::: Znaczniki",
- "name": "Nazwa",
- "loadMore": "Obciążenie więcej",
- "loading": "załadunek",
- "reportContent": "Sprawozdanie",
- "validations": {
- "email": "musi być ważny adres e-mail."
- }
- },
- "actions": {
- "loading": "załadunek",
- "loadMore": "Obciążenie więcej",
- "create": "Tworzenie",
- "save": "Oszczędzaj",
- "edit": "Edycja",
- "delete": "Usuń",
- "cancel": "Odwołaj"
- },
- "moderation": {
- "name": "Umiarkowanie",
- "reports": {
- "empty": "Gratulacje, moderacja nie jest potrzebna",
- "name": "Raporty",
- "submitter": "zgłoszone przez",
- "disabledBy": "deaktywowane przez"
- }
- },
- "disable": {
- "submit": "Deaktywuj",
- "cancel": "Anuluj",
- "success": "Zdeaktywowano",
- "user": {
- "title": "Wyłączenie użytkownika",
- "type": "Użytkownik",
- "message": "Czy naprawdę chcesz wyłączyć użytkownika \"{name}\"?"
- },
- "contribution": {
- "title": "Wyłącz Wkład",
- "type": "Wkład",
- "message": "Naprawdę chcesz unieszkodliwić ten wkład \"{name}\"?"
- },
- "comment": {
- "title": "Wyłącz komentarz",
- "type": "Komentarz",
- "message": "Naprawdę chcesz wyłączyć komentarz \"{name}\"?"
- }
- },
- "delete": {
- "submit": "Usuń",
- "cancel": "Odwołaj",
- "contribution": {
- "title": "Ukryj wpis",
- "type": "Wpis / Post",
- "message": "Czy na pewno chcesz ukryć wpis \" {name} \"?",
- "success": "Wyślij pomyślnie usunięty!"
- },
- "comment": {
- "title": "Usuń komentarz",
- "type": "Komentarz",
- "message": "Czy na pewno chcesz ukryć komentarz użytkownika \" {name} \"?"
- }
- },
- "report": {
- "submit": "Wyślij raport",
- "cancel": "Anuluj",
- "success": "Dziękujemy za Twoje zgłoszenie!",
- "user": {
- "title": "Raport Użytkownik",
- "type": "Użytkownik",
- "message": "Czy na pewno chcesz zgłosić użytkownika \" {name} \"?",
- "error": "Zgłosiłeś już użytkownika!"
- },
- "contribution": {
- "title": "Zgłoś wpis",
- "type": "Wpis / Post",
- "message": "Czy na pewno chcesz zgłosić ten wpis użytkownika \" {name} \"?",
- "error": "Zgłosiłeś już ten wkład!"
- },
- "comment": {
- "title": "Sprawozdanie Komentarz",
- "type": "Komentarz",
- "message": "Czy na pewno chcesz zgłosić komentarz użytkownika\" {name} \"?",
- "error": "Zgłosiłeś już komentarz!"
- }
- },
- "followButton": {
- "follow": "naśladować",
- "following": "w skutek"
- },
"shoutButton": {
"shouted": "krzyczeć"
},
- "release": {
- "submit": "Zgłoś",
- "cancel": "Anuluj",
- "success": "Zgłoszono pomyślnie!",
- "user": {
- "title": "Zgłoś użytkownika",
- "type": "Użytkownik",
- "message": "Czy na pewno chcesz zgłosić użytkownika \" {name} \"?"
- },
- "contribution": {
- "title": "Zgłoś wpis",
- "type": "Wpis",
- "message": "Czy na pewno chcesz zgłosić wpis użytkownika \" {name} \"?"
- },
- "comment": {
- "title": "Zgłoś komentarz",
- "type": "Komentarz",
- "message": "Czy na pewno chcesz zgłosić komentarz użytkownika \" {name} \"?"
- }
+ "site": {
+ "bank": "rachunek bankowy",
+ "contact": "Kontakt",
+ "data-privacy": "ochrona danych",
+ "director": "Dyrektor zarządzający",
+ "germany": "Niemcy",
+ "imprint": "Nadruk",
+ "made": "Z ❤ zrobiony",
+ "register": "numer rejestracyjny",
+ "responsible": "Odpowiedzialny zgodnie z § 55 Abs. 2 RStV (Niemcy)",
+ "taxident": "Numer identyfikacyjny podatku od wartości dodanej zgodnie z § 27 a Ustawa o podatku od wartości dodanej (Niemcy)",
+ "termsAc": "Warunki użytkowania",
+ "tribunal": "sąd rejestrowy"
},
"user": {
"avatar": {
"submitted": "Przesłano pomyślnie"
}
- },
- "contribution": {
- "newPost": "Utwórz nowy wpis",
- "filterFollow": "Pokaż wpisy użytkowników, których śledzę",
- "filterALL": "Pokaż wszystkie wpisy",
- "success": "Zapisano!",
- "languageSelectLabel": "Język",
- "categories": {
- "infoSelectedNoOfMaxCategories": "{chosen} z {max} wybrane kategorie"
- },
- "teaserImage": {
- "cropperConfirm": "Potwierdzać"
- }
}
}
diff --git a/webapp/locales/pt.json b/webapp/locales/pt.json
index 3deda86ca..125e6b5f9 100644
--- a/webapp/locales/pt.json
+++ b/webapp/locales/pt.json
@@ -1,747 +1,747 @@
{
- "login": {
- "copy": "Se você já tem uma conta no Human Connection, entre aqui.",
- "login": "Entrar",
- "logout": "Sair",
- "email": "Seu email",
- "password": "Sua senha",
- "moreInfo": "O que é a Human Connection?",
- "hello": "Olá",
- "forgotPassword": "Esqueceu a sua senha?",
- "no-account": "Ainda não tem uma conta?",
- "register": "Cadastrar-se",
- "moreInfoURL": "https:\/\/human-connection.org\/en\/",
- "moreInfoHint": "para a página de apresentação",
- "success": "Você está conectado!",
- "failure": "Endereço de e-mail ou senha incorretos."
+ "actions": {
+ "cancel": "Cancelar",
+ "create": "Criar",
+ "delete": "Apagar",
+ "edit": "Editar",
+ "loading": "Carregando",
+ "loadMore": "Carregar mais",
+ "save": "Salvar"
+ },
+ "admin": {
+ "categories": {
+ "categoryName": "Nome",
+ "name": "Categorias",
+ "postCount": "Postagens"
},
- "profile": {
- "name": "Meu perfil",
- "memberSince": "Membro desde",
- "follow": "Seguir",
- "followers": "Seguidores",
- "following": "Seguindo",
- "shouted": "Aclamou",
- "commented": "Comentou",
- "userAnonym": "Anonymous",
- "socialMedia": "Onde mais posso encontrar",
- "network": {
- "title": "Rede",
- "following": "está seguindo:",
- "followingNobody": "não segue ninguém.",
- "followedBy": "é seguido por:",
- "followedByNobody": "não é seguido por ninguém.",
- "andMore": "e {number} mais …"
- },
- "invites": {
- "title": "Convidar alguém para Human Connection!",
- "description": "Digite o endereço de e-mail para o convite.",
- "emailPlaceholder": "E-mail para convidar"
- }
- },
- "settings": {
- "name": "Configurações",
- "data": {
- "name": "Seus dados",
- "labelName": "Seu nome",
- "labelCity": "Sua cidade ou estado",
- "labelBio": "Sobre você",
- "labelSlug": "Seu nome de usuário exclusivo",
- "namePlaceholder": "Anonymous",
- "success": "Seus dados foram atualizados com sucesso!"
- },
- "security": {
- "name": "Segurança",
- "change-password": {
- "button": "Modificar senha",
- "success": "Senha modificada com sucesso!",
- "label-old-password": "Sua senha antiga",
- "label-new-password": "Sua nova senha",
- "label-new-password-confirm": "Confirme sua nova senha",
- "message-old-password-required": "Digite sua senha antiga",
- "message-new-password-required": "Digite uma nova senha",
- "message-new-password-confirm-required": "Confirme sua nova senha",
- "message-new-password-missmatch": "Digite a mesma senha novamente",
- "passwordSecurity": "Segurança da senha",
- "passwordStrength0": "Senha muito insegura",
- "passwordStrength1": "Senha insegura",
- "passwordStrength2": "Senha medíocre",
- "passwordStrength3": "Senha forte",
- "passwordStrength4": "Senha muito forte"
- }
- },
- "invites": {
- "name": "Convites"
- },
- "download": {
- "name": "Baixar dados"
- },
- "delete": {
- "name": "Apagar conta"
- },
- "organizations": {
- "name": "Minhas Organizações"
- },
- "languages": {
- "name": "Idiomas"
- },
- "email": {
- "validation": {
- "same-email": "Este é o seu endereço de e-mail atual"
- },
- "name": "Seu email",
- "labelEmail": "Alterar o seu endereço de e-mail",
- "labelNewEmail": "Novo endereço de e-mail",
- "labelNonce": "Digite o seu código",
- "success": "Um novo endereço de e-mail foi registrado.",
- "submitted": "Um e-mail para verificar o seu endereço foi enviado para {email}<\/b>.",
- "change-successful": "O seu endereço de e-mail foi alterado com sucesso.",
- "verification-error": {
- "message": "O seu e-mail não pode ser alterado.",
- "explanation": "Isto pode ter diferentes causas:",
- "reason": {
- "invalid-nonce": "O código de confirmação esta inválido?",
- "no-email-request": "Você tem certeza de que solicitou uma alteração no seu endereço de e-mail?"
- },
- "support": "Se o problema persistir, por favor contacte-nos por e-mail"
- }
- },
- "validation": {
- "slug": {
- "regex": "Os caracteres permitidos são apenas letras minúsculas, números, sublinhados e hífens.",
- "alreadyTaken": "Este nome de usuário já está registrado."
- }
- },
- "deleteUserAccount": {
- "name": "Deletar dados",
- "contributionsCount": "Deletar minhas {count} publicações",
- "commentedCount": "Deletar meus {count} comentários",
- "accountDescription": "Esteja ciente de que o suas Publicações e Comentários são importantes para a nossa comunidade. Se você ainda optar por excluí-los, você tem que marcá-los abaixo.",
- "accountWarning": "Você NÃO PODE GERENCIAR e NÃO PODE RECUPERAR sua conta, Publicações, ou Comentários após excluir sua conta!",
- "success": "Conta eliminada com sucesso!",
- "pleaseConfirm": "Ação destrutiva! Digitar “{confirm}” para confirmar."
- },
- "embeds": {
- "name": "Fornecedores de terceiros",
- "info-description": "Se você concordar, as publicações da seguinte lista de provedores incluirão automaticamente código de terceiros de outros provedores (terceiros) na forma de vídeos, imagens ou texto incorporados.",
- "status": {
- "description": "Como padrão para você, o código incorporado de provedores de terceiros é",
- "disabled": {
- "off": "não exibido inicialmente",
- "on": "exibido imediatamente"
- },
- "change": {
- "question": "O código-fonte incorporado de terceiros deve sempre ser exibido para você?",
- "allow": "Certeza",
- "deny": "Não, obrigado"
- }
- }
- },
- "social-media": {
- "name": "Mídias sociais",
- "placeholder": "Sua url de mídia social",
- "requireUnique": "Você já adicionou esta url",
- "submit": "Adicionar link",
- "successAdd": "Mídias sociais adicionadas. Perfil de usuário atualizado!",
- "successDelete": "Mídias sociais removidas. Perfil de usuário atualizado!"
- },
- "muted-users": {
- "name": "Usuários bloqueados",
- "explanation": {
- "intro": "Se outro usuário foi bloqueado por você, isto é o que acontece:",
- "your-perspective": "As mensagens da pessoa bloqueada não aparecerão mais no seu feed de notícias.",
- "search": "Publicações de pessoas bloqueadas desaparecem dos resultados da sua pesquisa."
- },
- "columns": {
- "name": "Nome",
- "slug": "Slug",
- "unmute": "Desbloquear"
- },
- "empty": "Até agora, você não bloqueou ninguém.",
- "how-to": "Você pode bloquear outros usuários em suas páginas de perfil através do menu de conteúdo.",
- "mute": "Bloquear usuário",
- "unmute": "Desbloquear usuário",
- "unmuted": "{name} está desbloqueado novamente"
- },
- "privacy": {
- "name": "Privacidade",
- "make-shouts-public": "Compartilhar postagens que eu recomendei no meu perfil público",
- "success-update": "Configurações de privacidade salvas"
- }
- },
- "admin": {
- "name": "Administração",
- "dashboard": {
- "name": "Painel de controle",
- "users": "Usuários",
- "posts": "Postagens",
- "comments": "Comentários",
- "notifications": "Notificações",
- "organizations": "Organizações",
- "projects": "Projetos",
- "invites": "Convites",
- "follows": "Segue",
- "shouts": "Aclamações"
- },
- "organizations": {
- "name": "Organizações"
- },
- "users": {
- "name": "Usuários",
- "form": {
- "placeholder": "e-mail, nome ou descrição"
- },
- "table": {
- "columns": {
- "number": "N.º",
- "name": "Nome",
- "email": "E-mail",
- "slug": "Slug",
- "role": "Função",
- "createdAt": "Criado em"
- }
- },
- "empty": "Nenhum usuário encontrado"
- },
- "pages": {
- "name": "Páginas"
- },
- "notifications": {
- "name": "Notificações"
- },
- "categories": {
- "name": "Categorias",
- "categoryName": "Nome",
- "postCount": "Postagens"
- },
- "tags": {
- "name": "Etiquetas",
- "tagCountUnique": "Usuários",
- "tagCount": "Postagens"
- },
- "settings": {
- "name": "Configurações"
- },
- "hashtags": {
- "name": "Hashtags",
- "number": "Não.",
- "nameOfHashtag": "Nome",
- "tagCountUnique": "Usuários",
- "tagCount": "Publicações"
- },
- "invites": {
- "name": "Convidar usuários",
- "title": "Convidar pessoas",
- "description": "Convites são uma maneira maravilhosa de ter seus amigos em sua rede …"
- },
- "donations": {
- "name": "Informações sobre Doações",
- "goal": "Doações mensais necessárias",
- "progress": "Doações arrecadadas até o momento",
- "successfulUpdate": "Informações sobre doações atualizadas com sucesso!"
- }
- },
- "post": {
- "name": "Postar",
- "moreInfo": {
- "name": "Mais informações",
- "title": "Mais informações",
- "description": "Aqui você pode encontrar mais informações sobre este tópico.",
- "titleOfCategoriesSection": "Categorias",
- "titleOfHashtagsSection": "Hashtags",
- "titleOfRelatedContributionsSection": "Publicações relacionadas"
- },
- "takeAction": {
- "name": "Tomar uma ação"
- },
- "pinned": "Anúncio",
- "menu": {
- "edit": "Editar publicação",
- "delete": "Excluir publicação",
- "pin": "Fixar publicação",
- "pinnedSuccessfully": "Publicação fixada com sucesso!",
- "unpin": "Desafixar publicação",
- "unpinnedSuccessfully": "Publicação desafixada com sucesso!"
- },
- "comment": {
- "submit": "Commentar",
- "submitted": "Comentário Enviado",
- "updated": "Alterações salvas"
- },
- "edited": "editado"
- },
- "quotes": {
- "african": {
- "quote": "Muitas pessoas pequenas, em muitos lugares pequenos, fazem muitas coisas pequenas, que podem mudar a face do mundo.",
- "author": "Provérbio africano"
- }
- },
- "common": {
- "post": "Postagem ::: Postagens",
- "comment": "Comentário ::: Comentários",
- "letsTalk": "Vamos Conversar",
- "versus": "Contra",
- "moreInfo": "Mais informações",
- "takeAction": "Tomar uma ação",
- "shout": "Aclamação ::: Aclamações",
- "user": "Usuário ::: Usuários",
- "category": "Categoria ::: Categorias",
- "organization": "Organização ::: Organizações",
- "project": "Projeto ::: Projetos",
- "tag": "Etiqueta ::: Etiquetas",
- "name": "Nome",
- "loadMore": "Carregar mais",
- "loading": "Carregando",
- "reportContent": "Denunciar",
- "validations": {
- "email": "deve ser um endereço de e-mail válido",
- "url": "deve ser uma URL válida",
- "categories": "devem ser seleccionadas, no mínimo uma e, no máximo três categorias"
- }
- },
- "actions": {
- "loading": "Carregando",
- "loadMore": "Carregar mais",
- "create": "Criar",
- "save": "Salvar",
- "edit": "Editar",
- "delete": "Apagar",
- "cancel": "Cancelar"
- },
- "moderation": {
- "name": "Moderação",
- "reports": {
- "empty": "Parabéns, nada a moderar.",
- "name": "Denúncias",
- "reporter": "Denunciado por",
- "submitter": "denunciado por",
- "disabledBy": "desativado por",
- "reasonCategory": "Categoria",
- "reasonDescription": "Descrição",
- "createdAt": "Data"
- }
- },
- "disable": {
- "user": {
- "title": "Desativar usuário",
- "type": "Usuário",
- "message": "Você realmente deseja desativar o usuário \" {name} <\/b> \"?"
- },
- "contribution": {
- "title": "Desativar Contribuição",
- "type": "Contribuição",
- "message": "Você realmente deseja desativar a contribuição \" {name} <\/b> \"?"
- },
- "comment": {
- "title": "Desativar comentário",
- "type": "Comentário",
- "message": "Você realmente deseja desativar o comentário de \" {name} <\/b> \"?"
- },
- "submit": "Desativar",
- "cancel": "Cancelar",
- "success": "Desativado com sucesso!"
- },
- "report": {
- "submit": "Enviar denúncia",
- "cancel": "Cancelar",
- "user": {
- "title": "Denunciar usuário",
- "type": "Usuário",
- "message": "Você realmente deseja denunciar o usuário \" {name} <\/b> \"?",
- "error": "Você já denunciou o usuário!"
- },
- "contribution": {
- "title": "Denunciar Contribuição",
- "type": "Contribuição",
- "message": "Você realmente deseja denunciar a contribuição \" {name} <\/b> \"?",
- "error": "Você já denunciou a contribuição!"
- },
- "comment": {
- "title": "Denunciar Comentário",
- "type": "Comentário",
- "message": "Você realmente deseja denunciar o comentário de \"{name}<\/b>\"?",
- "error": "Você já denunciou o comentário!"
- },
- "success": "Obrigado por denunciar!",
- "reason": {
- "category": {
- "label": "Selecione uma categoria:",
- "placeholder": "Categoria …",
- "options": {
- "discrimination_etc": "Mensagens, comentários, afirmações ou insultos discriminatórios.",
- "pornographic_content_links": "Publicação ou vinculação de material claramente pornográfico.",
- "glorific_trivia_of_cruel_inhuman_acts": "Glorificação ou banalização de atos de violência cruel ou desumana.",
- "doxing": "A divulgação de informações pessoais de terceiros sem o seu consentimento ou ameaça de (\"doxing\").",
- "intentional_intimidation_stalking_persecution": "Intimidação intencional, assédio ou perseguição.",
- "advert_products_services_commercial": "Publicidade de produtos e serviços com intenção comercial.",
- "criminal_behavior_violation_german_law": "Comportamento criminoso ou violação da lei alemã.",
- "other": "Outros …"
- },
- "invalid": "Selecione uma categoria válida"
- },
- "description": {
- "label": "Por favor, explique: Por que você gostaria de denunciar isso?",
- "placeholder": "Informações adicionais …"
- }
- }
- },
- "contribution": {
- "edit": "Editar Contribuição",
- "delete": "Apagar Contribuição",
- "title": "Título",
- "newPost": "Criar uma nova publicação",
- "filterFollow": "Filtrar contribuições de usuários que eu sigo",
- "filterALL": "Ver todas as contribuições",
- "success": "Salvo!",
- "languageSelectLabel": "Idioma",
- "categories": {
- "infoSelectedNoOfMaxCategories": "{chosen} of {max} categorias selecionadas"
- },
- "emotions-label": {
- "funny": "Engraçado",
- "happy": "Feliz",
- "surprised": "Surpreso",
- "cry": "Chorando",
- "angry": "Irritado"
- },
- "category": {
- "name": {
- "freedom-of-speech": "Liberdade de expressão",
- "consumption-sustainability": "Consumo e Sustentabilidade",
- "global-peace-nonviolence": "Paz Mundial e Não-Violência",
- "just-for-fun": "Só por diversão",
- "happiness-values": "Felicidade e Valores",
- "health-wellbeing": "Saúde e Bem-estar",
- "environment-nature": "Meio Ambiente e Natureza",
- "animal-protection": "Proteção Animal",
- "human-rights-justice": "Direitos Humanos e Justiça",
- "education-sciences": "Educação e Ciências",
- "cooperation-development": "Cooperação e Desenvolvimento",
- "democracy-politics": "Democracia e Política",
- "economy-finances": "Economia e Finanças",
- "energy-technology": "Energia e tecnologia",
- "it-internet-data-privacy": "TI, Internet e Privacidade de Dados",
- "art-culture-sport": "Arte, Cultura e Esporte"
- }
- },
- "teaserImage": {
- "cropperConfirm": "Confirmar"
- },
- "languageSelectText": "Selecionar Idioma"
- },
- "comment": {
- "edit": "Editar Comentário",
- "delete": "Apagar Comentário",
- "content": {
- "unavailable-placeholder": "…esse comentário não está mais disponível"
- },
- "menu": {
- "edit": "Editar Comentário",
- "delete": "Apagar Comentário"
- },
- "show": {
- "more": "mostrar mais",
- "less": "mostrar menos"
- },
- "edited": "editado"
- },
- "followButton": {
- "follow": "Seguir",
- "following": "Seguindo"
- },
- "shoutButton": {
- "shouted": "aclamou"
- },
- "search": {
- "placeholder": "Buscar",
- "hint": "O que você está buscando?",
- "failed": "Nada encontrado"
- },
- "components": {
- "password-reset": {
- "request": {
- "title": "Redefinir sua senha",
- "form": {
- "description": "Um e-mail de redefinição de senha será enviado ao endereço de e-mail fornecido.",
- "submit": "Solicitar e-mail",
- "submitted": "Um e-mail com mais instruções foi enviado para {email}<\/b>"
- }
- },
- "change-password": {
- "success": "A alteração da sua senha foi bem-sucedida!",
- "error": "A alteração da sua senha falhou. Talvez o código de segurança não estava correto?",
- "help": "Em caso de problemas, sinta-se à vontade para pedir ajuda, enviando um e-mail para:"
- }
- },
- "enter-nonce": {
- "form": {
- "nonce": "Digite seu código",
- "description": "Abra a sua caixa de entrada e digite o código que lhe enviamos.",
- "next": "Continue",
- "validations": {
- "length": "deve ter 6 caracteres"
- }
- }
- },
- "registration": {
- "signup": {
- "unavailable": "Infelizmente, o registo público para usuário não está disponível neste servidor.",
- "title": "Junte-se à Human Connection!",
- "form": {
- "description": "Para começar, digite seu endereço de e-mail:",
- "terms-and-condition": "Eu concordo com os Termos e condições<\/ds-text><\/a>.",
- "data-privacy": "Eu li e entendi o Política de Privacidade<\/ds-text><\/a> ",
- "minimum-age": "Tenho 18 anos ou mais.",
- "invitation-code": "O seu código de convite é: {code}<\/b>",
- "errors": {
- "email-exists": "Já existe uma conta de usuário com este endereço de e-mail!",
- "invalid-invitation-token": "Parece que o convite já foi usado. Os links para convites só podem ser usados uma vez."
- },
- "submit": "Criar uma conta",
- "success": "Um e-mail com um link para completar o seu registo foi enviado para {email}<\/b>"
- }
- },
- "create-user-account": {
- "title": "Criar uma conta de usuário",
- "success": "A sua conta foi criada!",
- "error": "Nenhuma conta de usuário pode ser criada!",
- "help": " Talvez a confirmação tenha sido inválida? Em caso de problemas, sinta-se à vontade para pedir ajuda, enviando um e-mail para:"
- }
- }
- },
- "store": {
- "posts": {
- "orderBy": {
- "newest": {
- "label": "Mais recentes"
- },
- "oldest": {
- "label": "Mais antigos"
- }
- }
- }
- },
- "maintenance": {
- "title": "Human Connection está em manutenção",
- "explanation": "No momento estamos em manutenção, por favor tente novamente mais tarde.",
- "questions": "Qualquer dúvida, envie um e-mail para"
- },
- "index": {
- "no-results": "Nenhuma contribuição encontrada.",
- "change-filter-settings": "Altere suas configurações de filtro para obter mais resultados."
- },
- "filter-menu": {
- "title": "Sua bolha de filtro",
- "hashtag-search": "Procurando por #{hashtag}",
- "clearSearch": "Limpar pesquisa"
- },
- "filter-posts": {
- "categories": {
- "header": "Categorias de Conteúdo",
- "all": "Todos"
- },
- "general": {
- "header": "Filtrar por …"
- },
- "followers": {
- "label": "Usuários que eu sigo"
- },
- "language": {
- "header": "Idiomas",
- "all": "Todos"
- }
- },
- "site": {
- "thanks": "Obrigado(a)!",
- "error-occurred": "Ocorreu um erro.",
- "made": "Feito com ❤",
- "imprint": "Impressão",
- "termsAndConditions": "Termos e Condições",
- "data-privacy": "Proteção de Dados",
- "contact": "Contato",
- "tribunal": "tribunal de registo",
- "register": "número de registo",
- "director": "Diretor Administrativo",
- "taxident": "Número de identificação do imposto sobre o valor acrescentado de acordo com o § 27 da Lei do Imposto sobre o Valor Acrescentado (Alemanha)",
- "responsible": "Responsável segundo § 55 Abs. 2 RStV (Alemanha) ",
- "bank": "conta bancária",
- "germany": "Alemanha",
- "code-of-conduct": "Codigo de Conduto",
- "back-to-login": "Voltar para o Login",
- "faq": "FAQ"
- },
- "editor": {
- "placeholder": " Escreva algo inspirador…",
- "mention": {
- "noUsersFound": "Nenhum usuário encontrado"
- },
- "hashtag": {
- "noHashtagsFound": "Nenhuma hashtag encontrada",
- "addHashtag": "Nova hashtag",
- "addLetter": "Digite uma letra"
- },
- "embed": {
- "data_privacy_warning": "Aviso de Privacidade de Dados!",
- "data_privacy_info": "Seus dados ainda não foram compartilhados com terceiros. Se continuar assistindo este vídeo, o seguinte fornecedor irá provavelmente recolher dados do utilizador:",
- "play_now": "Assista agora",
- "always_allow": "Sempre permita conteúdo incorporado por provedores de terceiros (esta configuração pode ser alterada a qualquer momento)"
- }
- },
- "notifications": {
- "reason": {
- "mentioned_in_post": "Mencinou você em um post …",
- "mentioned_in_comment": "Mentionou você em um comentário …",
- "commented_on_post": "Comentou no seu post …"
- },
- "comment": "Comentário",
- "title": "Notificações",
- "pageLink": "Todas as notificações",
- "post": "Post",
- "user": "Usuário",
- "content": "Conteúdo",
- "filterLabel": {
- "all": "Todos",
- "read": "Lido",
- "unread": "Não lido"
- },
- "empty": "Desculpe, não tem nenhuma notificação neste momento."
- },
- "delete": {
- "submit": "Excluir",
- "cancel": "Cancelar",
- "contribution": {
- "title": "Excluir publicação",
- "type": "Contribuição",
- "message": "Você realmente deseja excluir a publicação \"{name}<\/b>\"?",
- "success": "Publicação excluída com êxito!"
- },
- "comment": {
- "title": "Excluir Comentário",
- "type": "Comentário",
- "message": "Você realmente deseja excluir o comentário \"{name}<\/b>\"?",
- "success": "Comentário excluído com sucesso!"
- }
- },
- "release": {
- "submit": "Liberar",
- "cancel": "Cancelar",
- "success": "Liberado com sucesso!",
- "user": {
- "title": "Liberar usuário",
- "type": "Usuário",
- "message": "Você realmente quer liberar o usuário \"{name}<\/b>\"?",
- "error": "Você já denunciou o usuário!"
- },
- "contribution": {
- "title": "Liberar contribuição ",
- "type": "Contribuição",
- "message": "Você realmente quer liberar a contribuição \"{name}<\/b>\"?",
- "error": "Você já denunciou a contribuição!"
- },
- "comment": {
- "title": "Liberar Comentário ",
- "type": "Comentário",
- "message": "Você realmente quer liberar o comentário de \"{name}<\/b>\"?",
- "error": "Você já denunciou o comentário!"
- }
- },
- "user": {
- "avatar": {
- "submitted": "Carregado com sucesso!"
- }
- },
- "code-of-conduct": {
- "subheader": "para a rede social da Human Connection gGmbH",
- "preamble": {
- "title": "Introdução",
- "description": "A Human Connection é uma rede de conhecimento e ação social sem fins lucrativos da próxima geração. Feito por pessoas - para pessoas. Open Source, justo e transparente. Para uma mudança local e global positiva em todas as áreas da vida. Redesenhamos completamente a troca pública de conhecimentos, idéias e projetos. As funções da Human Connection reúnem as pessoas - offline e online - para que possamos fazer do mundo um lugar melhor."
- },
- "purpose": {
- "title": "Propósito",
- "description": "Com este código de conduta, regulamentamos os princípios essenciais para o comportamento em nossa rede social. A Carta dos Direitos Humanos das Nações Unidas é a nossa orientação e forma o coração da nossa compreensão dos valores. O código de conduta serve como princípios orientadores para a nossa aparência pessoal e interação uns com os outros. Qualquer pessoa ativa como usuário da Human Connection Network, que escreve artigos, comentários ou se conecta com outros usuários, incluindo aqueles fora da rede, reconhece estas regras de conduta como obrigatórias."
- },
- "expected-behaviour": {
- "title": "Comportamentos esperados",
- "description": "Os seguintes comportamentos são esperados e solicitados a todos os membros da comunidade:",
- "list": {
- "0": "Exercitar ponderação e respeito no seu discurso e ações.",
- "1": "Tente a colaboração antes do conflito.",
- "2": "Evite comportamentos e discursos humilhantes, discriminatórios ou assediadores.",
- "3": "Esteja atento ao que o rodeia e aos outros participantes. Alerte os líderes comunitários se você perceber uma situação perigosa, alguém em perigo ou violações deste Código de Conduta, mesmo que pareçam inconsequentes."
- }
- },
- "unacceptable-behaviour": {
- "title": "Comportamentos Inaceitáveis",
- "description": "Os seguintes comportamentos são inaceitáveis dentro da nossa comunidade:",
- "list": {
- "0": "Mensagens, comentários, afirmações ou insultos discriminatórios, particularmente aqueles relacionados a gênero, orientação sexual, raça, religião, orientação política ou filosófica ou deficiência.",
- "1": "Publicar ou vincular material claramente pornográfico.",
- "2": "Glorificação ou banalização de atos de violência cruel ou desumana.",
- "3": "A divulgação de informações pessoais de terceiros sem o seu consentimento ou ameaça de (\"doxing\").",
- "4": "Intimidação intencional, assédio ou perseguição.",
- "5": "Publicidade de produtos e serviços com intenção comercial.",
- "6": "Comportamento criminoso ou violação da lei alemã.",
- "7": "Apoiar ou incentivar tal conduta."
- }
- },
- "consequences": {
- "title": "Consequências de um comportamento inaceitável",
- "description": "Se um membro da comunidade apresentar um comportamento inaceitável, os operadores, moderadores e administradores responsáveis da rede podem tomar medidas adequadas, incluindo, entre outras:",
- "list": {
- "0": "Pedido de suspensão imediata de uma conduta inaceitável",
- "1": "Bloquear ou excluir comentários",
- "2": "Exclusão temporária da respectiva publicação ou contribuição",
- "3": "Bloquear ou eliminar conteúdo",
- "4": "Retirada temporária de permissão de escrita",
- "5": "Exclusão temporária da rede",
- "6": "Exclusão definitiva da rede",
- "7": "Violações da lei alemã podem ser denunciadas"
- }
- },
- "get-help": "Se você for vítima ou testemunhar um comportamento inaceitável, ou tiver qualquer outra preocupação, por favor notifique um organizador da comunidade o mais rápido possível e inclua o link ou mencione o conteúdo correspondente:"
- },
- "termsAndConditions": {
- "newTermsAndConditions": "Novos Termos e Condições",
- "termsAndConditionsConfirmed": "Eu li e confirmei os Terms and Conditions<\/a>.",
- "termsAndConditionsNewConfirmText": "Por favor, leia os novos termos de uso agora!",
- "termsAndConditionsNewConfirm": "Eu li e concordo com os novos termos de condições.",
- "agree": "Eu concordo!",
- "terms-of-service": {
- "title": "Termos do Serviço",
- "description": "As seguintes condições de utilização constituem a base para a utilização da nossa rede. Ao registar-se, deve aceitar os termos de utilização e informaremos mais tarde sobre quaisquer alterações que possam ocorrer. A Human Connection Network é operada na Alemanha e, portanto, está sujeita à lei alemã. O local de jurisdição é Kirchheim \/ Teck. Para mais detalhes, veja a nossa impressão: https:\/\/human-connection.org\/imprint<\/a> "
- },
- "use-and-license": {
- "title": "Uso e Licença",
- "description": "Se qualquer conteúdo que você publicar para nós for protegido por direitos de propriedade intelectual, você nos concede uma licença não exclusiva, transferível, sublicenciável e mundial para usar tal conteúdo para postar em nossa rede. Esta licença expira quando você exclui seu conteúdo ou toda a sua conta. Lembre-se de que outros podem compartilhar seu conteúdo e nós não podemos excluí-lo."
- },
- "privacy-statement": {
- "title": "Política de Privacidade",
- "description": "Nossa rede é uma rede social de conhecimento e ação. Portanto, é particularmente importante para nós que o máximo de conteúdo possível seja acessível ao público. No decurso do desenvolvimento da nossa rede, haverá cada vez mais a possibilidade de decidir sobre a visibilidade dos dados pessoais. Iremos informá-lo sobre estas novas funcionalidades. Caso contrário, você deve sempre pensar sobre quais dados pessoais você divulga sobre si mesmo (ou outros). Isto aplica-se em particular ao conteúdo das mensagens e comentários, uma vez que estes têm um carácter largamente público. Mais tarde, haverá possibilidades de limitar a visibilidade do seu perfil. Parte dos termos de serviço é a nossa declaração de privacidade, que o informa sobre as operações individuais de processamento de dados na nossa rede: https:\/\/human-connection.org\/datenschutz\/#netzwerk<\/a> bzw. https:\/\/human-connection.org\/datenschutz\/<\/a> Nossa declaração de privacidade é adaptada à situação legal e às características de nossa rede e é sempre válida na versão mais atual."
- },
- "code-of-conduct": {
- "title": "Código de Conduta",
- "description": "Nosso código de conduta serve como um manual de aparência pessoal e interação entre si. Quem quer que seja ativo como utilizador na rede Human Connection, escreva artigos, comentários ou faça contato com outros utilizadores, mesmo fora da rede, reconhece estas regras de conduta como sendo vinculativas. https:\/\/alpha.human-connection.org\/code-of-conduct<\/a>"
- },
- "moderation": {
- "title": "Moderação",
- "description": "Até que nossas possibilidades financeiras nos permitam implementar o sistema de moderação comunitária, moderamos com um sistema simplificado e com pessoal próprio ou possivelmente voluntário. Nós treinamos esses moderadores e por isso só eles tomam as decisões apropriadas. Estes moderadores realizam o seu trabalho de forma anônima. Você pode denunciar mensagens, comentários e usuários para nós (por exemplo, se eles fornecem informações em seu perfil ou têm imagens que violam estes Termos de Uso). Se você relatar algo para nós, você precisa dar uma razão e pode dar uma breve explicação. Em seguida, analisaremos o que você denunciou e o sancionaremos, se necessário, por exemplo, bloqueando contribuições, comentários ou usuários. Infelizmente, você e a pessoa em questão não receberão qualquer feedback da nossa parte neste momento, mas isto está na fase de planeamento. Independentemente disso, reservamo-nos o direito de impor sanções em princípio por razões que podem ou não estar listadas no nosso Código de Conduta ou nestes termos de serviço."
- },
- "errors-and-feedback": {
- "title": "Erros e Feedback",
- "description": "Fazemos todos os esforços para manter a nossa rede e dados seguros e disponíveis. Cada nova versão do software passa por testes automatizados e manuais. No entanto, podem ocorrer erros imprevistos. Portanto, somos gratos por quaisquer erros reportados. Você é bem-vindo para relatar quaisquer erros que você descobrir enviando um e-mail para o Suporte em support@human-connection.org."
- },
- "help-and-questions": {
- "title": "Ajuda e Perguntas",
- "description": "Para ajuda e perguntas, nós compilamos uma coleção abrangente de perguntas e respostas frequentes (FAQ) para você. Você pode encontrá-las aqui: https:\/\/support.human-connection.org\/kb\/ <\/a>"
- },
- "addition": {
- "title": "Além disso, realizamos regularmente eventos onde você também pode compartilhar suas impressões e fazer perguntas. Você pode encontrar uma visão geral atual aqui:",
- "description": " https:\/\/human-connection.org\/events\/ <\/a>"
- }
+ "dashboard": {
+ "comments": "Comentários",
+ "follows": "Segue",
+ "invites": "Convites",
+ "name": "Painel de controle",
+ "notifications": "Notificações",
+ "organizations": "Organizações",
+ "posts": "Postagens",
+ "projects": "Projetos",
+ "shouts": "Aclamações",
+ "users": "Usuários"
},
"donations": {
- "donations-for": "Doações para",
- "donate-now": "Doe agora",
- "amount-of-total": "{amount} dos {total} € foram coletados"
+ "goal": "Doações mensais necessárias",
+ "name": "Informações sobre Doações",
+ "progress": "Doações arrecadadas até o momento",
+ "successfulUpdate": "Informações sobre doações atualizadas com sucesso!"
+ },
+ "hashtags": {
+ "name": "Hashtags",
+ "nameOfHashtag": "Nome",
+ "number": "Não.",
+ "tagCount": "Publicações",
+ "tagCountUnique": "Usuários"
+ },
+ "invites": {
+ "description": "Convites são uma maneira maravilhosa de ter seus amigos em sua rede …",
+ "name": "Convidar usuários",
+ "title": "Convidar pessoas"
+ },
+ "name": "Administração",
+ "notifications": {
+ "name": "Notificações"
+ },
+ "organizations": {
+ "name": "Organizações"
+ },
+ "pages": {
+ "name": "Páginas"
+ },
+ "settings": {
+ "name": "Configurações"
+ },
+ "tags": {
+ "name": "Etiquetas",
+ "tagCount": "Postagens",
+ "tagCountUnique": "Usuários"
+ },
+ "users": {
+ "empty": "Nenhum usuário encontrado",
+ "form": {
+ "placeholder": "e-mail, nome ou descrição"
+ },
+ "name": "Usuários",
+ "table": {
+ "columns": {
+ "createdAt": "Criado em",
+ "email": "E-mail",
+ "name": "Nome",
+ "number": "N.º",
+ "role": "Função",
+ "slug": "Slug"
+ }
+ }
}
+ },
+ "code-of-conduct": {
+ "consequences": {
+ "description": "Se um membro da comunidade apresentar um comportamento inaceitável, os operadores, moderadores e administradores responsáveis da rede podem tomar medidas adequadas, incluindo, entre outras:",
+ "list": {
+ "0": "Pedido de suspensão imediata de uma conduta inaceitável",
+ "1": "Bloquear ou excluir comentários",
+ "2": "Exclusão temporária da respectiva publicação ou contribuição",
+ "3": "Bloquear ou eliminar conteúdo",
+ "4": "Retirada temporária de permissão de escrita",
+ "5": "Exclusão temporária da rede",
+ "6": "Exclusão definitiva da rede",
+ "7": "Violações da lei alemã podem ser denunciadas"
+ },
+ "title": "Consequências de um comportamento inaceitável"
+ },
+ "expected-behaviour": {
+ "description": "Os seguintes comportamentos são esperados e solicitados a todos os membros da comunidade:",
+ "list": {
+ "0": "Exercitar ponderação e respeito no seu discurso e ações.",
+ "1": "Tente a colaboração antes do conflito.",
+ "2": "Evite comportamentos e discursos humilhantes, discriminatórios ou assediadores.",
+ "3": "Esteja atento ao que o rodeia e aos outros participantes. Alerte os líderes comunitários se você perceber uma situação perigosa, alguém em perigo ou violações deste Código de Conduta, mesmo que pareçam inconsequentes."
+ },
+ "title": "Comportamentos esperados"
+ },
+ "get-help": "Se você for vítima ou testemunhar um comportamento inaceitável, ou tiver qualquer outra preocupação, por favor notifique um organizador da comunidade o mais rápido possível e inclua o link ou mencione o conteúdo correspondente:",
+ "preamble": {
+ "description": "A Human Connection é uma rede de conhecimento e ação social sem fins lucrativos da próxima geração. Feito por pessoas - para pessoas. Open Source, justo e transparente. Para uma mudança local e global positiva em todas as áreas da vida. Redesenhamos completamente a troca pública de conhecimentos, idéias e projetos. As funções da Human Connection reúnem as pessoas - offline e online - para que possamos fazer do mundo um lugar melhor.",
+ "title": "Introdução"
+ },
+ "purpose": {
+ "description": "Com este código de conduta, regulamentamos os princípios essenciais para o comportamento em nossa rede social. A Carta dos Direitos Humanos das Nações Unidas é a nossa orientação e forma o coração da nossa compreensão dos valores. O código de conduta serve como princípios orientadores para a nossa aparência pessoal e interação uns com os outros. Qualquer pessoa ativa como usuário da Human Connection Network, que escreve artigos, comentários ou se conecta com outros usuários, incluindo aqueles fora da rede, reconhece estas regras de conduta como obrigatórias.",
+ "title": "Propósito"
+ },
+ "subheader": "para a rede social da Human Connection gGmbH",
+ "unacceptable-behaviour": {
+ "description": "Os seguintes comportamentos são inaceitáveis dentro da nossa comunidade:",
+ "list": {
+ "0": "Mensagens, comentários, afirmações ou insultos discriminatórios, particularmente aqueles relacionados a gênero, orientação sexual, raça, religião, orientação política ou filosófica ou deficiência.",
+ "1": "Publicar ou vincular material claramente pornográfico.",
+ "2": "Glorificação ou banalização de atos de violência cruel ou desumana.",
+ "3": "A divulgação de informações pessoais de terceiros sem o seu consentimento ou ameaça de (\"doxing\").",
+ "4": "Intimidação intencional, assédio ou perseguição.",
+ "5": "Publicidade de produtos e serviços com intenção comercial.",
+ "6": "Comportamento criminoso ou violação da lei alemã.",
+ "7": "Apoiar ou incentivar tal conduta."
+ },
+ "title": "Comportamentos Inaceitáveis"
+ }
+ },
+ "comment": {
+ "content": {
+ "unavailable-placeholder": "…esse comentário não está mais disponível"
+ },
+ "delete": "Apagar Comentário",
+ "edit": "Editar Comentário",
+ "edited": "editado",
+ "menu": {
+ "delete": "Apagar Comentário",
+ "edit": "Editar Comentário"
+ },
+ "show": {
+ "less": "mostrar menos",
+ "more": "mostrar mais"
+ }
+ },
+ "common": {
+ "category": "Categoria ::: Categorias",
+ "comment": "Comentário ::: Comentários",
+ "letsTalk": "Vamos Conversar",
+ "loading": "Carregando",
+ "loadMore": "Carregar mais",
+ "moreInfo": "Mais informações",
+ "name": "Nome",
+ "organization": "Organização ::: Organizações",
+ "post": "Postagem ::: Postagens",
+ "project": "Projeto ::: Projetos",
+ "reportContent": "Denunciar",
+ "shout": "Aclamação ::: Aclamações",
+ "tag": "Etiqueta ::: Etiquetas",
+ "takeAction": "Tomar uma ação",
+ "user": "Usuário ::: Usuários",
+ "validations": {
+ "categories": "devem ser seleccionadas, no mínimo uma e, no máximo três categorias",
+ "email": "deve ser um endereço de e-mail válido",
+ "url": "deve ser uma URL válida"
+ },
+ "versus": "Contra"
+ },
+ "components": {
+ "enter-nonce": {
+ "form": {
+ "description": "Abra a sua caixa de entrada e digite o código que lhe enviamos.",
+ "next": "Continue",
+ "nonce": "Digite seu código",
+ "validations": {
+ "length": "deve ter 6 caracteres"
+ }
+ }
+ },
+ "password-reset": {
+ "change-password": {
+ "error": "A alteração da sua senha falhou. Talvez o código de segurança não estava correto?",
+ "help": "Em caso de problemas, sinta-se à vontade para pedir ajuda, enviando um e-mail para:",
+ "success": "A alteração da sua senha foi bem-sucedida!"
+ },
+ "request": {
+ "form": {
+ "description": "Um e-mail de redefinição de senha será enviado ao endereço de e-mail fornecido.",
+ "submit": "Solicitar e-mail",
+ "submitted": "Um e-mail com mais instruções foi enviado para {email}"
+ },
+ "title": "Redefinir sua senha"
+ }
+ },
+ "registration": {
+ "create-user-account": {
+ "error": "Nenhuma conta de usuário pode ser criada!",
+ "help": " Talvez a confirmação tenha sido inválida? Em caso de problemas, sinta-se à vontade para pedir ajuda, enviando um e-mail para:",
+ "success": "A sua conta foi criada!",
+ "title": "Criar uma conta de usuário"
+ },
+ "signup": {
+ "form": {
+ "data-privacy": "Eu li e entendi o Política de Privacidade ",
+ "description": "Para começar, digite seu endereço de e-mail:",
+ "errors": {
+ "email-exists": "Já existe uma conta de usuário com este endereço de e-mail!",
+ "invalid-invitation-token": "Parece que o convite já foi usado. Os links para convites só podem ser usados uma vez."
+ },
+ "invitation-code": "O seu código de convite é: {code}",
+ "minimum-age": "Tenho 18 anos ou mais.",
+ "submit": "Criar uma conta",
+ "success": "Um e-mail com um link para completar o seu registo foi enviado para {email}",
+ "terms-and-condition": "Eu concordo com os Termos e condições."
+ },
+ "title": "Junte-se à Human Connection!",
+ "unavailable": "Infelizmente, o registo público para usuário não está disponível neste servidor."
+ }
+ }
+ },
+ "contribution": {
+ "categories": {
+ "infoSelectedNoOfMaxCategories": "{chosen} of {max} categorias selecionadas"
+ },
+ "category": {
+ "name": {
+ "animal-protection": "Proteção Animal",
+ "art-culture-sport": "Arte, Cultura e Esporte",
+ "consumption-sustainability": "Consumo e Sustentabilidade",
+ "cooperation-development": "Cooperação e Desenvolvimento",
+ "democracy-politics": "Democracia e Política",
+ "economy-finances": "Economia e Finanças",
+ "education-sciences": "Educação e Ciências",
+ "energy-technology": "Energia e tecnologia",
+ "environment-nature": "Meio Ambiente e Natureza",
+ "freedom-of-speech": "Liberdade de expressão",
+ "global-peace-nonviolence": "Paz Mundial e Não-Violência",
+ "happiness-values": "Felicidade e Valores",
+ "health-wellbeing": "Saúde e Bem-estar",
+ "human-rights-justice": "Direitos Humanos e Justiça",
+ "it-internet-data-privacy": "TI, Internet e Privacidade de Dados",
+ "just-for-fun": "Só por diversão"
+ }
+ },
+ "delete": "Apagar Contribuição",
+ "edit": "Editar Contribuição",
+ "emotions-label": {
+ "angry": "Irritado",
+ "cry": "Chorando",
+ "funny": "Engraçado",
+ "happy": "Feliz",
+ "surprised": "Surpreso"
+ },
+ "filterALL": "Ver todas as contribuições",
+ "filterFollow": "Filtrar contribuições de usuários que eu sigo",
+ "languageSelectLabel": "Idioma",
+ "languageSelectText": "Selecionar Idioma",
+ "newPost": "Criar uma nova publicação",
+ "success": "Salvo!",
+ "teaserImage": {
+ "cropperConfirm": "Confirmar"
+ },
+ "title": "Título"
+ },
+ "delete": {
+ "cancel": "Cancelar",
+ "comment": {
+ "message": "Você realmente deseja excluir o comentário \"{name}\"?",
+ "success": "Comentário excluído com sucesso!",
+ "title": "Excluir Comentário",
+ "type": "Comentário"
+ },
+ "contribution": {
+ "message": "Você realmente deseja excluir a publicação \"{name}\"?",
+ "success": "Publicação excluída com êxito!",
+ "title": "Excluir publicação",
+ "type": "Contribuição"
+ },
+ "submit": "Excluir"
+ },
+ "disable": {
+ "cancel": "Cancelar",
+ "comment": {
+ "message": "Você realmente deseja desativar o comentário de \" {name} \"?",
+ "title": "Desativar comentário",
+ "type": "Comentário"
+ },
+ "contribution": {
+ "message": "Você realmente deseja desativar a contribuição \" {name} \"?",
+ "title": "Desativar Contribuição",
+ "type": "Contribuição"
+ },
+ "submit": "Desativar",
+ "success": "Desativado com sucesso!",
+ "user": {
+ "message": "Você realmente deseja desativar o usuário \" {name} \"?",
+ "title": "Desativar usuário",
+ "type": "Usuário"
+ }
+ },
+ "donations": {
+ "amount-of-total": "{amount} dos {total} € foram coletados",
+ "donate-now": "Doe agora",
+ "donations-for": "Doações para"
+ },
+ "editor": {
+ "embed": {
+ "always_allow": "Sempre permita conteúdo incorporado por provedores de terceiros (esta configuração pode ser alterada a qualquer momento)",
+ "data_privacy_info": "Seus dados ainda não foram compartilhados com terceiros. Se continuar assistindo este vídeo, o seguinte fornecedor irá provavelmente recolher dados do utilizador:",
+ "data_privacy_warning": "Aviso de Privacidade de Dados!",
+ "play_now": "Assista agora"
+ },
+ "hashtag": {
+ "addHashtag": "Nova hashtag",
+ "addLetter": "Digite uma letra",
+ "noHashtagsFound": "Nenhuma hashtag encontrada"
+ },
+ "mention": {
+ "noUsersFound": "Nenhum usuário encontrado"
+ },
+ "placeholder": " Escreva algo inspirador…"
+ },
+ "filter-menu": {
+ "clearSearch": "Limpar pesquisa",
+ "hashtag-search": "Procurando por #{hashtag}",
+ "title": "Sua bolha de filtro"
+ },
+ "filter-posts": {
+ "categories": {
+ "all": "Todos",
+ "header": "Categorias de Conteúdo"
+ },
+ "followers": {
+ "label": "Usuários que eu sigo"
+ },
+ "general": {
+ "header": "Filtrar por …"
+ },
+ "language": {
+ "all": "Todos",
+ "header": "Idiomas"
+ }
+ },
+ "followButton": {
+ "follow": "Seguir",
+ "following": "Seguindo"
+ },
+ "index": {
+ "change-filter-settings": "Altere suas configurações de filtro para obter mais resultados.",
+ "no-results": "Nenhuma contribuição encontrada."
+ },
+ "login": {
+ "copy": "Se você já tem uma conta no Human Connection, entre aqui.",
+ "email": "Seu email",
+ "failure": "Endereço de e-mail ou senha incorretos.",
+ "forgotPassword": "Esqueceu a sua senha?",
+ "hello": "Olá",
+ "login": "Entrar",
+ "logout": "Sair",
+ "moreInfo": "O que é a Human Connection?",
+ "moreInfoHint": "para a página de apresentação",
+ "moreInfoURL": "https://human-connection.org/en/",
+ "no-account": "Ainda não tem uma conta?",
+ "password": "Sua senha",
+ "register": "Cadastrar-se",
+ "success": "Você está conectado!"
+ },
+ "maintenance": {
+ "explanation": "No momento estamos em manutenção, por favor tente novamente mais tarde.",
+ "questions": "Qualquer dúvida, envie um e-mail para",
+ "title": "Human Connection está em manutenção"
+ },
+ "moderation": {
+ "name": "Moderação",
+ "reports": {
+ "createdAt": "Data",
+ "disabledBy": "desativado por",
+ "empty": "Parabéns, nada a moderar.",
+ "name": "Denúncias",
+ "reasonCategory": "Categoria",
+ "reasonDescription": "Descrição",
+ "reporter": "Denunciado por",
+ "submitter": "denunciado por"
+ }
+ },
+ "notifications": {
+ "comment": "Comentário",
+ "content": "Conteúdo",
+ "empty": "Desculpe, não tem nenhuma notificação neste momento.",
+ "filterLabel": {
+ "all": "Todos",
+ "read": "Lido",
+ "unread": "Não lido"
+ },
+ "pageLink": "Todas as notificações",
+ "post": "Post",
+ "reason": {
+ "commented_on_post": "Comentou no seu post …",
+ "mentioned_in_comment": "Mentionou você em um comentário …",
+ "mentioned_in_post": "Mencinou você em um post …"
+ },
+ "title": "Notificações",
+ "user": "Usuário"
+ },
+ "post": {
+ "comment": {
+ "submit": "Commentar",
+ "submitted": "Comentário Enviado",
+ "updated": "Alterações salvas"
+ },
+ "edited": "editado",
+ "menu": {
+ "delete": "Excluir publicação",
+ "edit": "Editar publicação",
+ "pin": "Fixar publicação",
+ "pinnedSuccessfully": "Publicação fixada com sucesso!",
+ "unpin": "Desafixar publicação",
+ "unpinnedSuccessfully": "Publicação desafixada com sucesso!"
+ },
+ "moreInfo": {
+ "description": "Aqui você pode encontrar mais informações sobre este tópico.",
+ "name": "Mais informações",
+ "title": "Mais informações",
+ "titleOfCategoriesSection": "Categorias",
+ "titleOfHashtagsSection": "Hashtags",
+ "titleOfRelatedContributionsSection": "Publicações relacionadas"
+ },
+ "name": "Postar",
+ "pinned": "Anúncio",
+ "takeAction": {
+ "name": "Tomar uma ação"
+ }
+ },
+ "profile": {
+ "commented": "Comentou",
+ "follow": "Seguir",
+ "followers": "Seguidores",
+ "following": "Seguindo",
+ "invites": {
+ "description": "Digite o endereço de e-mail para o convite.",
+ "emailPlaceholder": "E-mail para convidar",
+ "title": "Convidar alguém para Human Connection!"
+ },
+ "memberSince": "Membro desde",
+ "name": "Meu perfil",
+ "network": {
+ "andMore": "e {number} mais …",
+ "followedBy": "é seguido por:",
+ "followedByNobody": "não é seguido por ninguém.",
+ "following": "está seguindo:",
+ "followingNobody": "não segue ninguém.",
+ "title": "Rede"
+ },
+ "shouted": "Aclamou",
+ "socialMedia": "Onde mais posso encontrar",
+ "userAnonym": "Anonymous"
+ },
+ "quotes": {
+ "african": {
+ "author": "Provérbio africano",
+ "quote": "Muitas pessoas pequenas, em muitos lugares pequenos, fazem muitas coisas pequenas, que podem mudar a face do mundo."
+ }
+ },
+ "release": {
+ "cancel": "Cancelar",
+ "comment": {
+ "error": "Você já denunciou o comentário!",
+ "message": "Você realmente quer liberar o comentário de \"{name}\"?",
+ "title": "Liberar Comentário ",
+ "type": "Comentário"
+ },
+ "contribution": {
+ "error": "Você já denunciou a contribuição!",
+ "message": "Você realmente quer liberar a contribuição \"{name}\"?",
+ "title": "Liberar contribuição ",
+ "type": "Contribuição"
+ },
+ "submit": "Liberar",
+ "success": "Liberado com sucesso!",
+ "user": {
+ "error": "Você já denunciou o usuário!",
+ "message": "Você realmente quer liberar o usuário \"{name}\"?",
+ "title": "Liberar usuário",
+ "type": "Usuário"
+ }
+ },
+ "report": {
+ "cancel": "Cancelar",
+ "comment": {
+ "error": "Você já denunciou o comentário!",
+ "message": "Você realmente deseja denunciar o comentário de \"{name}\"?",
+ "title": "Denunciar Comentário",
+ "type": "Comentário"
+ },
+ "contribution": {
+ "error": "Você já denunciou a contribuição!",
+ "message": "Você realmente deseja denunciar a contribuição \" {name} \"?",
+ "title": "Denunciar Contribuição",
+ "type": "Contribuição"
+ },
+ "reason": {
+ "category": {
+ "invalid": "Selecione uma categoria válida",
+ "label": "Selecione uma categoria:",
+ "options": {
+ "advert_products_services_commercial": "Publicidade de produtos e serviços com intenção comercial.",
+ "criminal_behavior_violation_german_law": "Comportamento criminoso ou violação da lei alemã.",
+ "discrimination_etc": "Mensagens, comentários, afirmações ou insultos discriminatórios.",
+ "doxing": "A divulgação de informações pessoais de terceiros sem o seu consentimento ou ameaça de (\"doxing\").",
+ "glorific_trivia_of_cruel_inhuman_acts": "Glorificação ou banalização de atos de violência cruel ou desumana.",
+ "intentional_intimidation_stalking_persecution": "Intimidação intencional, assédio ou perseguição.",
+ "other": "Outros …",
+ "pornographic_content_links": "Publicação ou vinculação de material claramente pornográfico."
+ },
+ "placeholder": "Categoria …"
+ },
+ "description": {
+ "label": "Por favor, explique: Por que você gostaria de denunciar isso?",
+ "placeholder": "Informações adicionais …"
+ }
+ },
+ "submit": "Enviar denúncia",
+ "success": "Obrigado por denunciar!",
+ "user": {
+ "error": "Você já denunciou o usuário!",
+ "message": "Você realmente deseja denunciar o usuário \" {name} \"?",
+ "title": "Denunciar usuário",
+ "type": "Usuário"
+ }
+ },
+ "search": {
+ "failed": "Nada encontrado",
+ "hint": "O que você está buscando?",
+ "placeholder": "Buscar"
+ },
+ "settings": {
+ "data": {
+ "labelBio": "Sobre você",
+ "labelCity": "Sua cidade ou estado",
+ "labelName": "Seu nome",
+ "labelSlug": "Seu nome de usuário exclusivo",
+ "name": "Seus dados",
+ "namePlaceholder": "Anonymous",
+ "success": "Seus dados foram atualizados com sucesso!"
+ },
+ "delete": {
+ "name": "Apagar conta"
+ },
+ "deleteUserAccount": {
+ "accountDescription": "Esteja ciente de que o suas Publicações e Comentários são importantes para a nossa comunidade. Se você ainda optar por excluí-los, você tem que marcá-los abaixo.",
+ "accountWarning": "Você NÃO PODE GERENCIAR e NÃO PODE RECUPERAR sua conta, Publicações, ou Comentários após excluir sua conta!",
+ "commentedCount": "Deletar meus {count} comentários",
+ "contributionsCount": "Deletar minhas {count} publicações",
+ "name": "Deletar dados",
+ "pleaseConfirm": "Ação destrutiva! Digitar “{confirm}” para confirmar.",
+ "success": "Conta eliminada com sucesso!"
+ },
+ "download": {
+ "name": "Baixar dados"
+ },
+ "email": {
+ "change-successful": "O seu endereço de e-mail foi alterado com sucesso.",
+ "labelEmail": "Alterar o seu endereço de e-mail",
+ "labelNewEmail": "Novo endereço de e-mail",
+ "labelNonce": "Digite o seu código",
+ "name": "Seu email",
+ "submitted": "Um e-mail para verificar o seu endereço foi enviado para {email}.",
+ "success": "Um novo endereço de e-mail foi registrado.",
+ "validation": {
+ "same-email": "Este é o seu endereço de e-mail atual"
+ },
+ "verification-error": {
+ "explanation": "Isto pode ter diferentes causas:",
+ "message": "O seu e-mail não pode ser alterado.",
+ "reason": {
+ "invalid-nonce": "O código de confirmação esta inválido?",
+ "no-email-request": "Você tem certeza de que solicitou uma alteração no seu endereço de e-mail?"
+ },
+ "support": "Se o problema persistir, por favor contacte-nos por e-mail"
+ }
+ },
+ "embeds": {
+ "info-description": "Se você concordar, as publicações da seguinte lista de provedores incluirão automaticamente código de terceiros de outros provedores (terceiros) na forma de vídeos, imagens ou texto incorporados.",
+ "name": "Fornecedores de terceiros",
+ "status": {
+ "change": {
+ "allow": "Certeza",
+ "deny": "Não, obrigado",
+ "question": "O código-fonte incorporado de terceiros deve sempre ser exibido para você?"
+ },
+ "description": "Como padrão para você, o código incorporado de provedores de terceiros é",
+ "disabled": {
+ "off": "não exibido inicialmente",
+ "on": "exibido imediatamente"
+ }
+ }
+ },
+ "invites": {
+ "name": "Convites"
+ },
+ "languages": {
+ "name": "Idiomas"
+ },
+ "muted-users": {
+ "columns": {
+ "name": "Nome",
+ "slug": "Slug",
+ "unmute": "Desbloquear"
+ },
+ "empty": "Até agora, você não bloqueou ninguém.",
+ "explanation": {
+ "intro": "Se outro usuário foi bloqueado por você, isto é o que acontece:",
+ "search": "Publicações de pessoas bloqueadas desaparecem dos resultados da sua pesquisa.",
+ "your-perspective": "As mensagens da pessoa bloqueada não aparecerão mais no seu feed de notícias."
+ },
+ "how-to": "Você pode bloquear outros usuários em suas páginas de perfil através do menu de conteúdo.",
+ "mute": "Bloquear usuário",
+ "name": "Usuários bloqueados",
+ "unmute": "Desbloquear usuário",
+ "unmuted": "{name} está desbloqueado novamente"
+ },
+ "name": "Configurações",
+ "organizations": {
+ "name": "Minhas Organizações"
+ },
+ "privacy": {
+ "make-shouts-public": "Compartilhar postagens que eu recomendei no meu perfil público",
+ "name": "Privacidade",
+ "success-update": "Configurações de privacidade salvas"
+ },
+ "security": {
+ "change-password": {
+ "button": "Modificar senha",
+ "label-new-password": "Sua nova senha",
+ "label-new-password-confirm": "Confirme sua nova senha",
+ "label-old-password": "Sua senha antiga",
+ "message-new-password-confirm-required": "Confirme sua nova senha",
+ "message-new-password-missmatch": "Digite a mesma senha novamente",
+ "message-new-password-required": "Digite uma nova senha",
+ "message-old-password-required": "Digite sua senha antiga",
+ "passwordSecurity": "Segurança da senha",
+ "passwordStrength0": "Senha muito insegura",
+ "passwordStrength1": "Senha insegura",
+ "passwordStrength2": "Senha medíocre",
+ "passwordStrength3": "Senha forte",
+ "passwordStrength4": "Senha muito forte",
+ "success": "Senha modificada com sucesso!"
+ },
+ "name": "Segurança"
+ },
+ "social-media": {
+ "name": "Mídias sociais",
+ "placeholder": "Sua url de mídia social",
+ "requireUnique": "Você já adicionou esta url",
+ "submit": "Adicionar link",
+ "successAdd": "Mídias sociais adicionadas. Perfil de usuário atualizado!",
+ "successDelete": "Mídias sociais removidas. Perfil de usuário atualizado!"
+ },
+ "validation": {
+ "slug": {
+ "alreadyTaken": "Este nome de usuário já está registrado.",
+ "regex": "Os caracteres permitidos são apenas letras minúsculas, números, sublinhados e hífens."
+ }
+ }
+ },
+ "shoutButton": {
+ "shouted": "aclamou"
+ },
+ "site": {
+ "back-to-login": "Voltar para o Login",
+ "bank": "conta bancária",
+ "code-of-conduct": "Codigo de Conduto",
+ "contact": "Contato",
+ "data-privacy": "Proteção de Dados",
+ "director": "Diretor Administrativo",
+ "error-occurred": "Ocorreu um erro.",
+ "faq": "FAQ",
+ "germany": "Alemanha",
+ "imprint": "Impressão",
+ "made": "Feito com ❤",
+ "register": "número de registo",
+ "responsible": "Responsável segundo § 55 Abs. 2 RStV (Alemanha) ",
+ "taxident": "Número de identificação do imposto sobre o valor acrescentado de acordo com o § 27 da Lei do Imposto sobre o Valor Acrescentado (Alemanha)",
+ "termsAndConditions": "Termos e Condições",
+ "thanks": "Obrigado(a)!",
+ "tribunal": "tribunal de registo"
+ },
+ "store": {
+ "posts": {
+ "orderBy": {
+ "newest": {
+ "label": "Mais recentes"
+ },
+ "oldest": {
+ "label": "Mais antigos"
+ }
+ }
+ }
+ },
+ "termsAndConditions": {
+ "addition": {
+ "description": " https://human-connection.org/events/ ",
+ "title": "Além disso, realizamos regularmente eventos onde você também pode compartilhar suas impressões e fazer perguntas. Você pode encontrar uma visão geral atual aqui:"
+ },
+ "agree": "Eu concordo!",
+ "code-of-conduct": {
+ "description": "Nosso código de conduta serve como um manual de aparência pessoal e interação entre si. Quem quer que seja ativo como utilizador na rede Human Connection, escreva artigos, comentários ou faça contato com outros utilizadores, mesmo fora da rede, reconhece estas regras de conduta como sendo vinculativas. https://alpha.human-connection.org/code-of-conduct",
+ "title": "Código de Conduta"
+ },
+ "errors-and-feedback": {
+ "description": "Fazemos todos os esforços para manter a nossa rede e dados seguros e disponíveis. Cada nova versão do software passa por testes automatizados e manuais. No entanto, podem ocorrer erros imprevistos. Portanto, somos gratos por quaisquer erros reportados. Você é bem-vindo para relatar quaisquer erros que você descobrir enviando um e-mail para o Suporte em support@human-connection.org.",
+ "title": "Erros e Feedback"
+ },
+ "help-and-questions": {
+ "description": "Para ajuda e perguntas, nós compilamos uma coleção abrangente de perguntas e respostas frequentes (FAQ) para você. Você pode encontrá-las aqui: https://support.human-connection.org/kb/ ",
+ "title": "Ajuda e Perguntas"
+ },
+ "moderation": {
+ "description": "Até que nossas possibilidades financeiras nos permitam implementar o sistema de moderação comunitária, moderamos com um sistema simplificado e com pessoal próprio ou possivelmente voluntário. Nós treinamos esses moderadores e por isso só eles tomam as decisões apropriadas. Estes moderadores realizam o seu trabalho de forma anônima. Você pode denunciar mensagens, comentários e usuários para nós (por exemplo, se eles fornecem informações em seu perfil ou têm imagens que violam estes Termos de Uso). Se você relatar algo para nós, você precisa dar uma razão e pode dar uma breve explicação. Em seguida, analisaremos o que você denunciou e o sancionaremos, se necessário, por exemplo, bloqueando contribuições, comentários ou usuários. Infelizmente, você e a pessoa em questão não receberão qualquer feedback da nossa parte neste momento, mas isto está na fase de planeamento. Independentemente disso, reservamo-nos o direito de impor sanções em princípio por razões que podem ou não estar listadas no nosso Código de Conduta ou nestes termos de serviço.",
+ "title": "Moderação"
+ },
+ "newTermsAndConditions": "Novos Termos e Condições",
+ "privacy-statement": {
+ "description": "Nossa rede é uma rede social de conhecimento e ação. Portanto, é particularmente importante para nós que o máximo de conteúdo possível seja acessível ao público. No decurso do desenvolvimento da nossa rede, haverá cada vez mais a possibilidade de decidir sobre a visibilidade dos dados pessoais. Iremos informá-lo sobre estas novas funcionalidades. Caso contrário, você deve sempre pensar sobre quais dados pessoais você divulga sobre si mesmo (ou outros). Isto aplica-se em particular ao conteúdo das mensagens e comentários, uma vez que estes têm um carácter largamente público. Mais tarde, haverá possibilidades de limitar a visibilidade do seu perfil. Parte dos termos de serviço é a nossa declaração de privacidade, que o informa sobre as operações individuais de processamento de dados na nossa rede: https://human-connection.org/datenschutz/#netzwerk bzw. https://human-connection.org/datenschutz/ Nossa declaração de privacidade é adaptada à situação legal e às características de nossa rede e é sempre válida na versão mais atual.",
+ "title": "Política de Privacidade"
+ },
+ "terms-of-service": {
+ "description": "As seguintes condições de utilização constituem a base para a utilização da nossa rede. Ao registar-se, deve aceitar os termos de utilização e informaremos mais tarde sobre quaisquer alterações que possam ocorrer. A Human Connection Network é operada na Alemanha e, portanto, está sujeita à lei alemã. O local de jurisdição é Kirchheim / Teck. Para mais detalhes, veja a nossa impressão: https://human-connection.org/imprint ",
+ "title": "Termos do Serviço"
+ },
+ "termsAndConditionsConfirmed": "Eu li e confirmei os Terms and Conditions.",
+ "termsAndConditionsNewConfirm": "Eu li e concordo com os novos termos de condições.",
+ "termsAndConditionsNewConfirmText": "Por favor, leia os novos termos de uso agora!",
+ "use-and-license": {
+ "description": "Se qualquer conteúdo que você publicar para nós for protegido por direitos de propriedade intelectual, você nos concede uma licença não exclusiva, transferível, sublicenciável e mundial para usar tal conteúdo para postar em nossa rede. Esta licença expira quando você exclui seu conteúdo ou toda a sua conta. Lembre-se de que outros podem compartilhar seu conteúdo e nós não podemos excluí-lo.",
+ "title": "Uso e Licença"
+ }
+ },
+ "user": {
+ "avatar": {
+ "submitted": "Carregado com sucesso!"
+ }
+ }
}
diff --git a/webapp/locales/ru.json b/webapp/locales/ru.json
index 235a1ef77..afa5b6e21 100644
--- a/webapp/locales/ru.json
+++ b/webapp/locales/ru.json
@@ -190,7 +190,7 @@
"form": {
"description": "На указанный адрес электронной почты будет отправлено сообщение с инструкциями для сброса пароля.",
"submit": "Отправить запрос",
- "submitted": "На адрес {email}<\/b>было отправлено электронное письмо с дальнейшими инструкциями"
+ "submitted": "На адрес {email}было отправлено электронное письмо с дальнейшими инструкциями"
},
"title": "Сбросить пароль"
}
@@ -204,19 +204,19 @@
},
"signup": {
"form": {
- "data-privacy": "Я прочитал и понял Заявление о конфиденциальности<\/ds-text><\/a>",
+ "data-privacy": "Я прочитал и понял Заявление о конфиденциальности",
"description": "Для начала работы введите свой адрес электронной почты:",
"errors": {
"email-exists": "Уже есть учетная запись пользователя с этим адресом электронной почты!",
"invalid-invitation-token": "Похоже, что приглашение уже было использовано. Ссылку из приглашения можно использовать только один раз."
},
- "invitation-code": "Код приглашения: {code}<\/b>",
+ "invitation-code": "Код приглашения: {code}",
"minimum-age": "Мне 18 лет или более",
"no-commercial": "У меня нет коммерческих намерений, и я не представляю коммерческое предприятие или организацию.",
"no-political": "Я не от имени какой-либо партии или политической организации в сети.",
"submit": "Создать учетную запись",
- "success": "Письмо со ссылкой для завершения регистрации было отправлено на {email} <\/b>",
- "terms-and-condition": "Принимаю Условия и положения<\/ds-text><\/a>."
+ "success": "Письмо со ссылкой для завершения регистрации было отправлено на {email} ",
+ "terms-and-condition": "Принимаю Условия и положения."
},
"title": "Присоединяйся к Human Connection!",
"unavailable": "К сожалению, публичная регистрация пользователей на этом сервере сейчас недоступна."
@@ -270,13 +270,13 @@
"delete": {
"cancel": "Отменить",
"comment": {
- "message": "Вы уверены, что хотите удалить комментарий \"{name}<\/b>\"?",
+ "message": "Вы уверены, что хотите удалить комментарий \"{name}\"?",
"success": "Комментарий успешно удален!",
"title": "Удалить комментарий",
"type": "Комментарий"
},
"contribution": {
- "message": "Вы уверены, что хотите удалить пост \"{name}<\/b>\"?",
+ "message": "Вы уверены, что хотите удалить пост \"{name}\"?",
"success": "Пост успешно удален!",
"title": "Удалить пост",
"type": "Пост"
@@ -286,19 +286,19 @@
"disable": {
"cancel": "Отменить",
"comment": {
- "message": "Вы действительно хотите отключить комментарий от «{name}<\/b>»?",
+ "message": "Вы действительно хотите отключить комментарий от «{name}»?",
"title": "Отключить комментарий",
"type": "Комментарий"
},
"contribution": {
- "message": "Вы действительно хотите отключить пост «{name}<\/b>»?",
+ "message": "Вы действительно хотите отключить пост «{name}»?",
"title": "Отключить пост",
"type": "Пост"
},
"submit": "Отключить",
"success": "Успешно отключен",
"user": {
- "message": "Вы действительно хотите отключить пользователя «{name}<\/b>»?",
+ "message": "Вы действительно хотите отключить пользователя «{name}»?",
"title": "Отключить пользователя",
"type": "Пользователь"
}
@@ -364,7 +364,7 @@
"logout": "Выйти",
"moreInfo": "Что такое Human Connection?",
"moreInfoHint": "на страницу проекта",
- "moreInfoURL": "https:\/\/human-connection.org\/en\/",
+ "moreInfoURL": "https://human-connection.org/en/",
"no-account": "У вас нет аккаунта?",
"password": "Пароль",
"register": "Зарегистрируйтесь",
@@ -386,32 +386,32 @@
"cancel": "Отменить",
"Comment": {
"disable": {
- "message": "Вы действительно хотите, чтобы комментарий \"{name}<\/b>\" остановиться и отключен<\/b>?",
+ "message": "Вы действительно хотите, чтобы комментарий \"{name}\" остановиться и отключен?",
"title": "Окончательно отключить комментарий"
},
"enable": {
- "message": "Вы действительно хотите, чтобы комментарий \"{name}<\/b>\" остановиться и включен<\/b>?",
+ "message": "Вы действительно хотите, чтобы комментарий \"{name}\" остановиться и включен?",
"title": "Окончательно включить комментарий"
}
},
"Post": {
"disable": {
- "message": "Вы действительно хотите, чтобы пост \"{name}<\/b>\" остановиться и отключен<\/b>?",
+ "message": "Вы действительно хотите, чтобы пост \"{name}\" остановиться и отключен?",
"title": "Окончательно отключить пост"
},
"enable": {
- "message": "Вы действительно хотите, чтобы пост \"{name}<\/b>\" остановиться и включен<\/b>?",
+ "message": "Вы действительно хотите, чтобы пост \"{name}\" остановиться и включен?",
"title": "Окончательно включить пост"
}
},
"submit": "Подтвердить решение",
"User": {
"disable": {
- "message": "Вы действительно хотите, чтобы пользователь \"{name}<\/b>\" остановиться и отключен<\/b>?",
+ "message": "Вы действительно хотите, чтобы пользователь \"{name}\" остановиться и отключен?",
"title": "Окончательно отключить пользователя"
},
"enable": {
- "message": "Вы уверены, что хотите поделиться пользователем \"{name}<\/b>\"?",
+ "message": "Вы уверены, что хотите поделиться пользователем \"{name}\"?",
"title": "Окончательно включить пост"
}
}
@@ -526,13 +526,13 @@
"cancel": "Отменить",
"comment": {
"error": "Вы уже сообщили о комментарии!",
- "message": "Вы уверены, что хотите показать комментарий \"{name}<\/b>\"?",
+ "message": "Вы уверены, что хотите показать комментарий \"{name}\"?",
"title": "Показать комментарий",
"type": "Комментарий"
},
"contribution": {
"error": "Вы уже сообщили о посте!",
- "message": "Вы уверены, что хотите показать пост \"{name}<\/b>\"?",
+ "message": "Вы уверены, что хотите показать пост \"{name}\"?",
"title": "Показать пост",
"type": "Пост"
},
@@ -540,7 +540,7 @@
"success": "Успешно показан!",
"user": {
"error": "Вы уже сообщили о пользователе!",
- "message": "Вы уверены, что хотите показать пользователя \"{name}<\/b>\"?",
+ "message": "Вы уверены, что хотите показать пользователя \"{name}\"?",
"title": "Показать пользователя",
"type": "Пользователь"
}
@@ -549,13 +549,13 @@
"cancel": "Отменить",
"comment": {
"error": "Вы уже сообщили о посте!",
- "message": "Вы действительно хотите сообщить о посте \" {name} <\/b>\"?",
+ "message": "Вы действительно хотите сообщить о посте \" {name} \"?",
"title": "Пожаловаться на комментарий",
"type": "Комментарий"
},
"contribution": {
"error": "Вы уже сообщили о посте!",
- "message": "Вы действительно хотите сообщить о посте \"{name}<\/b>\"?",
+ "message": "Вы действительно хотите сообщить о посте \"{name}\"?",
"title": "Пожаловаться на пост",
"type": "Пожаловаться на пост"
},
@@ -584,7 +584,7 @@
"success": "Спасибо за сообщение!",
"user": {
"error": "Вы уже сообщили о пользователе!",
- "message": "Вы действительно хотите сообщить о пользователе \"{name}<\/b>\"?",
+ "message": "Вы действительно хотите сообщить о пользователе \"{name}\"?",
"title": "Пожаловаться на пользователя",
"type": "Пользователь"
}
@@ -595,24 +595,6 @@
"placeholder": "Поиск"
},
"settings": {
- "muted-users": {
- "mute": "Блокировать",
- "columns": {
- "name": "Имя",
- "slug": "Псевдоним",
- "unmute": "Разблокировать"
- },
- "empty": "Вы пока никого не блокировали.",
- "explanation": {
- "intro": "Если блокируете другого пользователя, происходит следующее:",
- "search": "Посты заблокированных пользователей не отображаются в результатах поиска.",
- "your-perspective": "Посты заблокированного пользователя не отображаются в персональной ленте."
- },
- "how-to": "Вы можете блокировать других пользователей на странице их профиля с помощью меню профиля.",
- "name": "Заблокированные пользователи",
- "unmute": "Разблокировать пользователей",
- "unmuted": "{name} - снова разблокирован"
- },
"data": {
"labelBio": "О себе",
"labelCity": "Город или регион",
@@ -643,7 +625,7 @@
"labelNewEmail": "Новый адрес электронной почты",
"labelNonce": "Введите свой код",
"name": "Электронная почта",
- "submitted": "Электронное письмо с подтверждением отправлено на {email}<\/b>.",
+ "submitted": "Электронное письмо с подтверждением отправлено на {email}.",
"success": "Новый адрес электронной почты был зарегистрирован.",
"validation": {
"same-email": "Это текущий адрес электронной почты."
@@ -680,6 +662,24 @@
"languages": {
"name": "Языки"
},
+ "muted-users": {
+ "columns": {
+ "name": "Имя",
+ "slug": "Псевдоним",
+ "unmute": "Разблокировать"
+ },
+ "empty": "Вы пока никого не блокировали.",
+ "explanation": {
+ "intro": "Если блокируете другого пользователя, происходит следующее:",
+ "search": "Посты заблокированных пользователей не отображаются в результатах поиска.",
+ "your-perspective": "Посты заблокированного пользователя не отображаются в персональной ленте."
+ },
+ "how-to": "Вы можете блокировать других пользователей на странице их профиля с помощью меню профиля.",
+ "mute": "Блокировать",
+ "name": "Заблокированные пользователи",
+ "unmute": "Разблокировать пользователей",
+ "unmuted": "{name} - снова разблокирован"
+ },
"name": "Настройки",
"organizations": {
"name": "Мои организации"
@@ -760,12 +760,12 @@
},
"termsAndConditions": {
"addition": {
- "description": " https:\/\/human-connection.org\/events\/ <\/a>",
+ "description": " https://human-connection.org/events/ ",
"title": "Кроме того, мы регулярно проводим мероприятия, где вы также можете\\nподелиться своими впечатлениями и задать вопросы. Информацию о текущих событиях можно найти здесь:"
},
"agree": "Я согласен(на)!",
"code-of-conduct": {
- "description": "Наш кодекс поведения служит руководством для личного поведения и взаимодействия друг с другом. Каждый пользователь социальной сети Human Connection, который пишет статьи, комментирует или вступает в контакт с другими пользователями, даже за пределами сети, признает эти правила поведения обязательными. https:\/\/alpha.human-connection.org\/code-of-conduct<\/a>",
+ "description": "Наш кодекс поведения служит руководством для личного поведения и взаимодействия друг с другом. Каждый пользователь социальной сети Human Connection, который пишет статьи, комментирует или вступает в контакт с другими пользователями, даже за пределами сети, признает эти правила поведения обязательными. https://alpha.human-connection.org/code-of-conduct",
"title": "Кодекс поведения"
},
"errors-and-feedback": {
@@ -773,7 +773,7 @@
"title": "Ошибки и обратная связь"
},
"help-and-questions": {
- "description": "Для справки и вопросов мы собрали для вас исчерпывающую подборку часто задаваемых вопросов и ответов (FAQ). Вы можете найти их здесь: https:\/\/support.human-connection.org\/kb\/ <\/a>",
+ "description": "Для справки и вопросов мы собрали для вас исчерпывающую подборку часто задаваемых вопросов и ответов (FAQ). Вы можете найти их здесь: https://support.human-connection.org/kb/ ",
"title": "Помощь и вопросы"
},
"moderation": {
@@ -786,14 +786,14 @@
"title": "Нет коммерческого использования"
},
"privacy-statement": {
- "description": "Наша сеть — это социальная сеть знаний и действий. Поэтому для нас особенно важно, чтобы как можно больше контента было общедоступным. В процессе развития нашей сети будет добавлено больше возможностей для управления видимостью личных данных. Об этих новых функциях мы сообщим дополнительно. В противном случае вы должны думать о том, какие личные данные вы раскрываете о себе (или других). Это особенно актуально для содержания постов и комментариев, поскольку они имеют в основном общедоступный характер. Позже появятся возможности ограничения видимости вашего профиля. Часть условий использования — это наша политика конфиденциальности, которая информирует вас об обработке персональных данных в нашей сети: https:\/\/human-connection.org\/datenschutz\/#netzwerk<\/a> или https:\/\/human-connection.org\/datenschutz<\/a>. Наше заявление о конфиденциальности корректируется в соответствии с законодательством и характеристиками нашей сети и является действительной в настоящей версии.",
+ "description": "Наша сеть — это социальная сеть знаний и действий. Поэтому для нас особенно важно, чтобы как можно больше контента было общедоступным. В процессе развития нашей сети будет добавлено больше возможностей для управления видимостью личных данных. Об этих новых функциях мы сообщим дополнительно. В противном случае вы должны думать о том, какие личные данные вы раскрываете о себе (или других). Это особенно актуально для содержания постов и комментариев, поскольку они имеют в основном общедоступный характер. Позже появятся возможности ограничения видимости вашего профиля. Часть условий использования — это наша политика конфиденциальности, которая информирует вас об обработке персональных данных в нашей сети: https://human-connection.org/datenschutz/#netzwerk или https://human-connection.org/datenschutz. Наше заявление о конфиденциальности корректируется в соответствии с законодательством и характеристиками нашей сети и является действительной в настоящей версии.",
"title": "Заявление о конфиденциальности"
},
"terms-of-service": {
- "description": "Следующие условия использования являются основой для использования нашей сети. При регистрации вы должны принять их, а мы при необходимости сообщим вам об изменениях. Сеть Human Connection работает в Германии и поэтому регулируется немецким законодательством. Место юрисдикции - Kirchheim \/ Teck. Подробности в выходных данных: https:\/\/human-connection.org\/en\/imprint<\/a>.",
+ "description": "Следующие условия использования являются основой для использования нашей сети. При регистрации вы должны принять их, а мы при необходимости сообщим вам об изменениях. Сеть Human Connection работает в Германии и поэтому регулируется немецким законодательством. Место юрисдикции - Kirchheim / Teck. Подробности в выходных данных: https://human-connection.org/en/imprint.",
"title": "Условия обслуживания"
},
- "termsAndConditionsConfirmed": "Я прочитал(а) и подтверждаю Условия и положения<\/a>.",
+ "termsAndConditionsConfirmed": "Я прочитал(а) и подтверждаю Условия и положения.",
"termsAndConditionsNewConfirm": "Я прочитал(а) и согласен(на) с новыми условиями.",
"termsAndConditionsNewConfirmText": "Пожалуйста, ознакомьтесь с новыми условиями использования!",
"use-and-license": {
diff --git a/webapp/middleware/isAdmin.js b/webapp/middleware/isAdmin.js
index 4db10bbb6..12b6c5bac 100644
--- a/webapp/middleware/isAdmin.js
+++ b/webapp/middleware/isAdmin.js
@@ -1,5 +1,5 @@
export default ({ store, error }) => {
if (!store.getters['auth/isAdmin']) {
- return error({ statusCode: 403 })
+ return error({ statusCode: 403, message: 'error-pages.not-authorized' })
}
}
diff --git a/webapp/middleware/isModerator.js b/webapp/middleware/isModerator.js
index e99793a3e..9b17badea 100644
--- a/webapp/middleware/isModerator.js
+++ b/webapp/middleware/isModerator.js
@@ -1,5 +1,5 @@
export default ({ store, error }) => {
if (!store.getters['auth/isModerator']) {
- return error({ statusCode: 403 })
+ return error({ statusCode: 403, message: 'error-pages.not-authorized' })
}
}
diff --git a/webapp/mixins/persistentLinks.js b/webapp/mixins/persistentLinks.js
index efc4392e2..ce41251f7 100644
--- a/webapp/mixins/persistentLinks.js
+++ b/webapp/mixins/persistentLinks.js
@@ -26,7 +26,7 @@ export default function(options = {}) {
resource = response.data[Object.keys(response.data)[0]][0]
if (resource) return redirect(`/${path}/${resource.id}/${resource.slug}`)
- return error({ statusCode: 404, message })
+ return error({ statusCode: 404, key: message })
},
}
}
diff --git a/webapp/nuxt.config.js b/webapp/nuxt.config.js
index c1283a9be..2ef42f139 100644
--- a/webapp/nuxt.config.js
+++ b/webapp/nuxt.config.js
@@ -4,7 +4,13 @@ import dotenv from 'dotenv'
dotenv.config() // we want to synchronize @nuxt-dotenv and nuxt-env
const pkg = require('./package')
-export const envWhitelist = ['NODE_ENV', 'MAPBOX_TOKEN', 'PUBLIC_REGISTRATION']
+export const envWhitelist = [
+ 'NODE_ENV',
+ 'MAPBOX_TOKEN',
+ 'PUBLIC_REGISTRATION',
+ 'WEBSOCKETS_URI',
+ 'GRAPHQL_URI',
+]
const dev = process.env.NODE_ENV !== 'production'
const styleguidePath = '../styleguide'
diff --git a/webapp/package.json b/webapp/package.json
index 8f44913e7..e29a90e50 100644
--- a/webapp/package.json
+++ b/webapp/package.json
@@ -1,6 +1,6 @@
{
"name": "human-connection-webapp",
- "version": "0.2.2",
+ "version": "0.3.1",
"description": "Human Connection Frontend",
"authors": [
"Grzegorz Leoniec (appinteractive)",
@@ -18,6 +18,7 @@
"generate:maintenance": "nuxt generate -c nuxt.config.maintenance.js",
"generate": "nuxt generate",
"lint": "eslint --ext .js,.vue .",
+ "locales": "../scripts/translations/missing-keys.sh && ../scripts/translations/sort.sh",
"precommit": "yarn lint",
"test": "jest",
"test:unit:debug": "node --inspect-brk ./node_modules/jest/bin/jest.js --no-cache --runInBand"
@@ -59,15 +60,15 @@
"dependencies": {
"@human-connection/styleguide": "0.5.22",
"@nuxtjs/apollo": "^4.0.0-rc19",
- "@nuxtjs/axios": "~5.9.4",
+ "@nuxtjs/axios": "~5.9.5",
"@nuxtjs/dotenv": "~1.4.1",
- "@nuxtjs/pwa": "^3.0.0-beta.19",
- "@nuxtjs/sentry": "^3.1.0",
+ "@nuxtjs/pwa": "^3.0.0-beta.20",
+ "@nuxtjs/sentry": "^3.2.3",
"@nuxtjs/style-resources": "~1.0.0",
"accounting": "~0.4.1",
"apollo-cache-inmemory": "~1.6.5",
"apollo-client": "~2.6.8",
- "cookie-universal-nuxt": "~2.1.1",
+ "cookie-universal-nuxt": "~2.1.2",
"cropperjs": "^1.5.5",
"cross-env": "~7.0.0",
"date-fns": "2.9.0",
@@ -99,11 +100,11 @@
"@babel/core": "~7.8.4",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/preset-env": "~7.8.4",
- "@storybook/addon-a11y": "^5.3.9",
- "@storybook/addon-actions": "^5.3.9",
- "@storybook/addon-notes": "^5.3.9",
- "@storybook/vue": "~5.3.9",
- "@vue/cli-shared-utils": "~4.1.2",
+ "@storybook/addon-a11y": "^5.3.13",
+ "@storybook/addon-actions": "^5.3.13",
+ "@storybook/addon-notes": "^5.3.13",
+ "@storybook/vue": "~5.3.13",
+ "@vue/cli-shared-utils": "~4.2.2",
"@vue/eslint-config-prettier": "~6.0.0",
"@vue/server-test-utils": "~1.0.0-beta.31",
"@vue/test-utils": "~1.0.0-beta.31",
@@ -120,13 +121,13 @@
"eslint-config-prettier": "~6.10.0",
"eslint-config-standard": "~14.1.0",
"eslint-loader": "~3.0.3",
- "eslint-plugin-import": "~2.20.0",
+ "eslint-plugin-import": "~2.20.1",
"eslint-plugin-jest": "~23.6.0",
"eslint-plugin-node": "~11.0.0",
"eslint-plugin-prettier": "~3.1.2",
"eslint-plugin-promise": "~4.2.1",
"eslint-plugin-standard": "~4.0.1",
- "eslint-plugin-vue": "~6.1.2",
+ "eslint-plugin-vue": "~6.2.1",
"faker": "^4.1.0",
"flush-promises": "^1.0.2",
"fuse.js": "^3.4.6",
@@ -141,8 +142,8 @@
"style-loader": "~0.23.1",
"style-resources-loader": "~1.3.3",
"vue-jest": "~3.0.5",
- "vue-loader": "~15.8.3",
- "vue-svg-loader": "~0.15.0",
+ "vue-loader": "~15.9.0",
+ "vue-svg-loader": "~0.16.0",
"vue-template-compiler": "^2.6.11"
}
}
diff --git a/webapp/pages/post/_id.vue b/webapp/pages/post/_id.vue
index a02afd3b9..92795606f 100644
--- a/webapp/pages/post/_id.vue
+++ b/webapp/pages/post/_id.vue
@@ -35,7 +35,7 @@ const options = {
}
`,
path: 'post',
- message: 'This post could not be found',
+ message: 'error-pages.post-not-found',
}
const persistentLinks = PersistentLinks(options)
@@ -55,14 +55,14 @@ export default {
},
// TODO implement
/* {
- name: this.$t('common.letsTalk'),
- path: `/post/${id}/${slug}#lets-talk`
- }, */
+ name: this.$t('common.letsTalk'),
+ path: `/post/${id}/${slug}#lets-talk`
+ }, */
// TODO implement
/* {
- name: this.$t('common.versus'),
- path: `/post/${id}/${slug}#versus`
- } */
+ name: this.$t('common.versus'),
+ path: `/post/${id}/${slug}#versus`
+ } */
],
},
{
@@ -71,9 +71,9 @@ export default {
},
// TODO implement
/* {
- name: this.$t('common.takeAction'),
- path: `/post/${id}/${slug}/take-action`
- } */
+ name: this.$t('common.takeAction'),
+ path: `/post/${id}/${slug}/take-action`
+ } */
]
},
},
diff --git a/webapp/pages/post/_id/_slug/index.vue b/webapp/pages/post/_id/_slug/index.vue
index b9100a48c..f5aa2a15c 100644
--- a/webapp/pages/post/_id/_slug/index.vue
+++ b/webapp/pages/post/_id/_slug/index.vue
@@ -96,7 +96,7 @@
:post="post"
@createComment="createComment"
/>
-
+
{{ $t('settings.blocked-users.explanation.commenting-disabled') }}
{{ $t('settings.blocked-users.explanation.commenting-explanation') }}
diff --git a/webapp/pages/post/edit/_id.vue b/webapp/pages/post/edit/_id.vue
index c79d2b70e..d269a04d8 100644
--- a/webapp/pages/post/edit/_id.vue
+++ b/webapp/pages/post/edit/_id.vue
@@ -38,7 +38,7 @@ export default {
variables: { id },
})
if (contribution.author.id !== store.getters['auth/user'].id) {
- error({ statusCode: 403, message: "You can't edit that!" })
+ error({ statusCode: 403, message: 'error-pages.cannot-edit-post' })
}
return { contribution }
},
diff --git a/webapp/pages/profile/_id.vue b/webapp/pages/profile/_id.vue
index 992e5efce..b9bbef83e 100644
--- a/webapp/pages/profile/_id.vue
+++ b/webapp/pages/profile/_id.vue
@@ -23,7 +23,7 @@ const options = {
}
}
`,
- message: 'This user could not be found',
+ message: 'error-pages.profile-not-found',
path: 'profile',
}
const persistentLinks = PersistentLinks(options)
diff --git a/webapp/pages/profile/_id/_slug.vue b/webapp/pages/profile/_id/_slug.vue
index 4d1dece7b..92073e724 100644
--- a/webapp/pages/profile/_id/_slug.vue
+++ b/webapp/pages/profile/_id/_slug.vue
@@ -64,14 +64,14 @@