Compare commits

..

32 Commits

Author SHA1 Message Date
75780252eb Add documentation on translation directives 2025-11-28 16:54:18 +01:00
45d7d1614a Add documentation on use of translation provider Loco 2025-11-28 12:41:59 +01:00
009846853b Merge config into single file for translations 2025-11-28 12:41:46 +01:00
7f71fae295 Correct translation in ThirdpartyBundle 2025-11-28 10:23:37 +01:00
cf0cdfb3a0 Set variable in .env.local file 2025-11-28 09:58:11 +01:00
0380bc59de Complete translations ChillActivityBundle 2025-11-28 09:57:51 +01:00
1cc59e33cc Complete translations ChillCalendarBundle 2025-11-28 09:56:14 +01:00
30e87c3369 Complete translations ChillBudgetBundle 2025-11-28 09:51:50 +01:00
eec65a7943 Complete translations ChillAsideActivityBundle 2025-11-28 09:49:01 +01:00
a56ef214a3 Complete translations ChillReportBundle 2025-11-28 09:47:18 +01:00
d328b8bcaf Add translations ChillWopiBundle 2025-11-28 09:43:33 +01:00
2e3ef233e5 Add translations ChillThirdpartyBundle 2025-11-28 09:42:30 +01:00
7a95c444dd Add translations ChillTaskBundle 2025-11-28 09:37:06 +01:00
6e2215964d Complete translations ChillPersonBundle 2025-11-28 09:23:08 +01:00
e63fe793f8 Add dutch translations in ChillPersonBundle 2025-11-26 15:07:21 +01:00
0e1f9dcb93 Complete translations ChillMainBundle 2025-11-26 14:45:57 +01:00
e30847dfcd Install loco into project + config todo 2025-11-26 12:47:18 +01:00
65025dc7da ChillMainBundle translations 2025-11-26 11:37:16 +01:00
e3d80ac468 ChillJobBundle translations 2025-11-26 09:54:35 +01:00
55195c7bde ChillEventBundle translations 2025-11-26 09:50:54 +01:00
eb88063cee ChillDocStoreBundle translations 2025-11-26 09:40:09 +01:00
3eea8abbeb ChillBudgetBundle translations 2025-11-26 06:28:23 +01:00
5335b62679 ChillDocGeneratorBundle translations 2025-11-26 06:26:27 +01:00
31fb428703 ChillCalendarBundle translations 2025-11-26 06:26:11 +01:00
604b2361d8 ChillCustomFieldsBundle translations 2025-11-26 06:25:49 +01:00
93e76952dd ChillActivityBundle translations 2025-11-26 06:25:25 +01:00
0d32810d0d Change position and color of confirm parcours button 2025-11-24 15:13:16 +01:00
b221ad1621 Merge branch '466-set-main-user-activity' into 'master'
Associate activity's creator as a participant by default, and retro-actively append the creator to each activity

Closes #466

See merge request Chill-Projet/chill-bundles!924
2025-11-24 09:23:12 +00:00
a96e9d5377 Associate activity's creator as a participant by default, and retro-actively append the creator to each activity 2025-11-24 09:23:12 +00:00
54b73128c3 Merge branch '470-alphabetical-order-admin' into 'master'
Alphabetically order userJobs and mainLocations within user creation form

Closes #470

See merge request Chill-Projet/chill-bundles!926
2025-11-24 09:18:03 +00:00
5c0cb01fdc Alphabetically order userJobs and mainLocations within user creation form 2025-11-24 09:18:03 +00:00
26d9b55c6d Update to v4.8.1 2025-11-20 16:19:52 +01:00
76 changed files with 4846 additions and 1473 deletions

View File

@@ -0,0 +1,7 @@
kind: Fixed
body: |
Associate activity's creator as a participant by default, and retro-actively append the creator to each activity
time: 2025-11-18T14:05:59.904993123+01:00
custom:
Issue: "466"
SchemaChange: Add columns or tables

View File

@@ -1,6 +0,0 @@
kind: Fixed
body: Insert name of file as the document title when uploading
time: 2025-11-19T13:33:24.778116633+01:00
custom:
Issue: ""
SchemaChange: No schema change

View File

@@ -1,6 +0,0 @@
kind: Fixed
body: Add missing path paramater 'id' for editing multiple participations
time: 2025-11-19T13:48:02.078949572+01:00
custom:
Issue: ""
SchemaChange: No schema change

View File

@@ -1,7 +0,0 @@
kind: Fixed
body: |
Hide the display of inactive user groups in the api
time: 2025-11-19T16:12:33.803084517+01:00
custom:
Issue: "471"
SchemaChange: No schema change

View File

@@ -0,0 +1,6 @@
kind: UX
body: Alphabetically order userJobs and mainLocations within user creation form
time: 2025-11-19T15:37:06.393470745+01:00
custom:
Issue: "470"
SchemaChange: No schema change

View File

@@ -0,0 +1,6 @@
kind: UX
body: Change position and color of confirm parcours button
time: 2025-11-24T15:11:15.960279853+01:00
custom:
Issue: "437"
SchemaChange: No schema change

6
.changes/v4.8.1.md Normal file
View File

@@ -0,0 +1,6 @@
## v4.8.1 - 2025-11-20
### Fixed
* Insert name of file as the document title when uploading
* Add missing path paramater 'id' for editing multiple participations
* ([#471](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/471)) Hide the display of inactive user groups in the api

4
.env
View File

@@ -92,3 +92,7 @@ REDIS_URL=redis://${REDIS_HOST}:${REDIS_PORT}
###> symfony/ovh-cloud-notifier ###
# OVHCLOUD_DSN=ovhcloud://APPLICATION_KEY:APPLICATION_SECRET@default?consumer_key=CONSUMER_KEY&service_name=SERVICE_NAME
###< symfony/ovh-cloud-notifier ###
###> symfony/loco-translation-provider ###
#LOCO_DSN=loco://API_KEY@default
###< symfony/loco-translation-provider ###

View File

@@ -14,7 +14,6 @@ $finder = PhpCsFixer\Finder::create();
$finder
->in(__DIR__.'/src')
->in(__DIR__.'/utils')
->in(__DIR__.'/packages')
->append([__FILE__])
->exclude(['docs/', 'tests/app'])
->notPath('tests/app')

View File

@@ -6,6 +6,13 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html),
and is generated by [Changie](https://github.com/miniscruff/changie).
## v4.8.1 - 2025-11-20
### Fixed
* Insert name of file as the document title when uploading
* Add missing path paramater 'id' for editing multiple participations
* ([#471](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/471)) Hide the display of inactive user groups in the api
## v4.8.0 - 2025-11-17
### Feature
* ([#461](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/461)) Make a calendar item on the 'mes rendez-vous' page clickable. Clicking will navigate to the edit page of the calendar item.

View File

@@ -7,13 +7,6 @@
"chill",
"social worker"
],
"repositories": [{
"type": "path",
"url": "./packages/ChillZimbraBundle",
"options": {
"symlink": true
}
}],
"require": {
"php": "^8.2",
"ext-dom": "*",
@@ -21,7 +14,6 @@
"ext-openssl": "*",
"ext-redis": "*",
"ext-zlib": "*",
"chill-project/chill-zimbra-bundle": "@dev",
"champs-libres/wopi-bundle": "dev-symfony-v5@dev",
"champs-libres/wopi-lib": "dev-master@dev",
"doctrine/data-fixtures": "^1.8",
@@ -62,6 +54,7 @@
"symfony/http-client": "^5.4",
"symfony/http-foundation": "^5.4",
"symfony/intl": "^5.4",
"symfony/loco-translation-provider": "^6.0",
"symfony/mailer": "^5.4",
"symfony/messenger": "^5.4",
"symfony/mime": "^5.4",

View File

@@ -37,5 +37,4 @@ return [
Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true],
Symfony\UX\Translator\UxTranslatorBundle::class => ['all' => true],
loophp\PsrHttpMessageBridgeBundle\PsrHttpMessageBridgeBundle::class => ['all' => true],
Chill\ZimbraBundle\ChillZimbraBundle::class => ['all' => true],
];

View File

@@ -1,7 +1,12 @@
# config/packages/translation.yaml
framework:
default_locale: en
default_locale: '%env(resolve:LOCALE)%' # LOCALE=fr in .env
translator:
default_path: '%kernel.project_dir%/translations'
fallbacks:
- en
- '%env(resolve:LOCALE)%' # fr
providers:
loco:
dsn: '%env(LOCO_DSN)%'
domains: [ 'messages' ]
locales: [ 'fr', 'nl' ]

View File

@@ -1,4 +0,0 @@
framework:
default_locale: '%env(resolve:LOCALE)%'
translator:
fallbacks: [ '%env(resolve:LOCALE)%' ]

View File

@@ -0,0 +1,419 @@
============================================
Directives for creating new translation keys
============================================
These directives are meant to ensure better consistency across bundles, avoid duplication, and make keys more predictable.
General Principles
==================
1. **Use lowercase snake_case for all keys**
2. **Use dot-separated namespaces**
The dot is used to reflect:
- bundle
- feature
- sub-feature
- key type
3. **Do not use spaces in keys**
4. **Avoid duplicating the same text in multiple places**
When a translation is needed, try a search for the translation value first and see if it exists elsewhere
5. **If a key is used across multiple bundles, it must live in ChillMainBundle.**
6. **If a key is used across multiple bundles and is a generic term, it must be placed in the ``common`` namespace.**
Key Structure
=============
We use the following structure:
.. code-block:: text
<scope>.<feature>.<sub-feature>.<key-type>
Where:
* ``<>`` identifies the bundle or shared context
* ``<feature>`` identifies the part of the module using the translation
* ``<element>`` describes the text purpose
* ``<subelement>`` for a multi-level element ( eg. activity.export.person.count.description)
Examples of scopes
------------------
* ``activity`` — ChillActivityBundle
* ``person`` — ChillPersonBundle
* ``common`` — neutral shared translation values
Naming Scopes
=============
1. **Bundle-specific keys**
For most things inside a bundle:
.. code-block:: text
activity.<feature>.<element>
Example:
.. code-block:: text
activity.form.save
activity.list.title
activity.entity.type
activity.menu.activities
activity.controller.success_created
2. **Shared UI elements (buttons, labels, generic text)**
These belong in the ``common`` namespace in ChillMainBundle:
.. code-block:: text
common.save
common.delete
common.edit
common.filter
common.duration_time
Translation workflow
====================
Use the following workflow when deciding where a key belongs:
1. **Is this text used in more than one bundle?**
→ Place in ``main`` or ``common``
2. **Is this text generic UI (button, label, pagination, yes/no)?**
→ Place in ``common``
3. **Is this text specific to one bundle and one feature?**
→ Place in ``<bundle>.feature.<element>``
4. **Is this text related to an entity or value object?**
→ Place in ``<bundle>.entity.<entityname>.<field>``
5. **Is this text used in forms?**
``<bundle>.form.<field>`` or ``<bundle>.form.<action>``
6. **Is this text related to exports?**
``<bundle>.export.<feature>.<column>``
7. **Is it related to filtering, searching or parameters?**
``<bundle>.filter.<name>`` or
``<bundle>.filter.<feature>.<field>`` for nested filters
Examples based on translations within ChillActivityBundle
=========================================================
Below are concrete examples from ``ChillActivityBundle``,
refactored according to the guidelines.
General activity keys
---------------------
Instead of scattered keys like::
Show the activity
Edit the activity
Activity
Duration time
...
We use:
.. code-block:: text
activity.general.show
activity.general.edit
activity.general.title
activity.general.duration
activity.general.travel_time
activity.general.attendee
activity.general.remark
activity.general.no_comments
Forms
-----
Instead of keys like::
Activity creation
Save activity
Reset form
Choose a type
Use:
.. code-block:: text
activity.form.title_create
activity.form.save
activity.form.reset
activity.form.choose_type
activity.form.choose_duration
Long lists (like durations) should be grouped:
.. code-block:: text
activity.form.duration.5min
activity.form.duration.10min
activity.form.duration.15min
activity.form.duration.1h
activity.form.duration.1h30
activity.form.duration.2h
...
Entities
--------
Entity fields should follow:
.. code-block:: text
activity.entity.activity.date
activity.entity.activity.comment
activity.entity.activity.deleted
activity.entity.location.name
activity.entity.location.type
Controller messages
-------------------
Instead of strings as keys::
'Success : activity created!'
'The form is not valid. The activity has not been created !'
Use:
.. code-block:: text
activity.controller.success_created
activity.controller.error_invalid_create
activity.controller.success_updated
activity.controller.error_invalid_update
Roles
-----
Access control keys should be:
.. code-block:: text
activity.role.create
activity.role.update
activity.role.see
activity.role.see_details
activity.role.delete
activity.role.stats
activity.role.list
Admin
-----
.. code-block:: text
activity.admin.configuration
activity.admin.types
activity.admin.reasons
activity.admin.reason_category
activity.admin.presence
CRUD
----
.. code-block:: text
activity.crud.type.title_new
activity.crud.type.title_edit
activity.crud.presence.title_new
Activity Reason
---------------
.. code-block:: text
activity.reason.list
activity.reason.create
activity.reason.active
activity.reason.category
activity.reason.entity_title
Exports
-------
Group them logically:
.. code-block:: text
activity.export.person.count.title
activity.export.person.count.description
activity.export.person.count.header
activity.export.period.sum_duration.title
activity.export.period.sum_duration.description
activity.export.period.sum_duration.header
Filters
-------
Use hierarchical filters:
.. code-block:: text
activity.filter.by_reason
activity.filter.by_type
activity.filter.by_date
activity.filter.by_location
activity.filter.by_sent_received
activity.filter.by_user
Aggregators
-----------
.. code-block:: text
activity.aggregator.reason.by_category
activity.aggregator.reason.level
activity.aggregator.user.by_scope
activity.aggregator.user.by_job
Global/Shared Keys
==================
Keys like the following **must not be redeclared** in each bundle:
- First name
- Last name
- Username
- ID
- Type
- Duration
- Comment
- Date
- Location
- Present / Not present
- Add / Edit / Delete / Save / Update
These belong in ``common`` or ``main``:
.. code-block:: text
common.firstname
common.lastname
common.username
common.id
common.type
common.comment
common.date
common.location
common.present
common.absent
common.add
common.edit
common.delete
common.save
common.update
Naming directives summary
==========================
* **snake_case**
* **namespaced with dots**
* **bundle prefix for bundle-specific concepts**
* **common or main for shared concepts**
* **avoid free-floating keys (without namespace)**
* **reuse common keys wherever possible**
Migration Strategy (Optional)
=============================
To apply this structure progressively:
1. New keys must follow these guidelines.
2. Existing keys may remain as-is until refactored.
3. When refactoring:
- Move cross-bundle keys to ChillMainBundle and possible `common` namespace.
- Replace duplicated keys with shared ones.
===========================================
Avoiding duplicate translations
===========================================
1. Use Shared Namespaces
========================
Two namespaces must be used for shared translations:
* ``common.*`` — generic UI concepts (save, delete, date, name, etc.)
If a translation may be reused in multiple bundles, it must be placed
in the ``common`` namespace or in ChillMainBundle.
2. Bundle-Specific Keys
=======================
Keys belonging only to one bundle or one feature are namespaced inside that
bundle:
.. code-block:: text
activity.<feature>.<element>
person.<feature>.<element>
3. Search Before Creating
=========================
Before adding a new translation key, developers must:
1. For common translations like: "enregistrer/opslaan" look in the `common` namespace.
3. Search in Loco or translations for existing values.
If a suitable key exists, reuse it.
4. Only Create a New Key When Necessary
=======================================
Create a new key only when the text is:
* specific to the bundle
* specific to the feature
* not reusable elsewhere
6. Progressive Cleanup
======================
Old duplicates may remain temporarily. When updating code in an area, clean
duplicate values by moving them into ``common`` or ``main``.
General workflow
================
* **Reuse shared keys** within ``common`` namespace.
* **Search before creating** new keys.
* **Namespace bundle-specific keys** under their bundle.
* **Refactor progressively** when touching old code.

View File

@@ -0,0 +1,148 @@
=======================================================================
Managing translations within CHILL using Loco as a translation provider
=======================================================================
Within CHILL we make use of Symfony's translation component together with *Loco* as an external
translation provider. Using this setup centralise translations in a single online
location (Loco), while still allowing developers to create and update
translation keys locally in the project (YAML files).
Workflow
========
We use the following workflow:
* Developers create translation keys in YAML files inside each bundle.
* Keys are written in **English**.
* Application UI defaults to **French**, with **Dutch** as an additional locale (other languages can be added in the future).
* Loco acts as the central translation memory and synchronisation source.
* Loco Symfony package was installed so that built-in translation commands can be used to push/pull content
between Loco and the local project.
Translation directory structure
===============================
Each bundle contains its own ``translations`` directory, for example::
chill-bundles/
ChillCoreBundle/
translations/
messages.fr.yml
messages.nl.yml
ChillPersonBundle/
translations/
messages.fr.yml
messages.nl.yml
...
Configuration
=============
The translation configuration is defined in
``config/packages/translation.yaml``::
framework:
default_locale: '%env(resolve:LOCALE)%'
translator:
default_path: '%kernel.project_dir%/translations'
fallbacks:
- '%env(resolve:LOCALE)%'
- 'en'
providers:
loco:
dsn: '%env(LOCO_DSN)%'
domains: [ 'messages' ]
locales: [ 'fr', 'nl' ]
Note:
* ``en`` is the **source locale** in Loco.
* ``fr`` and ``nl`` are the **application locales**.
* ``domains: [messages]`` means only ``messages.*.yml`` files are pushed.
Environment variables
---------------------
In ``.env``::
LOCALE=fr
In ``.env.local``::
LOCO_DSN="loco://API_KEY@default"
Replace ``API_KEY`` with the key provided by Loco.
Working with Loco
=================
Loco shows all translation keys under three languages:
* **English (source)** — keys are listed but remain “untranslated”
* **French** — translated strings for French users
* **Dutch** — translated strings for Dutch users
Note: Don't add translations directly in the English column.
This column simply represents the *key*.
Pushing translations to Loco
============================
You can push local translations to Loco using:
.. code-block:: bash
symfony console translation:push loco --locales=fr --locales=nl --force
This will:
* Upload all French and Dutch translation values from ``*.fr.yml`` and
``*.nl.yml`` files
* Ensures Loco stays in sync with local YAML files
* Creates any missing keys in Loco
Pulling translations from Loco
==============================
When translators update strings in Loco, developers can fetch updates with:
.. code-block:: bash
symfony console translation:pull loco --locales=fr --locales=nl --force
This will:
* Download the latest French and Dutch translations
* Overwrite the local YAML files with Locos content
* Keep everything consistent across the team
Adding new translation keys (Developer workflow)
================================================
1. Add a new key directly in the appropriate YAML file, for example::
chill-bundles/ChillPersonBundle/translations/messages.fr.yml
Example key::
person.form.submit: "Envoyer"
2. Add Dutch translation as well if you can (otherwise leave empty to be translated within Loco later)::
person.form.submit: "Verzenden"
3. Run a push to send the new key to Loco:
.. code-block:: bash
symfony console translation:push loco --locales=fr --locales=nl --force
4. The key will now appear in Loco for translation management.
Note: English appears as “untranslated”, because it is merely the source language

View File

@@ -11,7 +11,6 @@
"@hotwired/stimulus": "^3.0.0",
"@luminateone/eslint-baseline": "^1.0.9",
"@symfony/stimulus-bridge": "^3.2.0",
"@symfony/ux-translator": "file:vendor/symfony/ux-translator/assets",
"@symfony/webpack-encore": "^4.1.0",
"@tsconfig/node20": "^20.1.4",
"@types/dompurify": "^3.0.5",

View File

@@ -1,22 +0,0 @@
{
"name": "chill-project/chill-zimbra-bundle",
"description": "Provide connection between Zimbra agenda and Chill",
"minimum-stability": "stable",
"license": "AGPL-3.0",
"type": "library",
"keywords": [
"chill",
"social worker"
],
"require": {
"chill-project/chill-bundles": "dev-master@dev",
"zimbra-api/soap-api": "^3.2.2",
"psr/http-client": "^1.0",
"nyholm/psr7": "^1.0"
},
"autoload": {
"psr-4": {
"Chill\\ZimbraBundle\\": "src/"
}
}
}

View File

@@ -1,95 +0,0 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\ZimbraBundle\Calendar\Connector;
use Chill\CalendarBundle\Entity\Calendar;
use Chill\CalendarBundle\Entity\CalendarRange;
use Chill\CalendarBundle\Entity\Invite;
use Chill\CalendarBundle\RemoteCalendar\Connector\RemoteCalendarConnectorInterface;
use Chill\MainBundle\Entity\User;
use Chill\ZimbraBundle\Calendar\Connector\ZimbraConnector\CreateEvent;
use Chill\ZimbraBundle\Calendar\Connector\ZimbraConnector\UpdateEvent;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\Response;
final readonly class ZimbraConnector implements RemoteCalendarConnectorInterface
{
private const LOG_PREFIX = '[ZimbraConnector] ';
public function __construct(
private CreateEvent $createEvent,
private UpdateEvent $updateEvent,
private LoggerInterface $logger,
) {}
public function countEventsForUser(User $user, \DateTimeImmutable $startDate, \DateTimeImmutable $endDate): int
{
return 0;
}
public function getMakeReadyResponse(string $returnPath): Response
{
throw new \BadMethodCallException('Zimbra connector is always ready');
}
public function isReady(): bool
{
return true;
}
public function listEventsForUser(User $user, \DateTimeImmutable $startDate, \DateTimeImmutable $endDate, ?int $offset = 0, ?int $limit = 50): array
{
return [];
}
public function removeCalendar(string $remoteId, array $remoteAttributes, User $user, ?CalendarRange $associatedCalendarRange = null): void
{
// TODO: Implement removeCalendar() method.
}
public function removeCalendarRange(string $remoteId, array $remoteAttributes, User $user): void
{
// TODO: Implement removeCalendarRange() method.
}
public function syncCalendar(Calendar $calendar, string $action, ?CalendarRange $previousCalendarRange, ?User $previousMainUser, ?array $oldInvites, ?array $newInvites): void
{
if (!$calendar->hasRemoteId()) {
$calItemId = ($this->createEvent)($calendar);
$this->logger->info(self::LOG_PREFIX.'Calendar synced with Zimbra', ['calendar_id' => $calendar->getId(), 'action' => $action, 'calItemId' => $calItemId]);
$calendar->setRemoteId($calItemId);
return;
}
throw new \RuntimeException('Update of calendar: to be implemented');
}
public function syncCalendarRange(CalendarRange $calendarRange): void
{
if (!$calendarRange->hasRemoteId()) {
$calItemId = ($this->createEvent)($calendarRange);
$this->logger->info(self::LOG_PREFIX.'Calendar range created with Zimbra', ['calendar_range_id' => $calendarRange->getId(), 'calItemId' => $calItemId]);
$calendarRange->setRemoteId($calItemId);
} else {
($this->updateEvent)($calendarRange);
$this->logger->info(self::LOG_PREFIX.'Calendar range updated against zimbra', ['old_cal_remote_id' => $calendarRange->getRemoteId(), 'calendar_range_id' => $calendarRange->getId()]);
}
}
public function syncInvite(Invite $invite): void
{
// TODO: Implement syncInvite() method.
}
}

View File

@@ -1,97 +0,0 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\ZimbraBundle\Calendar\Connector\ZimbraConnector;
use Chill\CalendarBundle\Entity\Calendar;
use Chill\CalendarBundle\Entity\CalendarRange;
use Chill\ZimbraBundle\Exception\CalendarWithoutMainUserException;
use Symfony\Contracts\Translation\TranslatorInterface;
use Zimbra\Mail\Struct\InvitationInfo;
use Zimbra\Mail\Struct\InviteComponent;
use Zimbra\Mail\Struct\MimePartInfo;
use Zimbra\Mail\Struct\Msg;
/**
* Creates a new calendar event in Zimbra.
*
* This class handles the creation of new calendar events in the Zimbra system.
* It uses the Zimbra SOAP API to create events and returns a serialized ID that
* can be used as remoteId for Calendar and CalendarRange.
*/
final readonly class CreateEvent
{
public function __construct(
private SoapClientBuilder $soapClientBuilder,
private CreateZimbraComponent $createEvent,
private TranslatorInterface $translator,
private ZimbraIdSerializer $zimbraIdSerializer,
) {}
/**
* Creates a new calendar event in Zimbra.
*
* @param Calendar|CalendarRange $calendar The calendar event to create
*
* @return string The serialized Zimbra ID for the created event
*
* @throws CalendarWithoutMainUserException When the calendar has no associated user email
*/
public function __invoke(Calendar|CalendarRange $calendar): string
{
if ($calendar instanceof Calendar) {
$organizerEmail = $calendar->getMainUser()->getEmail();
$organizerLang = $calendar->getMainUser()->getLocale();
} else {
$organizerEmail = $calendar->getUser()->getEmail();
$organizerLang = $calendar->getUser()->getLocale();
}
if (null === $organizerEmail) {
throw new CalendarWithoutMainUserException();
}
$api = $this->soapClientBuilder->getApiForAccount($organizerEmail);
$comp = $this->createEvent->createZimbraInviteComponentFromCalendar($calendar);
$inv = new InvitationInfo();
$inv->setInviteComponent($comp);
$mp = new MimePartInfo();
$mp->addMimePart(new MimePartInfo('text/plain', $this->translator->trans('zimbra.event_created_by_chill', locale: $organizerLang)));
$msg = new Msg();
$msg->setSubject($this->translator->trans('zimbra.event_created_trough_soap', locale: $organizerLang))
->setFolderId('10')
->setInvite($inv)
->setMimePart($mp);
$response = $api->createAppointment($msg, echo: true);
$echo = $response->getEcho();
$invite = $echo->getInvite();
$MPInviteInfo = $invite->getInvite();
/** @var InviteComponent $firstInvite */
$firstInvite = $MPInviteInfo->getInviteComponents()[0];
$id = $this->zimbraIdSerializer->serializeId(
$response->getCalItemId(),
$response->getCalInvId(),
$firstInvite->getUid(),
);
var_dump($response);
var_dump($id);
return $id;
}
}

View File

@@ -1,102 +0,0 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\ZimbraBundle\Calendar\Connector\ZimbraConnector;
use Chill\CalendarBundle\Entity\Calendar;
use Chill\CalendarBundle\Entity\CalendarRange;
use Chill\MainBundle\Entity\Location;
use Chill\MainBundle\Templating\Entity\AddressRender;
use Chill\PersonBundle\Entity\Person;
use Chill\PersonBundle\Templating\Entity\PersonRenderInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Zimbra\Common\Enum\FreeBusyStatus;
use Zimbra\Common\Enum\InviteClass;
use Zimbra\Common\Enum\InviteStatus;
use Zimbra\Common\Enum\Transparency;
use Zimbra\Mail\Struct\InviteComponent;
/**
* Class responsible for creating Zimbra invite components based on calendar data.
*/
final readonly class CreateZimbraComponent
{
public function __construct(
private PersonRenderInterface $personRender,
private AddressRender $addressRender,
private DateConverter $dateConverter,
private TranslatorInterface $translator,
) {}
/**
* Creates a Zimbra invite component from the provided calendar object.
*
* The method initializes a new InviteComponent object, sets its properties
* including name, free/busy status, status, classification, transparency,
* all-day and draft status, as well as start and end times. If the calendar
* contains a location, it also sets the location for the invite component.
*
* @param Calendar|CalendarRange $calendar a calendar object containing event data
*
* @return InviteComponent the configured Zimbra invite component
*/
public function createZimbraInviteComponentFromCalendar(Calendar|CalendarRange $calendar): InviteComponent
{
if ($calendar instanceof Calendar) {
$subject = '[Chill] '.
implode(
', ',
$calendar->getPersons()->map(fn (Person $p) => $this->personRender->renderString($p, []))->toArray()
);
} else {
$subject = $this->translator->trans('remote_calendar.calendar_range_title');
}
$comp = new InviteComponent();
$comp->setName($subject)
->setFreeBusy(FreeBusyStatus::BUSY)
->setStatus(InviteStatus::CONFIRMED)
->setCalClass(InviteClass::PUB)
->setTransparency(Transparency::OPAQUE)
->setIsAllDay(false)
->setIsDraft(false)
->setDtStart($this->dateConverter->phpToZimbraDateTime($calendar->getStartDate()))
->setDtEnd($this->dateConverter->phpToZimbraDateTime($calendar->getEndDate()));
if ($calendar->hasLocation()) {
$comp
->setLocation($this->createLocationString($calendar->getLocation()));
}
return $comp;
}
private function createLocationString(Location $location): string
{
$str = '';
if ('' !== ((string) $location->getName())) {
$str .= $location->getName();
$str .= ', ';
}
if ($location->hasAddress()) {
if ('' !== $str) {
$str .= ', ';
}
$str .= $this->addressRender->renderString($location->getAddress(), []);
}
return $str;
}
}

View File

@@ -1,37 +0,0 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\ZimbraBundle\Calendar\Connector\ZimbraConnector;
use Zimbra\Mail\Struct\DtTimeInfo;
/**
* Class DateConverter.
*
* Provides methods for converting PHP DateTime objects
* into specific date-time formats or representations.
*/
final readonly class DateConverter
{
public const FORMAT_DATE_TIME = 'Ymd\THis';
/**
* Converts a PHP DateTimeInterface object into a Zimbra-specific DtTimeInfo object.
*
* @param \DateTimeInterface $date the date to be converted
*
* @return DtTimeInfo the converted DtTimeInfo object
*/
public function phpToZimbraDateTime(\DateTimeInterface $date): DtTimeInfo
{
return new DtTimeInfo($date->format(self::FORMAT_DATE_TIME), $date->getTimezone()->getName());
}
}

View File

@@ -1,78 +0,0 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\ZimbraBundle\Calendar\Connector\ZimbraConnector;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpClient\Psr18Client;
use Symfony\Contracts\HttpClient\HttpClientInterface;
use Zimbra\Common\Enum\AccountBy;
use Zimbra\Common\Soap\ClientFactory;
use Zimbra\Common\Struct\Header\AccountInfo;
use Zimbra\Mail\MailApi;
final readonly class SoapClientBuilder
{
private string $username;
private string $password;
private string $url;
public function __construct(private ParameterBagInterface $parameterBag, private HttpClientInterface $client)
{
$dsn = $this->parameterBag->get('chill_calendar.remote_calendar_dsn');
$url = parse_url($dsn);
$this->username = urldecode($url['user']);
$this->password = urldecode($url['pass']);
if ('zimbra+http' === $url['scheme']) {
$scheme = 'http://';
$port = $url['port'] ?? 80;
} elseif ('zimbra+https' === $url['scheme']) {
$scheme = 'https://';
$port = $url['port'] ?? 443;
} else {
throw new \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException('Unsupported remote calendar scheme: '.$url['scheme']);
}
$this->url = $scheme.$url['host'].':'.$port;
}
private function buildApi(): MailApi
{
$baseClient = $this->client->withOptions([
'base_uri' => $location = $this->url.'/service/soap',
'verify_host' => false,
'verify_peer' => false,
]);
$psr18Client = new Psr18Client($baseClient);
$api = new MailApi();
$client = ClientFactory::create($location, $psr18Client);
$api->setClient($client);
return $api;
}
public function getApiForAccount(string $accountName): MailApi
{
$api = $this->buildApi();
$response = $api->authByAccountName($this->username, $this->password);
$token = $response->getAuthToken();
$apiBy = $this->buildApi();
$apiBy->setAuthToken($token);
$apiBy->setTargetAccount(new AccountInfo(AccountBy::NAME, $accountName));
return $apiBy;
}
}

View File

@@ -1,93 +0,0 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\ZimbraBundle\Calendar\Connector\ZimbraConnector;
use Chill\CalendarBundle\Entity\Calendar;
use Chill\CalendarBundle\Entity\CalendarRange;
use Chill\ZimbraBundle\Exception\CalendarWithoutMainUserException;
use Symfony\Contracts\Translation\TranslatorInterface;
use Zimbra\Mail\Struct\InvitationInfo;
use Zimbra\Mail\Struct\MimePartInfo;
use Zimbra\Mail\Struct\Msg;
/**
* Updates an existing calendar event in Zimbra.
*
* This class handles the modification of existing calendar events in the Zimbra system.
* It uses the Zimbra SOAP API to update event details while maintaining the original
* event's metadata like IDs and sequences.
*/
final readonly class UpdateEvent
{
public function __construct(
private SoapClientBuilder $soapClientBuilder,
private CreateZimbraComponent $createZimbraComponent,
private TranslatorInterface $translator,
private ZimbraIdSerializer $zimbraIdSerializer,
) {}
/**
* Updates an existing calendar event in Zimbra.
*
* @param Calendar|CalendarRange $calendar The calendar event to update
*
* @throws CalendarWithoutMainUserException When the calendar has no associated user email
*/
public function __invoke(Calendar|CalendarRange $calendar): void
{
if ($calendar instanceof Calendar) {
$organizerEmail = $calendar->getMainUser()->getEmail();
$organizerLang = $calendar->getMainUser()->getLocale();
} else {
$organizerEmail = $calendar->getUser()->getEmail();
$organizerLang = $calendar->getUser()->getLocale();
}
if (null === $organizerEmail) {
throw new CalendarWithoutMainUserException();
}
$api = $this->soapClientBuilder->getApiForAccount($organizerEmail);
['calItemId' => $calItemId, 'calInvId' => $calInvId, 'inviteComponentCommonUid' => $inviteComponentCommonUid]
= $this->zimbraIdSerializer->deSerializeId($calendar->getRemoteId());
$existing = $api->getAppointment(sync: true, includeContent: true, includeInvites: true, id: $calItemId);
$appt = $existing->getApptItem();
$comp = $this->createZimbraComponent->createZimbraInviteComponentFromCalendar($calendar);
$comp->setUid($inviteComponentCommonUid);
$inv = new InvitationInfo();
$inv->setInviteComponent($comp)
->setUid($calInvId);
$mp = new MimePartInfo();
$mp->addMimePart(new MimePartInfo('text/plain', $this->translator->trans('zimbra.event_created_by_chill', locale: $organizerLang)));
$msg = new Msg();
$msg->setSubject($this->translator->trans('zimbra.event_created_trough_soap', locale: $organizerLang))
->setFolderId('10')
->setInvite($inv)
->setMimePart($mp)
;
$response = $api->modifyAppointment(
id: $calInvId,
componentNum: 0,
modifiedSequence: $appt->getModifiedSequence(),
revision: $appt->getRevision(),
msg: $msg,
echo: true
);
}
}

View File

@@ -1,67 +0,0 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\ZimbraBundle\Calendar\Connector\ZimbraConnector;
use Chill\ZimbraBundle\Exception\ZimbraCalendarIdNotDeserializedException;
/**
* Serializes and deserializes Zimbra calendar event IDs.
*
* This class handles the conversion between Zimbra's individual ID components
* and a single serialized string format, allowing for consistent storage and retrieval
* of Zimbra calendar event identifiers.
*/
final readonly class ZimbraIdSerializer
{
/**
* Serializes individual Zimbra calendar ID components into a single string.
*
* @param string $calItemId The calendar item ID from Zimbra
* @param string $calInvId The calendar invitation ID from Zimbra
* @param string $inviteComponentCommonUid The common UID for the invite component
*
* @return string The serialized ID in format "calItemId|calInvId|inviteComponentCommonUid|v0"
*/
public function serializeId(string $calItemId, string $calInvId, string $inviteComponentCommonUid): string
{
return sprintf(
'%s|%s|%s|v0',
$calItemId,
$calInvId,
$inviteComponentCommonUid,
);
}
/**
* Deserializes a Zimbra calendar ID string into its component parts.
*
* @param string $remoteId The serialized ID, as stored in the remoteId's Calendar or CalendarRange
*
* @return array{calItemId: string, calInvId: string, inviteComponentCommonUid: string} Associative array containing the ID components
*
* @throws ZimbraCalendarIdNotDeserializedException If the remote ID format is invalid or incompatible
*/
public function deSerializeId(string $remoteId): array
{
if (!str_ends_with($remoteId, 'v0')) {
throw new ZimbraCalendarIdNotDeserializedException();
}
$exploded = explode('|', $remoteId);
return [
'calItemId' => $exploded[0],
'calInvId' => $exploded[1],
'inviteComponentCommonUid' => $exploded[2],
];
}
}

View File

@@ -1,16 +0,0 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\ZimbraBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class ChillZimbraBundle extends Bundle {}

View File

@@ -1,178 +0,0 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\ZimbraBundle\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\HttpClient\Psr18Client;
use Symfony\Contracts\HttpClient\HttpClientInterface;
use Zimbra\Common\Enum\AccountBy;
use Zimbra\Common\Enum\FreeBusyStatus;
use Zimbra\Common\Enum\InviteClass;
use Zimbra\Common\Enum\InviteStatus;
use Zimbra\Common\Enum\ItemType;
use Zimbra\Common\Enum\Transparency;
use Zimbra\Common\Soap\ClientFactory;
use Zimbra\Common\Struct\Header\AccountInfo;
use Zimbra\Mail\MailApi;
use Zimbra\Mail\Struct\DtTimeInfo;
use Zimbra\Mail\Struct\Folder;
use Zimbra\Mail\Struct\GetFolderSpec;
use Zimbra\Mail\Struct\InvitationInfo;
use Zimbra\Mail\Struct\InviteComponent;
use Zimbra\Mail\Struct\MimePartInfo;
use Zimbra\Mail\Struct\Msg;
class TestCommand extends Command
{
public function __construct(private HttpClientInterface $client)
{
parent::__construct();
}
public function getName()
{
return 'chill:zimbra:test';
}
public function execute(InputInterface $input, OutputInterface $output)
{
$this->getAppointments($this->createApiForJulien());
// $this->createAppointment($this->createApiForJulien());
// $api = $this->createApiForJulienDelegated();
// $this->createAppointment($api);
return Command::SUCCESS;
}
public function createApiForJulienDelegated(): MailApi
{
$baseClient = $this->client->withOptions([
'base_uri' => $location = 'https://zimbra.cldev.ours/service/soap',
'verify_host' => false,
'verify_peer' => false,
]);
$psr18Client = new Psr18Client($baseClient);
$api = new MailApi();
$client = ClientFactory::create($location, $psr18Client);
$api->setClient($client);
$response = $api->authByAccountName('chill@zimbra.cldev.ours', 'password');
$token = $response->getAuthToken();
var_dump($token);
$apiBy = new MailApi();
$apiBy->setClient($client);
$apiBy->setAuthToken($token);
$apiBy->setTargetAccount(new AccountInfo(AccountBy::NAME, 'julien@zimbra.cldev.ours'));
return $apiBy;
}
private function createApiForJulien(): MailApi
{
$baseClient = $this->client->withOptions([
'base_uri' => $location = 'https://zimbra.cldev.ours/service/soap',
'verify_host' => false,
'verify_peer' => false,
]);
$psr18Client = new Psr18Client($baseClient);
$api = new MailApi();
$client = ClientFactory::create($location, $psr18Client);
$api->setClient($client);
$api->authByAccountName('julien@zimbra.cldev.ours', 'Password;1234');
return $api;
}
private function updateAppointment(MailApi $api): void
{
$appointment = $api->getAppointment(id: '69ec3b5e-9f83-4467-a151-a99bc64cfb38:376');
}
private function createAppointment(MailApi $api): void
{
$date = new \DateTimeImmutable('2025-12-03T18:00:00Z');
$comp = new InviteComponent();
$comp->setName('Test Appointment by chill')
->setLocation('Test Location')
->setFreeBusy(FreeBusyStatus::BUSY)
->setStatus(InviteStatus::CONFIRMED)
->setCalClass(InviteClass::PUB)
->setTransparency(Transparency::OPAQUE)
->setIsAllDay(false)
->setIsDraft(false)
->setDtStart(new DtTimeInfo($date->format('Ymd\THis'), 'Europe/Brussels'))
->setDtEnd(new DtTimeInfo($date->add(new \DateInterval('PT1H'))->format('Ymd\THis'), 'Europe/Brussels'));
$inv = new InvitationInfo();
$inv->setInviteComponent($comp);
$mp = new MimePartInfo();
$mp->addMimePart(new MimePartInfo('text/plain', 'Appointment create via soap'));
$msg = new Msg();
$msg->setSubject('Réunion créée via soap')
->setFolderId('10')
->setInvite($inv)
->setMimePart($mp);
$response = $api->createAppointment($msg, echo: true);
var_dump($response->getEcho());
}
private function getAppointments(MailApi $api): void
{
// $folders = $api->getFolder(new GetFolderSpec(folderId: 10));
$foldersResponse = $api->getFolder(viewConstraint: ItemType::APPOINTMENT->value);
$calendarFolders = [];
foreach ($foldersResponse->getFolder()->getSubfolders() as $folder) {
if ($folder instanceof Folder) {
var_dump($folder->getView()?->value);
if ($folder->getView()?->value === ItemType::APPOINTMENT->value) {
var_dump('found a calendar');
$calendarFolders[] = $folder;
}
} else {
var_dump('not a calendar:'.$folder->getView());
}
}
$since = new \DateTimeImmutable('2025-11-28');
$until = new \DateTimeImmutable('2025-11-29');
$allAppointments = [];
foreach ($calendarFolders as $calendarFolder) {
$appointmentIdsInRange = $api
->getAppointmentIdsInRange($since->getTimestamp() * 1000, $until->getTimestamp() * 1000, $calendarFolder->getId())
->getAppointmentData()
;
$allAppointments = [...$allAppointments, ...$appointmentIdsInRange];
}
var_dump($allAppointments);
foreach ($allAppointments as $appointment) {
var_dump($appointment->getId());
$fetched = $api->getAppointment(id: $appointment->getId());
var_dump($fetched);
}
}
}

View File

@@ -1,26 +0,0 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\ZimbraBundle\DependencyInjection;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\Extension;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
class ChillZimbraExtension extends Extension
{
public function load(array $configs, ContainerBuilder $container)
{
$loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../config'));
$loader->load('services.yaml');
}
}

View File

@@ -1,14 +0,0 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\ZimbraBundle\Exception;
class CalendarWithoutMainUserException extends \RuntimeException {}

View File

@@ -1,14 +0,0 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\ZimbraBundle\Exception;
class ZimbraCalendarIdNotDeserializedException extends \RuntimeException {}

View File

@@ -1,11 +0,0 @@
services:
_defaults:
autoconfigure: true
autowire: true
Chill\ZimbraBundle\Command\:
resource: '../Command'
tags: ['console.command']
Chill\ZimbraBundle\Calendar\:
resource: '../Calendar'

View File

@@ -1,3 +0,0 @@
zimbra:
event_created_by_chill: Événement créé par Chill
event_created_trough_soap: Événement créé via l'API SOAP

View File

@@ -3,7 +3,6 @@ parameters:
paths:
- src/
- utils/
- packages/
tmpDir: var/cache/phpstan
reportUnmatchedIgnoredErrors: false
excludePaths:

View File

@@ -382,6 +382,7 @@ final class ActivityController extends AbstractController
$entity = new Activity();
$entity->setUser($this->security->getUser());
$entity->addUser($this->security->getUser());
if ($person instanceof Person) {
$entity->setPerson($person);

View File

@@ -0,0 +1,50 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\Migrations\Activity;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Migration fixing the automatic association of users to activities (exchanges).
*
* Originally, the user who created an exchange was not automatically associated
* to it (the "TMS" column), which led to incomplete data and biased statistics.
*
* This migration:
* - retroactively associates the creator of each exchange to the corresponding
* activity;
* - flags these backfilled associations with a temporary column so it is clear
* they were added by this data correction and can be safely cleaned up later.
*/
final class Version20251118124241 extends AbstractMigration
{
public function getDescription(): string
{
return 'Insert the creator of activity into the activity_user table';
}
public function up(Schema $schema): void
{
$this->addSql('ALTER TABLE activity_user ADD COLUMN by_migration BOOL DEFAULT FALSE');
$this->addSql("COMMENT ON COLUMN activity_user.by_migration IS 'For backup purpose - can be safely deleted after a while. See migration \\Chill\\Migrations\\Activity\\Version20251118124241'");
$this->addSql('INSERT INTO activity_user (activity_id, user_id, by_migration)
SELECT id, user_id, true FROM activity
ON CONFLICT DO NOTHING');
}
public function down(Schema $schema): void
{
$this->addSql('ALTER TABLE activity_user DROP COLUMN by_migration');
}
}

View File

@@ -0,0 +1,18 @@
export:
filter:
activity:
course_having_activity_between_date:
Only course having an activity between from and to: Alleen trajecten met een activiteit tussen {from, date, short} en {to, date, short}
acp_by_activity_type:
'acp_containing_at_least_one_activitytypes': >-
Gefilterde trajecten: alleen die welke ten minste één activiteit bevatten van een van de volgende types: {activitytypes}
{has_date_after, select, 1 {, na {date_after, date}} other {}}
{has_date_before, select, 1 {, voor {date_before, date}} other {}}
describe_action_with_no_subject: >-
Gefilterd op persoon die een activiteit had tussen {date_from, date} en {date_to, date}
describe_action_with_subject: >-
Gefilterd op persoon die een activiteit had tussen {date_from, date} en {date_to, date}, en een van deze gekozen onderwerpen: {reasons}
activity:
title: Activiteit van {date, date, long} - {type}

View File

@@ -1,234 +1,500 @@
#general
Show the activity: Toon activiteit
Edit the activity: Wijzig activiteit
Activity: Activiteit
Show the activity: Uitwisseling bekijken
Edit the activity: Uitwisseling bewerken
Activity: Uitwisseling
Duration time: Duur
Duration Time: Duur
durationTime: duur
Travel time: Duur van verplaatsing
Attendee: Aanwezigheden
attendee: aanwezigheden
list_reasons: Onderwerpen
user_username: gebruikersnaam
circle_name: naam kring
Travel time: Reisduur
Attendee: Aanwezigheid van de gebruiker
attendee: aanwezigheid van de gebruiker
list_reasons: lijst van onderwerpen
user_username: naam van de gebruiker
circle_name: naam van de dienst
Remark: Opmerking
No comments: Geen opmerkingen
Add a new activity: Voeg een nieuwe activiteit toe
Activity list: Lijst van activiteiten
No comments: Geen opmerking
Add a new activity: Nieuwe uitwisseling toevoegen
Activity list: Lijst van uitwisselingen
present: aanwezig
not present: afwezig
Delete: Verwijderen
Update: Bijwerken
Update activity: Activieit bijwerken
Scope: Werkingsgebied
Activity data: Gegevens activiteit
Activity location: Locatie activiteit
Update activity: Uitwisseling bewerken
Scope: Dienst
Activity data: Gegevens van de uitwisseling
Activity location: Locatie van de uitwisseling
No reason associated: Geen onderwerp
No social issues associated: Geen sociaal vraagstuk
No social actions associated: Geen maatschappelijke actie
There isn't any activities.: Er zijn geen activiteiten
type_name: Soort activiteit
No social issues associated: Geen sociale problematiek
No social actions associated: Geen begeleidingsactie
There isn't any activities.: Geen uitwisseling geregistreerd.
type_name: type van de uitwisseling
person_firstname: voornaam
person_lastname: familienaam
person_id: Identificatienummer persoon
Type: Soort
person_lastname: achternaam
person_id: identificatie van de gebruiker
Type: Type
Invisible: Onzichtbaar
Optional: Optioneel
Required: Verplicht
Persons: Personen
Persons: Gebruikers
Users: Gebruikers
Emergency: Dringend
Emergency: Urgent
Sent received: Inkomend / Uitgaand
Sent: Verzenden
Received: Ontvangen
by: 'Door '
location: Plaats
Reasons: Onderwerpen
Private comment: Privé opmerking
sent: Verzonden
received: Ontvangen
#forms
Activity creation: Nouvel échange
Create: Créer
Back to the list: Retour à la liste
Save activity: Sauver l'échange
Reset form: Remise à zéro du formulaire
Choose the duration: Choisir la durée
Choose a type: Choisir un type
5 minutes: 5 minutes
10 minutes: 10 minutes
15 minutes: 15 minutes
20 minutes: 20 minutes
25 minutes: 25 minutes
30 minutes: 30 minutes
45 minutes: 45 minutes
1 hour: 1 heure
1 hour 15: 1 heure 15
1 hour 30: 1 heure 30
1 hour 45: 1 heure 45
2 hours: 2 heures
Concerned groups: Parties concernées
Persons in accompanying course: Usagers du parcours
Third persons: Tiers non-pro.
Others persons: Usagers
Third parties: Tiers professionnels
Activity creation: Nieuwe uitwisseling
Create: Aanmaken
Back to the list: Terug naar de lijst
Save activity: Uitwisseling opslaan
Reset form: Formulier resetten
Choose the duration: Duur kiezen
Choose a type: Type kiezen
5 minutes: 5 minuten
10 minutes: 10 minuten
15 minutes: 15 minuten
20 minutes: 20 minuten
25 minutes: 25 minuten
30 minutes: 30 minuten
45 minutes: 45 minuten
1 hour: 1 uur
1 hour 15: 1 uur 15
1 hour 30: 1 uur 30
1 hour 45: 1 uur 45
2 hours: 2 uur
2 hours 15: 2 uur 15
2 hours 30: 2 uur 30
2 hours 45: 2 uur 45
3 hours: 3 uur
3 hours 30: 3 uur 30
4 hours: 4 uur
4 hours 30: 4 uur 30
5 hours: 5 uur
5 hours 30: 5 uur 30
6 hours: 6 uur
6 hours 30: 6 uur 30
7 hours: 7 uur
7 hours 30: 7 uur 30
8 hours: 8 uur
8 hours 30: 8 uur 30
9 hours: 9 uur
9 hours 30: 9 uur 30
10 hours: 10 uur
11 hours: 11 uur
12 hours: 12 uur
Concerned groups: Betrokken partijen bij de uitwisseling
Persons in accompanying course: Gebruikers van het traject
Third persons: Niet-prof. derden
Others persons: Gebruikers
Third parties: Professionele derden
Users concerned: T(M)S
activity:
Insert a document: Insérer un document
Remove a document: Supprimer le document
comment: Commentaire
No documents: Aucun document
date: Datum van de uitwisseling
Insert a document: Document invoegen
Remove a document: Document verwijderen
comment: Opmerking
deleted: Uitwisseling verwijderd
errors: Het formulier bevat fouten
social_issues: Sociale problematieken
choose_other_social_issue: Andere sociale problematiek toevoegen...
social_actions: Begeleidingsacties
select_first_a_social_issue: Selecteer eerst een sociale problematiek
social_action_list_empty: Geen sociale actie beschikbaar
add_persons: Betrokken personen toevoegen
bloc_persons: Gebruikers
bloc_persons_associated: Gebruikers van het traject
bloc_persons_not_associated: Niet-prof. derden
bloc_thirdparty: Professionele derden
bloc_users: T(M)S
location: Locatie
choose_location: Kies een locatie
choose_location_type: Kies een type locatie
create_new_location: Nieuwe locatie aanmaken
location_fields:
name: Naam
type: Type
phonenumber1: Telefoon
phonenumber2: Andere telefoon
email: E-mailadres
create_address: Adres aanmaken
edit_address: Adres bewerken
No documents: Geen document
# activity filter in list page
activity_filter:
My activities: Mijn uitwisselingen (waar ik aan deelneem)
Types: Op type uitwisseling
Jobs: Op betrokken beroep
#timeline
'%user% has done an %activity_type%': '%user% a effectué un échange de type "%activity_type%"'
'%user% has done an %activity_type%': '%user% heeft een uitwisseling van type "%activity_type%" uitgevoerd'
#controller
'Success : activity created!': L'échange a été créé.
'The form is not valid. The activity has not been created !': Le formulaire est invalide. L'échange n'a pas été créé.
'Success : activity updated!': L'échange a été mis à jour.
'The form is not valid. The activity has not been updated !': Le formulaire est invalide. L'échange n'a pas été mis à jour.
'Success : activity created!': De uitwisseling is aangemaakt.
'The form is not valid. The activity has not been created !': Het formulier is ongeldig. De uitwisseling is niet aangemaakt.
'Success : activity updated!': De uitwisseling is bijgewerkt.
'The form is not valid. The activity has not been updated !': Het formulier is ongeldig. De uitwisseling is niet bijgewerkt.
# ROLES
CHILL_ACTIVITY_CREATE: Créer un échange
CHILL_ACTIVITY_UPDATE: Modifier un échange
CHILL_ACTIVITY_SEE: Voir un échange
CHILL_ACTIVITY_SEE_DETAILS: Voir le détail des échanges
CHILL_ACTIVITY_DELETE: Supprimer un échange
CHILL_ACTIVITY_STATS: Statistique des échanges
CHILL_ACTIVITY_LIST: Liste des échanges
CHILL_ACTIVITY_CREATE: Uitwisseling aanmaken
CHILL_ACTIVITY_UPDATE: Uitwisseling bewerken
CHILL_ACTIVITY_SEE: Uitwisseling bekijken
CHILL_ACTIVITY_SEE_DETAILS: Detail van uitwisselingen bekijken
CHILL_ACTIVITY_DELETE: Uitwisseling verwijderen
CHILL_ACTIVITY_STATS: Statistieken van uitwisselingen
CHILL_ACTIVITY_LIST: Lijst van uitwisselingen
CHILL_ACTIVITY_CREATE_PERSON: Uitwisseling aanmaken gekoppeld aan een gebruiker
CHILL_ACTIVITY_CREATE_ACCOMPANYING_COURSE: Uitwisseling aanmaken gekoppeld aan een traject
CHILL_ACTIVITY_FULL: Details bekijken, aanmaken, verwijderen en bijwerken van een uitwisseling
# admin
Activities: Échanges
Activity configuration: Configuration des échanges
Activity configuration menu: Configuration des échanges
Activity types: Types d'échange
Activity type configuration: Configuration des categories d'échanges
Activity Reasons: Sujets d'un échange
Activity Reasons Category: Catégories de sujet d'échanges
Activity Types Categories: Catégories des types d'échanges
Activity Presences: Presences des échanges
Activities: Uitwisselingen
Activity configuration: Configuratie van uitwisselingen
Activity configuration menu: Configuratie van uitwisselingen
Activity types: Types uitwisseling
Activity type configuration: Configuratie van categorieën van uitwisselingen
Activity Reasons: Onderwerpen van een uitwisseling
Activity Reasons Category: Categorieën van onderwerpen van uitwisselingen
Activity Types Categories: Categorieën van types uitwisseling
Activity Presences: Aanwezigheden bij uitwisselingen
Associated activity reason category is inactive: De gekoppelde onderwerpscategorie is inactief
# Crud
crud:
activity_type:
title_new: Nouveau type d'échange
title_edit: Edition d'un type d'échange
title_new: Nieuw type uitwisseling
title_edit: Type uitwisseling bewerken
activity_type_category:
title_new: Nouvelle catégorie de type d'échange
title_edit: Edition d'une catégorie de type d'échange
title_new: Nieuwe categorie van type uitwisseling
title_edit: Categorie van type uitwisseling bewerken
activity_presence:
title_new: Nieuwe aanwezigheid bij uitwisselingen
title_edit: Aanwezigheid bij uitwisselingen bewerken
# activity reason admin
ActivityReason list: Liste des sujets
Create a new activity reason: Créer un nouveau sujet
Active: Actif
Category: Catégorie
ActivityReason creation: Nouveau sujet
ActivityReason edit: Modification d'un sujet
ActivityReason: Sujet d'échange
The entity is inactive and won't be proposed: Le sujet est inactif et ne sera pas proposé
The entity is active and will be proposed: Le sujet est actif et sera proposé
ActivityReason list: Lijst van onderwerpen
Create a new activity reason: Nieuw onderwerp aanmaken
Active: Actief
Category: Categorie
ActivityReason creation: Nieuw onderwerp
ActivityReason edit: Onderwerp bewerken
ActivityReason: Onderwerp van uitwisseling
The entity is inactive and won't be proposed: Het onderwerp is inactief en zal niet worden voorgesteld
The entity is active and will be proposed: Het onderwerp is actief en zal worden voorgesteld
#activity reason category admin
ActivityReasonCategory list: Catégories de sujets
Create a new activity category reason: Créer une nouvelle catégorie
ActivityReasonCategory creation: Nouvelle catégorie de sujet
ActivityReasonCategory edit: Modification d'une catégorie de sujet
ActivityReasonCategory: Catégorie de sujet d'échange
ActivityReasonCategory is active and will be proposed: La catégorie est active et sera proposée
ActivityReasonCategory is inactive and won't be proposed: La catégorie est inactive et ne sera pas proposée
ActivityReasonCategory list: Categorieën van onderwerpen
Create a new activity category reason: Nieuwe categorie aanmaken
ActivityReasonCategory creation: Nieuwe categorie van onderwerp
ActivityReasonCategory edit: Categorie van onderwerp bewerken
ActivityReasonCategory: Categorie van onderwerp van uitwisseling
ActivityReasonCategory is active and will be proposed: De categorie is actief en zal worden voorgesteld
ActivityReasonCategory is inactive and won't be proposed: De categorie is inactief en zal niet worden voorgesteld
#activity presence admin
ActivityPresence list: Lijst van aanwezigheden bij uitwisselingen
Create a new activity presence: Nieuwe "Aanwezigheid bij uitwisselingen" aanmaken
# activity type type admin
ActivityType list: Types d'échanges
Create a new activity type: Créer un nouveau type d'échange
Persons visible: Visibilité du champ Personnes
Persons label: Libellé du champ Personnes
User visible: Visibilité du champ Utilisateur
User label: Libellé du champ Utilisateur
Date visible: Visibilité du champ Date
Date label: Libellé du champ Date
Location visible: Visibilité du champ Lieu
Location label: Libellé du champ Lieu
Third parties visible: Visibilité du champ Tiers
Third parties label: Libellé du champ Tiers
Duration time visible: Visibilité du champ Durée
Duration time label: Libellé du champ Durée
Travel time visible: Visibilité du champ Durée de déplacement
Travel time label: Libellé du champ Durée de déplacement
Attendee visible: Visibilité du champ Présence de l'usager
Attendee label: Libellé du champ Présence de l'usager
Reasons visible: Visibilité du champ Sujet
Reasons label: Libellé du champ Sujet
Comment visible: Visibilité du champ Commentaire
Comment label: Libellé du champ Commentaire
Emergency visible: Visibilité du champ Urgent
Emergency label: Libellé du champ Urgent
Accompanying period visible: Visibilité du champ Période d'accompagnement
Accompanying period label: Libellé du champ Période d'accompagnement
Social issues visible: Visibilité du champ Problématiques sociales
Social issues label: Libellé du champ Problématiques sociales
Social actions visible: Visibilité du champ Action sociale
Social actions label: Libellé du champ Action sociale
Users visible: Visibilité du champ Utilisateurs
Users label: Libellé du champ Utilisateurs
Sent received visible: Visibilité du champ Entrant / Sortant
Sent received label: Libellé du champ Entrant / Sortant
Documents visible: Visibilité du champ Documents
Documents label: Libellé du champ Documents
ActivityType list: Types uitwisselingen
Create a new activity type: Nieuw type uitwisseling aanmaken
Persons visible: Zichtbaarheid van het veld Gebruikers
Persons label: Label van het veld Gebruikers
User visible: Zichtbaarheid van het veld Gebruiker
User label: Label van het veld Gebruiker
Date visible: Zichtbaarheid van het veld Datum
Date label: Label van het veld Datum
Location visible: Zichtbaarheid van het veld Plaats
Location label: Label van het veld Plaats
Third parties visible: Zichtbaarheid van het veld Derden
Third parties label: Label van het veld Derden
Duration time visible: Zichtbaarheid van het veld Duur
Duration time label: Label van het veld Duur
Travel time visible: Zichtbaarheid van het veld Reisduur
Travel time label: Label van het veld Reisduur
Attendee visible: Zichtbaarheid van het veld Aanwezigheid van de gebruiker
Attendee label: Label van het veld Aanwezigheid van de gebruiker
Reasons visible: Zichtbaarheid van het veld Onderwerp
Reasons label: Label van het veld Onderwerp
Comment visible: Zichtbaarheid van het veld Opmerking
Comment label: Label van het veld Opmerking
Private comment visible: Zichtbaarheid van het veld Privé Opmerking
Private comment label: Label van het veld Privé Opmerking
Emergency visible: Zichtbaarheid van het veld Urgent
Emergency label: Label van het veld Urgent
Accompanying period visible: Zichtbaarheid van het veld begeleidingstraject
Accompanying period label: Label van het veld begeleidingstraject
Social issues visible: Zichtbaarheid van het veld Sociale problematieken
Social issues label: Label van het veld Sociale problematieken
Social actions visible: Zichtbaarheid van het veld Sociale actie
Social actions label: Label van het veld Sociale actie
Users visible: Zichtbaarheid van het veld Gebruikers
Users label: Label van het veld Gebruikers
Sent received visible: Zichtbaarheid van het veld Inkomend / Uitgaand
Sent received label: Label van het veld Inkomend / Uitgaand
Documents visible: Zichtbaarheid van het veld Documenten
Documents label: Label van het veld Documenten
# activity type category admin
ActivityTypeCategory list: Liste des catégories des types d'activité
Create a new activity type category: Créer une nouvelle catégorie de type d'échange
ActivityTypeCategory list: Lijst van categorieën van types uitwisseling
Create a new activity type category: Nieuwe categorie van type uitwisseling aanmaken
Create a new activity in accompanying course: Uitwisseling aanmaken in het traject
# activity delete
Remove activity: Supprimer un échange
Are you sure you want to remove the activity about "%name%" ?: Êtes-vous sûr de vouloir supprimer un échange qui concerne "%name%" ?
The activity has been successfully removed.: L'échange a été supprimée.
Remove activity: Uitwisseling verwijderen
Are you sure you want to remove the activity about "%name%" ?: Weet u zeker dat u een uitwisseling wilt verwijderen die betrekking heeft op "%name%"?
The activity has been successfully removed.: De uitwisseling is verwijderd.
# exports
Count activities: Nombre d'échanges
Count activities by various parameters.: Compte le nombre d'échanges enregistrées en fonction de différents paramètres.
Sum activity duration: Total de la durée des échanges
Sum activities duration by various parameters.: Additionne la durée des échanges en fonction de différents paramètres.
List activities: Liste les échanges
Number of activities: Nombre d'échanges
Exports of activities linked to a person: Exports van uitwisselingen gekoppeld aan een gebruiker
Number of activities linked to a person: Aantal uitwisselingen gekoppeld aan een gebruiker
Count activities linked to a person: Aantal uitwisselingen
Count activities linked to a person by various parameters.: Telt het aantal geregistreerde uitwisselingen gekoppeld aan een gebruiker op basis van verschillende parameters.
Sum activity linked to a person duration: Duur van uitwisselingen
Sum activities linked to a person duration: Duur van uitwisselingen gekoppeld aan een gebruiker
Sum activities linked to a person duration by various parameters.: Telt de duur van uitwisselingen op basis van verschillende parameters.
List activity linked to a person: Uitwisselingen opsommen
List activities linked to a person: Lijst van uitwisselingen gekoppeld aan een gebruiker
List activities linked to a person description: Maakt de lijst van uitwisselingen op basis van verschillende parameters.
Exports of activities linked to an accompanying period: Exports van uitwisselingen gekoppeld aan een traject
Number of activities linked to an accompanying period: Aantal uitwisselingen gekoppeld aan een traject
Count activities linked to an accompanying period: Aantal uitwisselingen
Count activities linked to an accompanying period by various parameters.: Telt het aantal geregistreerde uitwisselingen gekoppeld aan een traject op basis van verschillende parameters.
Sum activity linked to an accompanying period duration: Som van de duur van uitwisselingen
Sum activities linked to an accompanying period duration: Som van de duur van uitwisselingen gekoppeld aan een traject
Sum activities linked to an accompanying period duration by various parameters.: Telt de duur van uitwisselingen op basis van verschillende parameters.
Sum activity linked to an accompanying period visit duration: Som van de reisduur van uitwisselingen
Sum activities linked to an accompanying period visit duration: Som van de reisduur van uitwisselingen gekoppeld aan een traject
Sum activities linked to an accompanying period visit duration by various parameters.: Telt de reisduur van uitwisselingen op basis van verschillende parameters.
Average activity linked to an accompanying period duration: Gemiddelde van de duur van uitwisselingen
Average activities linked to an accompanying period duration: Gemiddelde van de duur van uitwisselingen gekoppeld aan een traject
Average activities linked to an accompanying period duration by various parameters.: Gemiddelde van de duur van uitwisselingen op basis van verschillende parameters.
Average activity linked to an accompanying period visit duration: Gemiddelde van de reisduur van uitwisselingen
Average activities linked to an accompanying period visit duration: Gemiddelde van de reisduur van uitwisselingen gekoppeld aan een traject
Average activities linked to an accompanying period visit duration by various parameters.: Gemiddelde van de reisduur van uitwisselingen op basis van verschillende parameters.
#filters
Filter by reason: Filtrer par sujet d'activité
'Filtered by reasons: only %list%': 'Filtré par sujet: seulement %list%'
'Filtered by activity type: only %list%': "Filtré par type d'activity: uniquement %list%"
Filtered by date activity: Filtrer par date d'activité
Activities after this date: Activités après cette date
Activities before this date: Activités avant cette date
"Filtered by date of activity: only between %date_from% and %date_to%": "Filtré par date de l'activité: uniquement entre %date_from% et %date_to%"
This date should be after the date given in "Implied in an activity after this date" field: Cette date devrait être postérieure à la date donnée dans le champ "activités après cette date"
Filter by reason: Uitwisselingen filteren op onderwerp
'Filtered by reasons: only %list%': 'Gefilterd op onderwerp: alleen %list%'
'Filtered by activity type: only %list%': "Gefilterd op type uitwisseling: alleen %list%"
Filtered by date activity: Uitwisselingen filteren op datum
Activities after this date: Uitwisselingen na deze datum
Activities before this date: Uitwisselingen vóór deze datum
"Filtered by date of activity: only between %date_from% and %date_to%": "Gefilterd op datum van de uitwisseling: alleen tussen %date_from% en %date_to%"
This date should be after the date given in "Implied in an activity after this date" field: Deze datum moet later zijn dan de datum in het veld "uitwisselingen na deze datum"
Filtered by person having an activity in a period: Uniquement les personnes ayant eu une activité dans la période donnée
Implied in an activity after this date: Impliqué dans une activité après cette date
Implied in an activity before this date: Impliqué dans une activité avant cette date
Filtered by person having an activity between %date_from% and %date_to% with reasons %reasons_name%: Filtré par personnes associées à une activité entre %date_from% et %date_to% avec les sujets %reasons_name%
Activity reasons for those activities: Sujets de ces activités
Filter by activity type: Filtrer par type d'activité
Filter by activity type: Uitwisselingen filteren op type
Filter activity by location: Uitwisselingen filteren op locatie
'Filtered activity by location: only %locations%': "Gefilterd op locatie: alleen %locations%"
Filter activity by locationtype: Uitwisselingen filteren op type locatie
'Filtered activity by locationtype: only %types%': "Gefilterd op type locatie: alleen %types%"
Accepted locationtype: Types locatie
Accepted users: TMS(en)
Filter activity by emergency: Uitwisselingen filteren op urgentie
'Filtered activity by emergency: only %emergency%': "Gefilterd op urgentie: alleen als %emergency%"
activity is emergency: de uitwisseling is urgent
activity is not emergency: de uitwisseling is niet urgent
Filter activity by sentreceived: Uitwisselingen filteren op verzonden/ontvangen
'Filtered activity by sentreceived: only %sentreceived%': "Gefilterd op verzonden/ontvangen: alleen %sentreceived%"
Accepted sentreceived: ''
Filter activity by linked socialaction: Uitwisselingen filteren op gekoppelde actie
'Filtered activity by linked socialaction: only %actions%': "Gefilterd op gekoppelde actie: alleen %actions%"
Filter activity by linked socialissue: Uitwisselingen filteren op gekoppelde problematiek
'Filtered activity by linked socialissue: only %issues%': "Gefilterd op gekoppelde problematiek: alleen %issues%"
Filter activity by user: Uitwisselingen filteren op hoofdgebruiker
Filter activity by users: Uitwisselingen filteren op deelnemende gebruiker
Filter activity by creator: Uitwisselingen filteren op aanmaker van de uitwisseling
'Filtered activity by user: only %users%': "Gefilterd op referent: alleen %users%"
'Filtered activity by users: only %users%': "Gefilterd op deelnemende gebruikers: alleen %users%"
'Filtered activity by creator: only %users%': "Gefilterd op aanmaker: alleen %users%"
Creators: Aanmakers
Accepted userscope: Diensten
Filter acp which has no activity: Trajecten filteren die geen uitwisseling hebben
Filtered acp which has no activities: Trajecten zonder gekoppelde uitwisseling filteren
Group acp by activity number: Trajecten groeperen op aantal uitwisselingen
#aggregators
Activity type: Type d'activité
Activity user: Utilisateur lié à l'activity
By reason: Par sujet
By category of reason: Par catégorie de sujet
Reason's level: Niveau du sujet
Group by reasons: Sujet d'activité
Aggregate by activity user: Grouper par utilisateur lié à l'activité
Aggregate by activity type: Grouper par type d'activité
Aggregate by activity reason: Grouper par sujet de l'activité
Activity type: Type uitwisseling
Activity user: Gebruiker gekoppeld aan de uitwisseling
By reason: Op onderwerp
By category of reason: Op categorie van onderwerp
Reason's level: Niveau van het onderwerp
Group by reasons: Onderwerp van uitwisseling
Aggregate by activity user: Uitwisselingen groeperen op referent
Aggregate by activity users: Uitwisselingen groeperen op deelnemende gebruikers
Aggregate by activity type: Uitwisselingen groeperen op type
Aggregate by activity reason: Uitwisselingen groeperen op onderwerp
Last activities: Les dernières activités
Group activity by locationtype: Uitwisselingen groeperen op type locatie
Group activity by date: Uitwisselingen groeperen op datum
Frequency: Frequentie
by month: Per maand
by week: Per week
for week: Week
by year: Per jaar
in year: In
Group activity by creator: Uitwisselingen groeperen op aanmaker van de uitwisseling
Group activity by linked thirdparties: Uitwisselingen groeperen op betrokken derde
Accepted thirdparty: Betrokken derde
Group activity by linked socialaction: Uitwisselingen groeperen op gekoppelde actie
Group activity by linked socialissue: Uitwisselingen groeperen op gekoppelde problematiek
Group activity by userscope: Uitwisselingen groeperen op dienst van de aanmaker
See activity in accompanying course context: Voir l'activité dans le contexte du parcours d'accompagnement
Last activities: De laatste uitwisselingen
You get notified of an activity which does not exists any more: Cette notification ne correspond pas à une activité valide.
you are not allowed to see it details: La notification fait référence à une activité à laquelle vous n'avez pas accès.
This is the minimal activity data: Activité n°
See activity in accompanying course context: Uitwisseling bekijken in de context van het begeleidingstraject
You get notified of an activity which does not exists any more: Deze melding komt niet overeen met een geldige uitwisseling.
you are not allowed to see it details: De melding verwijst naar een uitwisseling waartoe u geen toegang hebt.
This is the minimal activity data: Uitwisseling nr.
docgen:
Activity basic: Echange
A basic context for activity: Contexte pour les activités
Activity basic: Uitwisseling
A basic context for activity: Context voor uitwisselingen
Accompanying period with a list of activities: Begeleidingstraject met lijst van uitwisselingen
Accompanying period with a list of activities description: Deze context neemt de informatie van het traject over, en alle uitwisselingen voor een traject. De uitwisselingen worden niet gefilterd.
myActivitiesOnly: Alleen rekening houden met uitwisselingen waarin ik heb deelgenomen
myWorksOnly: Alleen rekening houden met begeleidingsacties waarvan ik referent ben
export:
export:
count_person_on_activity:
title: Aantal betrokken gebruikers bij uitwisselingen
description: Telt het aantal betrokken gebruikers bij uitwisselingen. Als een gebruiker aanwezig is in meerdere uitwisselingen, wordt hij slechts één keer geteld.
header: Aantal betrokken gebruikers bij uitwisselingen
count_household_on_activity:
title: Aantal betrokken huishoudens bij uitwisselingen
description: Telt het aantal betrokken huishoudens bij uitwisselingen. Als een huishouden aanwezig is in meerdere uitwisselingen, wordt het slechts één keer geteld. Gebruikers zonder huishouden worden niet geteld.
header: Aantal betrokken huishoudens bij uitwisselingen
count_household_on_activity_person:
title: Aantal betrokken huishoudens bij uitwisselingen
description: Telt het aantal betrokken huishoudens bij uitwisselingen. Als een huishouden aanwezig is in meerdere uitwisselingen, wordt het slechts één keer geteld. Gebruikers zonder huishouden worden niet geteld. Wanneer een gebruiker van huishouden verandert, wordt elk huishouden één keer geteld.
header: Aantal betrokken huishoudens bij uitwisselingen
list:
activity:
users name: Naam van de gebruikers
users ids: Identificatie van de gebruikers
third parties ids: Identificatie van de derden
persons ids: Identificatie van de gebruikers
persons name: Naam van de gebruikers
thirds parties: Derden
date: Datum van de uitwisseling
locationName: Locatie
sent received: Verzonden of ontvangen
emergency: Urgentie
accompanying course id: Identificatie van het traject
course circles: Diensten van het traject
travelTime: Reisduur
durationTime: Duur
id: Identificatie
List activities linked to an accompanying course: Somt uitwisselingen op gekoppeld aan een traject op basis van verschillende filters.
List activity linked to a course: Lijst van uitwisselingen gekoppeld aan een traject
commentText: Opmerking
comment_date: Datum van de laatste bewerking van de opmerking
comment_user: Laatste bewerking door
filter:
activity:
by_users_job:
Filter by users job: Uitwisselingen filteren op beroep van ten minste één deelnemende gebruiker
'Filtered activity by users job: only %jobs%': 'Gefilterd op beroep van ten minste één deelnemende gebruiker: alleen %jobs%'
by_users_scope:
Filter by users scope: Uitwisselingen filteren op dienst van ten minste één deelnemende gebruiker
'Filtered activity by users scope: only %scopes%': 'Gefilterd op dienst van ten minste één deelnemende gebruiker: alleen %scopes%'
course_having_activity_between_date:
Title: Trajecten filteren die een uitwisseling hebben ontvangen tussen twee data
Receiving an activity after: Die een uitwisseling hebben ontvangen na
Receiving an activity before: Die een uitwisseling hebben ontvangen vóór
acp_by_activity_type:
'activity after': Uitwisselingen na
activity after help: Indien leeg gelaten, wordt er geen rekening mee gehouden
activity before: Uitwisselingen vóór
activity before help: Indien leeg gelaten, wordt er geen rekening mee gehouden
person_between_dates:
Implied in an activity after this date: Betrokken bij een uitwisseling na deze datum
Implied in an activity before this date: Betrokken bij een uitwisseling vóór deze datum
Activity reasons for those activities: Onderwerpen van deze uitwisselingen
if no reasons: Als geen enkel onderwerp is aangevinkt, worden alle onderwerpen in aanmerking genomen
title: Gebruikers filteren die gekoppeld zijn geweest aan een uitwisseling tijdens de periode
date mismatch: De einddatum van de periode moet later zijn dan de startdatum
by_creator_scope:
Filter activity by user scope: Uitwisselingen filteren op dienst van de aanmaker van de uitwisseling
'Filtered activity by user scope: only %scopes%': "Gefilterd op dienst van de aanmaker van de uitwisseling: alleen %scopes%"
by_creator_job:
job_form_label: Beroepen
Filter activity by user job: Uitwisselingen filteren op beroep van de aanmaker van de uitwisseling
'Filtered activity by user job: only %jobs%': "Gefilterd op beroep van de aanmaker van de uitwisseling: alleen %jobs%"
by_persons:
Filter activity by persons: Uitwisselingen filteren op deelnemende gebruiker
'Filtered activity by persons: only %persons%': 'Uitwisselingen gefilterd op deelnemende gebruikers: alleen %persons%'
persons taking part on the activity: Gebruikers deelnemend aan de uitwisseling
by_sent_received:
Sent or received: Verzonden of ontvangen
is sent: verzonden
is received: ontvangen
by_presence:
Filter activity by activity presence: Uitwisselingen filteren op aanwezigheid van de gebruiker
presences: Aanwezigheden
'Filtered by activity presence: only %presences%': 'Gefilterd op aanwezigheid van de gebruiker: alleen %presences%'
aggregator:
person:
by_person:
title: Uitwisselingen groeperen op gebruiker (gebruikersdossier waarin de uitwisseling is geregistreerd)
person: Gebruiker
by_household:
title: Uitwisselingen groeperen op huishouden
household: Identificatie huishouden
acp:
by_activity_type:
title: Trajecten groeperen op type uitwisseling
after_date: Alleen uitwisselingen na deze datum
before_date: Alleen uitwisselingen vóór deze datum
activity_type: Types uitwisseling
activity:
by_sent_received:
Sent or received: Verzonden of ontvangen
is sent: verzonden
is received: ontvangen
Group activity by sentreceived: Uitwisselingen groeperen op verzonden / ontvangen
by_location:
Activity Location: Locatie van de uitwisseling
Title: Uitwisselingen groeperen op locatie van de uitwisseling
by_user_job:
Users 's job: Beroep van de gebruikers deelnemend aan de uitwisseling
Aggregate by users job: Uitwisselingen groeperen op beroep van de deelnemende gebruikers
by_user_scope:
Users 's scope: Hoofddienst van de gebruikers deelnemend aan de uitwisseling
Aggregate by users scope: Uitwisselingen groeperen op hoofddienst van de gebruiker
by_creator_scope:
Group activity by creator scope: Uitwisselingen groeperen op dienst van de aanmaker van de uitwisseling
Calc date: Berekeningsdatum van de dienst van de aanmaker van de uitwisseling
by_creator_job:
Group activity by creator job: Uitwisselingen groeperen op beroep van de aanmaker van de uitwisseling
Calc date: Berekeningsdatum van het beroep van de aanmaker van de uitwisseling
by_persons:
Group activity by persons: Uitwisselingen groeperen op deelnemende gebruiker
Persons: Deelnemende gebruikers
by_activity_presence:
Group activity by presence: Uitwisselingen groeperen op aanwezigheid van de gebruiker
header: Aanwezigheid van gebruiker(s)
generic_doc:
filter:
keys:
accompanying_period_activity_document: Document van uitwisselingen van trajecten

View File

@@ -165,3 +165,60 @@ Phonecall: "Telefoon oproep"
Aside activities: Nevenactiviteiten
Aside activity types: Types nevenactiviteiten
Aside activity type configuration: Configuratie categorieën nevenactiviteiten
# exports
export:
aside_activity:
List of aside activities: Lijst van nevenactiviteiten
createdAt: Aanmaak
updatedAt: Laatste update
agent_id: Gebruiker
creator_id: Aanmaker
main_scope: Hoofddienst van de gebruiker
main_center: Hoofdterritorium van de gebruiker
aside_activity_type: Categorie nevenactiviteit
date: Datum
duration: Duur
note: Notitie
id: Identificatie
location: Locatie
Exports of aside activities: Exports van nevenactiviteiten
Count aside activities: Aantal nevenactiviteiten
Count aside activities by various parameters.: Telt het aantal nevenactiviteiten volgens diverse criteria
Average aside activities duration: Gemiddelde duur van nevenactiviteiten
Sum aside activities duration: Duur van nevenactiviteiten
Sum concerned persons count for aside activities: Aantal betrokken gebruikers bij nevenactiviteiten
filter:
Filter by aside activity date: Nevenactiviteiten filteren op datum
Filter by aside activity type: Nevenactiviteiten filteren op type activiteit
'Filtered by aside activity type: only %type%': "Gefilterd op type nevenactiviteit: alleen %type%"
Filtered by aside activities between %dateFrom% and %dateTo%: Gefilterd op datum van nevenactiviteit, tussen %dateFrom% en %dateTo%
This date should be after the date given in "Implied in an aside activity after this date" field: Deze datum moet later zijn dan de datum in het veld "nevenactiviteiten na deze datum"
Aside activities after this date: Nevenactiviteiten na deze datum
Aside activities before this date: Nevenactiviteiten vóór deze datum
'Filtered aside activity by user: only %users%': "Gefilterd op gebruiker: alleen %users%"
Filter aside activity by user: Filteren op gebruiker
by_user_job:
'Filtered aside activities by user jobs: only %jobs%': "Gefilterd op beroep van gebruikers: alleen %jobs%"
Filter by user jobs: Nevenactiviteiten filteren op beroep van gebruikers
by_user_scope:
'Filtered aside activities by user scope: only %scopes%': "Gefilterd op dienst van gebruikers: alleen %scopes%"
Filter by user scope: Nevenactiviteiten filteren op dienst van gebruiker
Filter by aside activity location: Nevenactiviteiten filteren op locatie
'Filtered by aside activity location: only %location%': "Gefilterd op locatie: alleen %location%"
aggregator:
Group by aside activity type: Nevenactiviteiten groeperen op type activiteit
Group by concerned persons count: Nevenactiviteiten groeperen op aantal betrokken gebruikers
Concerned persons count: Aantal betrokken gebruikers
Aside activity type: Type nevenactiviteit
by_user_job:
Aggregate by user job: Nevenactiviteiten groeperen op beroep van gebruikers
by_user_scope:
Aggregate by user scope: Nevenactiviteiten groeperen op dienst van gebruikers
Aside activity location: Locatie van nevenactiviteiten
Group by aside activity location: Nevenactiviteiten groeperen op locatie
Aside activity localisation: Locatie
# ROLES
CHILL_ASIDE_ACTIVITY_STATS: Statistieken voor nevenactiviteiten

View File

@@ -74,3 +74,42 @@ The balance: Verschil tussen inkomsten en onkosten
Valid since %startDate% until %endDate%: Geldig sinds %startDate% tot %endDate%
Valid since %startDate%: Geldig sinds %startDate%
budget:
admin:
form:
Charge_kind_key: Identificatiesleutel
Resource_kind_key: Identificatiesleutel
This kind must contains only alphabeticals characters, and dashes. This string is in use during document generation. Changes may have side effect on document: Deze sleutel dient om het type last of inkomen te identificeren bij het genereren van documenten. Alleen alfanumerieke tekens zijn toegestaan. Het wijzigen van deze sleutel kan een effect hebben bij het genereren van nieuwe documenten.
# ROLES
Budget elements: Budget
CHILL_BUDGET_ELEMENT_CREATE: Inkomsten/last aanmaken
CHILL_BUDGET_ELEMENT_DELETE: Inkomsten/last verwijderen
CHILL_BUDGET_ELEMENT_SEE: Inkomstenen/lasten bekijken
CHILL_BUDGET_ELEMENT_UPDATE: Inkomsten/last bewerken
## admin
crud:
resource_kind:
title_new: Nieuw type inkomsten
title_edit: Type inkomsten bewerken
charge_kind:
title_new: Nieuw type last
title_edit: Type last bewerken
admin:
menu:
Resource types: Types inkomsten
Charge types: Types last
title:
Charge Type List: Lijst van types last
Resource Type List: Lijst van types inkomsten
Budget configuration: Configuratie van budgetelementen
new:
Create a new charge type: Nieuw type last aanmaken
Create a new resource type: Nieuw type inkomsten aanmaken
form:
Choose the type of resource: Kies een type inkomsten
Choose the type of charge: Kies een type last

View File

@@ -1,2 +1,8 @@
The amount cannot be empty: Le montant ne peut pas être vide ou égal à zéro
The budget element's end date must be after the start date: La date de fin doit être après la date de début
The amount cannot be empty: Het bedrag mag niet nul of leeg zijn
The budget element's end date must be after the start date: De einddatum moet later vallen dan de begindatum
budget:
admin:
form:
kind:
enkel_alphanumeriek

View File

@@ -47,8 +47,6 @@ class ChillCalendarExtension extends Extension implements PrependExtensionInterf
} else {
$container->setParameter('chill_calendar.short_messages', null);
}
$container->setParameter('chill_calendar.remote_calendar_dsn', $config['remote_calendar_dsn']);
}
public function prepend(ContainerBuilder $container)

View File

@@ -32,10 +32,9 @@ class Configuration implements ConfigurationInterface
->canBeDisabled()
->children()->end()
->end() // end for short_messages
->scalarNode('remote_calendar_dsn')->defaultValue('null://null')->cannotBeEmpty()->end()
->arrayNode('remote_calendars_sync')->canBeEnabled()
->children()
->arrayNode('microsoft_graph')->canBeEnabled()->setDeprecated('chill-project/chill-bundles', '4.7.0', 'The child node %node% at path %path% is deprecated: use remote_calendar_dsn instead, with a "msgraph://default" value')
->arrayNode('microsoft_graph')->canBeEnabled()
->children()
->end() // end of machine_access_token
->end() // end of microsoft_graph children

View File

@@ -107,11 +107,6 @@ class CalendarRange implements TrackCreationInterface, TrackUpdateInterface
return $this;
}
public function hasLocation(): bool
{
return null !== $this->location;
}
public function setLocation(?Location $location): self
{
$this->location = $location;

View File

@@ -35,46 +35,25 @@ use TheNetworg\OAuth2\Client\Provider\Azure;
class RemoteCalendarCompilerPass implements CompilerPassInterface
{
private const ZIMBRA_CONNECTOR = 'Chill\ZimbraBundle\Calendar\Connector\ZimbraConnector';
private const MS_GRAPH_SERVICES_TO_REMOVE = [
MapAndSubscribeUserCalendarCommand::class,
AzureGrantAdminConsentAndAcquireToken::class,
RemoteCalendarConnectAzureController::class,
MachineTokenStorage::class,
MachineHttpClient::class,
MSGraphRemoteCalendarConnector::class,
MSUserAbsenceReaderInterface::class,
MSUserAbsenceSync::class,
];
public function process(ContainerBuilder $container)
{
$config = $container->getParameter('chill_calendar.remote_calendar_dsn');
if (true === $container->getParameter('chill_calendar')['remote_calendars_sync']['microsoft_graph']['enabled']) {
$dsn = 'msgraph://default';
} else {
$dsn = $config;
}
$config = $container->getParameter('chill_calendar');
$scheme = parse_url($dsn, PHP_URL_SCHEME);
if ('msgraph' === $scheme) {
if (true === $config['remote_calendars_sync']['microsoft_graph']['enabled']) {
$connector = MSGraphRemoteCalendarConnector::class;
$container->setAlias(HttpClientInterface::class.' $machineHttpClient', MachineHttpClient::class);
} elseif ('zimbra+http' === $scheme || 'zimbra+https' === $scheme) {
$connector = self::ZIMBRA_CONNECTOR;
foreach (self::MS_GRAPH_SERVICES_TO_REMOVE as $serviceId) {
$container->removeDefinition($serviceId);
}
} elseif ('null' === $scheme) {
$connector = NullRemoteCalendarConnector::class;
foreach (self::MS_GRAPH_SERVICES_TO_REMOVE as $serviceId) {
$container->removeDefinition($serviceId);
}
} else {
throw new \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException('Unsupported remote calendar scheme: '.$scheme);
$connector = NullRemoteCalendarConnector::class;
// remove services which cannot be loaded
$container->removeDefinition(MapAndSubscribeUserCalendarCommand::class);
$container->removeDefinition(AzureGrantAdminConsentAndAcquireToken::class);
$container->removeDefinition(RemoteCalendarConnectAzureController::class);
$container->removeDefinition(MachineTokenStorage::class);
$container->removeDefinition(MachineHttpClient::class);
$container->removeDefinition(MSGraphRemoteCalendarConnector::class);
$container->removeDefinition(MSUserAbsenceReaderInterface::class);
$container->removeDefinition(MSUserAbsenceSync::class);
}
if (!$container->hasAlias(Azure::class) && $container->hasDefinition('knpu.oauth2.client.azure')) {
@@ -83,9 +62,7 @@ class RemoteCalendarCompilerPass implements CompilerPassInterface
foreach ([
NullRemoteCalendarConnector::class,
MSGraphRemoteCalendarConnector::class,
self::ZIMBRA_CONNECTOR,
] as $serviceId) {
MSGraphRemoteCalendarConnector::class, ] as $serviceId) {
if ($connector === $serviceId) {
$container->getDefinition($serviceId)
->setDecoratedService(RemoteCalendarConnectorInterface::class);

View File

@@ -0,0 +1,8 @@
chill_calendar:
There are count ignored calendars by date filter: >-
{nbIgnored, plural,
=0 {Er zijn geen afspraken genegeerd door de datumfilter.}
one {Er is een afspraak genegeerd door de datumfilter. Wijzig de datumfilter om deze te laten verschijnen.}
few {# afspraken zijn genegeerd door de datumfilter. Wijzig de datumfilter om deze te laten verschijnen.}
other {# afspraken zijn genegeerd door de datumfilter. Wijzig de datumfilter om deze te laten verschijnen.}
}

View File

@@ -26,3 +26,149 @@ The calendar item has been successfully removed.: De afspraak is verwijdert
From the day: Vanaf
to the day: tot
Transform to activity: In activiteit omzetten
Create a new calendar in accompanying course: Afspraak aanmaken in het traject
Will send SMS: Er zal een herinnerings-sms worden verzonden
Will not send SMS: Er wordt geen herinnerings-sms verzonden
SMS already sent: Er is een sms verzonden
Canceled by: Geannuleerd door
Calendar configuration: Beheer van afspraken
crud:
calendar_cancel-reason:
index:
title: Lijst van annuleringsredenen
add_new: Nieuwe toevoegen
title_new: Nieuwe annuleringsreden
title_edit: Annuleringsreden bewerken
chill_calendar:
canceled: Geannuleerd
cancel_reason: Reden van annulering
cancel_calendar_item: Afspraak annuleren
calendar_canceled: De afspraak is geannuleerd
canceled_by:
user: Gebruiker
person: Gebruiker
other: Andere
Document: Document van een afspraak
form:
The main user is mandatory. He will organize the appointment.: De hoofdgebruiker is verplicht. Hij is de organisator van de gebeurtenis.
Create for referrer: Aanmaken voor de referent
start date filter: Begin van de afspraak
From: Van
To: Tot
Next calendars: Volgende afspraken
Add a document: Document toevoegen
Documents: Documenten
Create and add a document: Aanmaken en document toevoegen
Save and add a document: Opslaan en document toevoegen
Create for me: Afspraak aanmaken voor mezelf
Edit a document: Document bewerken
Document title: Titel
Document object: Document
Add a document from template: Document toevoegen vanaf sjabloon
Upload a document: Document uploaden
Remove a calendar document: Document van een afspraak verwijderen
Are you sure you want to remove the doc?: Weet u zeker dat u het gekoppelde document wilt verwijderen?
Document outdated: De datum en tijd van de afspraak zijn gewijzigd na het aanmaken van het document
remote_ms_graph:
freebusy_statuses:
busy: Bezet
free: Vrij
tentative: In afwachting van bevestiging
oof: Buiten kantoor
workingElsewhere: Werkt elders
unknown: Onbekend
cancel_event_because_main_user_is_%label%: De gebeurtenis is overgedragen aan gebruiker %label%
remote_calendar:
calendar_range_title: Chill-beschikbaarheidsperiode
invite:
accepted: Geaccepteerd
declined: Geweigerd
pending: In afwachting
tentative: Voorlopig geaccepteerd
list:
none: Er is geen uitnodiging
title: Mijn uitnodigingen
# exports
Exports of calendar: Exports van afspraken
Count calendars: Aantal afspraken
Count calendars by various parameters.: Telt het aantal afspraken op basis van verschillende parameters.
Average appointment duration: Gemiddelde duur van afspraken
Get the average of appointment duration according to various filters: Berekent het gemiddelde van de duur van afspraken op basis van verschillende parameters.
Sum of appointment durations: Som van de duur van afspraken
Get the sum of appointment durations according to various filters: Berekent de som van de duur van afspraken op basis van verschillende parameters.
'Filtered by agent: only %agents%': "Gefilterd op agenten: alleen %agents%"
Filter calendars by agent: Afspraken filteren op agenten
Filter calendars between certain dates: Afspraken filteren op datum van de afspraak
'Filtered by calendars between %dateFrom% and %dateTo%': 'Gefilterd op afspraken tussen %dateFrom% en %dateTo%'
'Filtered by calendar range: only %calendarRange%': 'Gefilterd op afspraken per beschikbaarheidsperiode: alleen de %calendarRange%'
Filter by calendar range: Filteren op afspraken binnen een beschikbaarheidsperiode of niet
Group calendars by agent: Afspraken groeperen op agent
Group calendars by location type: Afspraken groeperen op type locatie
Group calendars by location: Afspraken groeperen op afspraaklocatie
Group calendars by cancel reason: Afspraken groeperen op annuleringsreden
Group calendars by month and year: Afspraken groeperen op maand en jaar
Group calendars by urgency: Afspraken groeperen op urgent of niet
export:
aggregator.calendar:
agent_job:
Group calendars by agent job: Afspraken groeperen op beroep van de agent
agent_scope:
Group calendars by agent scope: Afspraken groeperen op dienst van de agent
filter.calendar:
agent_job:
Filter calendars by agent job: Afspraken filteren op beroepen van de agenten (hoofdgebruikers)
'Filtered by agent job: only %jobs%': 'Gefilterd op beroepen van de agenten (hoofdgebruikers): alleen de %jobs%'
agent_scope:
Filter calendars by agent scope: Afspraken filteren op diensten van de agenten (hoofdgebruikers)
'Filtered by agent scope: only %scopes%': 'Gefilterd op diensten van de agenten (hoofdgebruikers): alleen de diensten %scopes%'
Scope: Dienst
Job: Beroep
Location type: Type locatie
Location: Afspraaklocatie
by month and year: Per maand en jaar
is urgent: Urgent
is not urgent: Niet urgent
has calendar range: Binnen een beschikbaarheidsperiode?
Not made within a calendar range: Afspraak binnen een beschikbaarheidsperiode
Made within a calendar range: Afspraak buiten een beschikbaarheidsperiode
docgen:
calendar:
Base context for calendar: 'Afspraak: basiscontext'
A base context for generating document on calendar: Context voor het genereren van documenten op basis van afspraken
Track changes on datetime and warn user if date time is updated after the doc generation: Wijzigingen in het document volgen en gebruikers waarschuwen dat de datum en tijd zijn gewijzigd na het genereren van het document
Ask main person: Vragen om een gebruiker te kiezen uit de deelnemers aan de afspraken
Main person label: Label om de gebruiker te kiezen
Ask third party: Vragen om een derde te kiezen uit de deelnemers aan de afspraken
Third party label: Label om de derde te kiezen
Destinee: Geadresseerde
None: Geen keuze
title of the generated document: Titel van het gegenereerde document
CHILL_CALENDAR_CALENDAR_CREATE: Afspraken aanmaken
CHILL_CALENDAR_CALENDAR_EDIT: Afspraken bewerken
CHILL_CALENDAR_CALENDAR_DELETE: Afspraken verwijderen
CHILL_CALENDAR_CALENDAR_SEE: Afspraken bekijken
generic_doc:
filter:
keys:
accompanying_period_calendar_document: Document van afspraken van trajecten
person_calendar_document: Document van afspraken van de gebruiker

View File

@@ -0,0 +1,6 @@
calendar:
At least {{ limit }} person is required.: Minimaal {{ limit }} persoon is vereist voor deze afspraak
An end date is required: Geef een einddatum en -tijd op
A start date is required: Geef een startdatum en -tijd op
A location is required: Geef een locatie op
A main user is mandator: Geef een hoofdgebruiker op

View File

@@ -1,3 +1,103 @@
'Not available in your language': 'Vertaling niet mogelijk in het Nederlands'
'Other value': 'Andere mogelijkheid'
'None': 'Niet gespecifieerd'
#customfieldsgroup rendering
Empty data: Lege gegevens
No data to show: Geen waarden om te tonen
#customfieldsgroup administration
CustomFieldsGroup list: Groepen van aangepaste velden
CustomFieldsGroup creation: Nieuwe groep van aangepaste velden
Entity: Entiteit
"Is default ?": "Standaard?"
"Some module select default groups for some usage. Example: the default person group is shown under person page.": "Sommige modules selecteren standaardgroepen voor bepaald gebruik. Voorbeeld: de standaard persoonsgroep wordt getoond op de persoonspagina"
Make default: Groep standaard maken
Create a new group: Nieuwe groep aanmaken
CustomFieldsGroup details: Details van de groep aangepaste velden
Fields associated with this group: Velden geassocieerd met deze groep
Any field is currently associated with this group: Geen veld is momenteel geassocieerd met deze groep
Create a new field: Nieuw aangepast veld aanmaken
Add a new field: Aangepast veld toevoegen
ordering: volgorde
label_field: label van het veld
active: actief
No value defined for this option: Geen waarde gedefinieerd voor deze optie
CustomFieldsGroup edit: Bewerken van een groep aangepaste velden
type: type
The custom fields group has been created: De groep aangepaste velden is aangemaakt
The custom fields group has been updated: De groep aangepaste velden is bijgewerkt
The custom fields group form contains errors: Het formulier bevat fouten
The default custom fields group has been changed: De standaardgroep is gewijzigd
#menu entries
Custom fields configuration: Aangepaste velden
CustomFields List: Lijst van aangepaste velden
CustomFields Groups: Groep van aangepaste velden
#customfield administration
Custom fields: Aangepaste velden
CustomFields configuration: Beheer van aangepaste velden
CustomField edit: Wijziging van een aangepast veld
CustomField creation: Nieuw aangepast veld
General informations: Algemene informatie
Options: Opties
Custom fields group: Groep van aangepaste velden
Ordering: Volgorde van verschijning
Required field: Verplicht veld
An answer is required: Een antwoord is vereist
Any answer is required: Geen antwoord is vereist
Back to the group: Terug naar de groep aangepaste velden
Slug: Tekstuele identificatie
The custom field has been created: Het aangepaste veld is aangemaakt
The custom field form contains errors: Het formulier bevat fouten
The custom field has been updated: Het aangepaste veld is bijgewerkt
#custom field name
choice: keuze
Title: Titel
text: tekst
Text field: Tekstveld
Date field: Datumveld
#custom field choice
Multiplicity: Multipliciteit
Multiple: Meerdere
Unique: Slechts één keuze mogelijk
Choice display: Weergave van keuzes
Expanded: Uitgebreide keuzes (radioknoppen)
Non expanded: Gegroepeerde keuzes
Allow other: Andere waarde toestaan
No: Nee
Yes: Ja
Other value label (empty if use by default): Label van het veld "andere waarde"
Choices: Keuzes
Add an element: Element toevoegen
#custom field text
Max length: Maximale lengte
Box appearance: Verschijning van het veld
Multiple boxes on the line: Meerdere velden op de lijn
One box on the line: Slechts één veld op de lijn
#custom field title
Title level: Titelniveau
Main title: Hoofdtitel
Subtitle: Ondertitel
#custom field number
Greater or equal than: Groter dan of gelijk aan
Lesser or equal than: Kleiner dan of gelijk aan
Precision: Precisie
Text after the field: Tekst na het veld
Number field: Nummerveld
#custom field long choice
Options key: Sleutel van opties
Choose a value: Kies een waarde
Long choice field: Veld met vooraf geregistreerde keuzes
#Custom field date
Greater or equal than (expression like 1 day ago, 2 years ago, +1 month, today, tomorrow, or date with format YYYY-mm-dd): Datum na (geef een PHP-expressie op zoals '1 day ago', '2 years ago', '+1 month', 'today', 'tomorrow', ...)
Lesser or equal than (expression like 1 day ago, 2 years ago, +1 month, today, tomorrow, or date with format YYYY-mm-dd): Datum voor (geef een PHP-expressie op zoals '1 day ago', '2 years ago', '+1 month', 'today', 'tomorrow', ...)

View File

@@ -0,0 +1,3 @@
Characters not allowed. Only lowercase letters, numbers and "-" are allowed.: Tekens niet toegestaan. Alleen kleine letters, cijfers en "-" zijn toegestaan.
'This date must be after or equal to %date%': Deze datum moet gelijk zijn aan of na %date%
'This date must be before or equal to %date%': Deze datum moet voor of gelijk zijn aan %date%

View File

@@ -0,0 +1,2 @@
docgen:
# Geen ICU berichten nodig voor data_dump_email meer

View File

@@ -0,0 +1,51 @@
docgen:
Generate a document: Document genereren
Generate: Genereren
Document generation: Documentgeneratie
Manage templates and document generation: Beheer van gegenereerde documenten en hun sjablonen
Pick template context: Context kiezen
Context: Context
New template: Nieuw sjabloon
Edit template: Sjabloon bewerken
test generate: Generatie testen
With context %name%: 'Met context "%name%"'
Doc generation failed: Het genereren van dit document is mislukt
Doc generation is pending: Het genereren van dit document is bezig
Come back later: Kom later terug
Send report to: Rapport verzenden naar
Send report errors to this email address: Foutrapporten worden verzonden naar het opgegeven e-mailadres
Generate as creator: Genereren als
The document will be generated as the given creator: Het document wordt gegenereerd namens de opgegeven gebruiker
Show data instead of generating: Gegevens tonen in plaats van document genereren
Any template configured: Geen documentsjabloon geconfigureerd
entity_id_placeholder: Identificatie van de entiteit
failure_email:
The generation of a document failed: Het genereren van een document is mislukt
The generation of the document %template_name% failed: Het genereren van een document op basis van sjabloon {{ template_name }} is mislukt.
The following errors were encoutered: De volgende fouten zijn opgetreden
Forward this email to your administrator for solving: Stuur dit bericht door naar uw beheerder voor probleemoplossing.
References: Referenties
data_dump_email:
subject: Inhoud van documentgeneratiegegevens beschikbaar
Dear: Beste
data_dump_ready_and_attached: >-
De inhoud van de gegevens is beschikbaar. U vindt deze als bijlage bij deze e-mail.
filename: >-
Bestandsnaam: %filename%
crud:
docgen_template:
index:
title: Documentgeneratie
add_new: Aanmaken
Template file: Sjabloonbestand

View File

@@ -0,0 +1,11 @@
acc_course_document:
duplicated_at: >-
Gedupliceerd op {at, date, long} om {at, time, short}
workflow:
public_link:
doc_shared_by_at_explanation: >-
Het document is met u gedeeld door {byUser}, op {at, date, long} om {at, time, short}.
doc_shared_automatically_at_explanation: >-
Het document is met u gedeeld op {at, date, long} om {at, time, short}

View File

@@ -1,2 +1,130 @@
Document: Document
Documents: Documenten
Documents for %name%: Documenten van %name%
Preparing: In voorbereiding
Ready to show: Klaar om te bekijken
Download: Downloaden
Download existing file: Bestaand bestand downloaden
Create new document: Nieuw document aanmaken
New document for %name%: Nieuw document voor %name%
Editing document for %name%: Document bewerken voor %name%
Edit Document: Document bewerken
Update document: Document bijwerken
Edit attributes: Documenteigenschappen bewerken
Existing document: Bestaand document
No document to download: Geen document om te downloaden
"Choose a document category": Kies een documentcategorie
No document found: Geen document gevonden
The document is successfully registered: Het document is geregistreerd
The document is successfully updated: Het document is bijgewerkt
Any description: Geen beschrijving
Document from person %name%: Document van gebruiker %name%
See the document: Document bekijken
document:
Any title: Geen titel
replace: Vervangen
Add: Document toevoegen
generic_doc:
filter:
keys:
accompanying_course_document: Document van het traject
person_document: Documenten van de gebruiker
date-range: Datum van het document
# delete
Delete document ?: Document verwijderen?
Are you sure you want to remove this document ?: Weet u zeker dat u dit document wilt verwijderen?
The document is successfully removed: Het document is verwijderd
# dropzone upload
File too big: Bestand te groot
Drop your file or click here: Klik hier of sleep uw nieuwe bestand naar deze zone
Remove file in order to upload a new one: Verwijder dit bestand om een nieuw bestand in te voegen
Max files exceeded. Remove previous files: Maximum aantal bestanden bereikt. Verwijder de vorige
Cancel upload: Upload annuleren
Are you sure you want to cancel this upload ?: Weet u zeker dat u deze upload wilt annuleren?
Upload canceled: Upload geannuleerd
Remove existing file: Bestaand document verwijderen
stored_object:
Insert a document: Document toevoegen
# ROLES
PersonDocument: Documenten
CHILL_PERSON_DOCUMENT_CREATE: Document toevoegen
CHILL_PERSON_DOCUMENT_DELETE: Document verwijderen
CHILL_PERSON_DOCUMENT_SEE: Document bekijken
CHILL_PERSON_DOCUMENT_SEE_DETAILS: Details van een document bekijken
CHILL_PERSON_DOCUMENT_UPDATE: Document bewerken
# Admin
Documents configuration: Documentenconfiguratie
Documents configuration menu: Documenten
Documents categories: Documentcategorieën
Document category list: Documentcategorieën
Document category show: Documentcategorie bekijken
Document category edit: Documentcategorie bewerken
Creator bundle id: Module
Bundle id: Module
Internal id inside creator bundle: Identificatie
Id inside bundle: Identificatie
Document class: Documentklasse
no records found:
Create new category: Nieuwe categorie aanmaken
Back to the category list: Terug naar de lijst
Create new DocumentCategory: Nieuwe documentcategorie aanmaken
Accompanying period document: Begeleidingstrajectdocument
Person document: Persoonsdocument
# WOPI EDIT
online_edit_document: Online bewerken
workflow:
Document deleted: Document verwijderd
public_link:
shared_doc: Gedeeld document
title: Gedeeld document
main_document: Hoofddocument
attachment: Bijlage
# ROLES
accompanyingCourseDocument: Documenten in begeleidingstrajecten
CHILL_ACCOMPANYING_COURSE_DOCUMENT_CREATE: Document aanmaken
CHILL_ACCOMPANYING_COURSE_DOCUMENT_DELETE: Document verwijderen
CHILL_ACCOMPANYING_COURSE_DOCUMENT_SEE: Documenten bekijken
CHILL_ACCOMPANYING_COURSE_DOCUMENT_SEE_DETAILS: Details van een document bekijken
CHILL_ACCOMPANYING_COURSE_DOCUMENT_UPDATE: Document bewerken
entity_display_title:
Doc for evaluation (n°%eval%): Evaluatiedocument (n°%eval%)
Document (n°%doc%): "Document (nr. %doc%)"
Doc for evaluation (n°%eval%): Document van evaluatie nr. %eval%
# SIGNATURES
signatures:
yes: Ja
are_you_sure: Weet u het zeker?
you_are_going_to_sign: U gaat het document ondertekenen
signature_confirmation: Bevestiging van de ondertekening
sign: Ondertekenen
choose_another_signature: Een andere zone kiezen
cancel: Annuleren
last_sign_zone: Vorige ondertekeningszone
next_sign_zone: Volgende ondertekeningszone
add_sign_zone: Ondertekeningszone toevoegen
click_on_document: Klik op het document
last_zone: Vorige zone
next_zone: Volgende zone
add_zone: Zone toevoegen
another_zone: Andere zone
electronic_signature_in_progress: Elektronische ondertekening bezig...
loading: Laden...
remove_sign_zone: Zone verwijderen
return: Terug
see_all_pages: Alle pagina's bekijken
all_pages: Alle pagina's
go_to_signature_unique: Naar de ondertekeningszone gaan

View File

@@ -0,0 +1,2 @@
The file is not stored properly: Het bestand is niet correct geüpload
Upload a document: Upload een document

View File

@@ -0,0 +1,27 @@
total events match the search: >-
{ total, plural,
=0 {Geen gebeurtenis komt overeen met de zoektermen}
one {Eén gebeurtenis komt overeen met de zoektermen}
other {# gebeurtenissen komen overeen met de zoektermen}
}
count participations to this event: >-
{ count, plural,
=0 {Geen deelnemer aan de gebeurtenis}
one {Eén deelnemer aan de gebeurtenis}
other {# deelnemers aan de gebeurtenis}
}
events:
and_other_count_participants: >-
{ count, plural,
=0 {Geen andere deelnemer}
one {en één andere deelnemer}
other {en # andere deelnemers}
}
ignored_participations: >-
{ count, plural,
one {De volgende persoon is genegeerd omdat hij/zij al deelneemt aan de gebeurtenis}
other {De volgende personen zijn genegeerd omdat zij al deelnemen aan de gebeurtenis}
}

View File

@@ -0,0 +1,198 @@
#events
Event type : Type evenement
Event: Evenement
Events: Evenementen
'Event : %label%': Evenement "%label%"
Participation: Deelname
Participations: Deelnames
Status: Status
Last update: Laatste update
Moderator: Verantwoordelijke
Animators: Animatoren
#CRUD event
Details of an event: Details van een evenement
See details of the event: Details van het evenement bekijken
Back to details of the event: Terug naar details van het evenement
New event: Nieuw evenement
Back to the most recent events: Terug naar de laatste evenementen
'Back to %person% events': Terug naar evenementen van %person%
Event creation: Evenement aanmaken
Add an event: Evenement toevoegen
Event edit: Evenement bewerken
Edit the event: Evenement bewerken
The event was updated: Het evenement is bijgewerkt
The event was created: Het evenement is aangemaakt
List of events: Lijst van evenementen
Any location for this event: Geen locatie voor dit evenement
#crud participation
Edit all the participations: Alle deelnames bewerken
Edit the participation: Deelname aan het evenement bewerken
Participation Edit: Deelname bewerken
Add a participation: Deelnemer toevoegen
Participation creation: Deelname toevoegen
Associated person: Gekoppelde gebruiker
Associated event: Gekoppeld evenement
Back to the event: Terug naar het evenement
The participation was created: De deelname is aangemaakt
The participation was updated: De deelname is bijgewerkt
'None of the requested people may participate the event: they are maybe already participating.': 'Geen van de aangegeven personen kan worden toegevoegd aan het evenement: zij nemen mogelijk al deel.'
There are no participation to edit for this event: Er zijn geen deelnames voor dit evenement
The participations have been successfully updated.: De deelnames zijn bijgewerkt.
The participation has been sucessfully removed: De deelname is correct verwijderd.
The event has been sucessfully removed: Het evenement en alle bijbehorende deelnames zijn correct verwijderd.
The participations were created: De deelnames zijn aangemaakt
Events participation: Deelname aan evenementen
Remove participation: Deelname verwijderen
Delete event: Evenement verwijderen
Are you sure you want to remove that participation ?: Weet u zeker dat u deze deelname wilt verwijderen?
Are you sure you want to remove that event ?: Weet u zeker dat u dit evenement en alle bijbehorende deelnames wilt verwijderen?
Any participation for this person: Deze gebruiker neemt niet deel aan evenementen
#search
Event search: Evenementen zoeken
CHILL_EVENT_UPDATE: Evenement bewerken
CHILL_EVENT_CREATE: Evenement aanmaken
CHILL_EVENT_SEE: Evenement bekijken
CHILL_EVENT_SEE_DETAILS: Details van een evenement bekijken
CHILL_EVENT_PARTICIPATION_CREATE: Deelname aanmaken
CHILL_EVENT_PARTICIPATION_UPDATE: Deelname bewerken
CHILL_EVENT_PARTICIPATION_SEE: Deelname bekijken
CHILL_EVENT_PARTICIPATION_SEE_DETAILS: Details van een deelname bekijken
# TODO check place to put this
Next step: Volgende stap
To which territory should the event be associated ?: Aan welk territorium moet het evenement worden gekoppeld?
# timeline
past: verleden
futur: toekomst
'subscribed by %user% to event "%event%" (%event_type%)': ingeschreven door %user% voor evenement "%event%" (%event_type%)
Show the event: Evenement bekijken
Subscribe an event: Evenement toevoegen
Pick an event: Evenement kiezen
Pick a type of event: Type evenement kiezen
Pick a moderator: Verantwoordelijke kiezen
# exports
Select a format: Formaat kiezen
Export: Exporteren
Count events: Aantal evenementen
Count events by various parameters.: Telt het aantal evenementen volgens diverse criteria
Exports of events: Exports van evenementen
Filtered by event date: Filteren op datum van evenement
'Filtered by date of event: only between %date_from% and %date_to%': "Gefilterd op datum van evenement: alleen tussen %date_from% en %date_to%"
Events after this date: Evenementen na deze datum
Events before this date: Evenementen voor deze datum
Filtered by event type: Filteren op type evenement
'Filtered by event type: only %list%': "Gefilterd op type: alleen %list%"
Group event by date: Groeperen op datum van evenement
Group by event type: Groeperen op type evenement
Count event participants: Aantal deelnames
Count participants to an event by various parameters.: Telt het aantal deelnames volgens diverse criteria
Exports of event participants: Exports van deelnames
'Filtered by participant roles: only %list%': "Gefilterd op deelnemersrollen: alleen %list%"
Filter by participant roles: Filteren op deelnemersrollen
Part roles: Deelnemersrollen
Group by participant role: Groeperen op deelnemersrol
Events configuration: Configuratie van evenementen
Events configuration menu: Menu van evenementen
Event status: Statussen per type evenement
Event roles: Rollen per type evenement
Event types: Types evenementen
EventType list: Lijst van types evenementen
EventType: Types evenementen
EventType creation: Nieuw type evenement
EventType edit: Type evenement bewerken
Status list: Lijst van statussen
Status creation: Nieuwe status
Status edit: Status bewerken
Role list: Lijst van rollen
Role: Rollen
Role creation: Nieuwe rol
Role edit: Rol bewerken
xlsx: xlsx
ods: ods
csv: csv
Create a new role: Nieuwe rol aanmaken
Create a new type: Nieuw type aanmaken
Create a new status: Nieuwe status aanmaken
event:
admin:
title:
Event budget element list: Lijst van budgetelementen voor een evenement
Select budget type: Selecteer het type budgetelement
new:
Create a new budget kind: Nieuw budgetelement aanmaken
theme:
label: Thema's
fields:
organizationCost: Organisatiekosten
location: Locatie
documents: Documenten
internal animators: Interne animatoren
external animators: Externe animatoren
form:
organisationCost_help: Organisatiekosten voor de structuur. Nuttig voor statistieken.
add_document: Document toevoegen
remove_document: Document verwijderen
Select one or more themes: Selecteer één of meerdere thema's
filter:
event_types: Op types evenement
event_dates: Op datum van evenement
center: Op territorium
by_responsable: Op verantwoordelijke
pick_responsable: Filteren op verantwoordelijken
budget:
resources: Middelen
charges: Lasten
label: Budgetelementen van een evenement
Select a budget element kind: Selecteer een budgetelement
no elements: Er zijn geen elementen
resource type: Middel
charge type: Last
amount: Bedrag
comment: Opmerking
animators:
intern: Interne animatoren
extern: Externe animatoren
crud:
event_theme:
title_new: Nieuw thema aanmaken
title_edit: Thema bewerken
index:
title: Lijst van thema's
add_new: Nieuw thema aanmaken
event_budget_kind:
title_new: Nieuw budgetelement aanmaken
export:
event:
list:
title: Lijst van evenementen
description: Maakt de lijst van evenementen aan op basis van verschillende parameters.
event_id: Identificatie
event_name: Naam
event_date: Datum
event_type: Type evenement
event_center: Territorium
event_moderator: Verantwoordelijke
event_participants_count: Aantal deelnemers
event_location: Locatie
event_budget_resources: Middelen
event_budget_charges: Lasten
event_animators: Animatoren
event_themes: Thema's

View File

@@ -0,0 +1,3 @@
event:
validation:
person_already_participate_to_event: De gebruiker is al ingeschreven voor dit evenement

View File

@@ -0,0 +1,213 @@
situation_logement:
proprietaire: Eigenaar
locataire: Huurder
heberge_chez_tiers: Gehuisvest bij een derde
heberge_chez_parents: Gehuisvest bij een ouder
hebergement_en_foyer: Gehuisvest in een tehuis
sans_domicile: Zonder vaste woonplaats
niveau_maitrise_langue:
lu: Gelezen
ecrit: Geschreven
parle: Gesproken
aucun: Geen
permis_conduire:
a: Rijbewijs A
b: Rijbewijs B
c: Rijbewijs C
d: Rijbewijs D
e: Rijbewijs E
en_cours: Bezig
pas_de_permis: Geen rijbewijs
caces: CACES
label: "Rijbewijs"
situation_professionnelle:
sans_emploi: Zonder werk
en_activite: Actief
etudiant: Student
etudiant_descolarise: Student zonder school
label: "Professionele situatie"
type_contrat:
cdd: Tijdelijk contract
cdi: Contract voor onbepaalde tijd
contrat_interim: Uitzendcontract
contrat_aide: Gesubsidieerd contract
cdd_insertion: Inschakelingscontract
contrat_extra: Extra contract
service_civique: Burgerdienst
label: "Type contract"
ressource:
salaires: Salaris(sen)
ARE: ARE
are: ARE
ASS: ASS
ass: ASS
RSA: RSA
rsa: RSA
AAH: AAH
aah: AAH
autre: Andere
label: "Inkomen"
accompagnement:
plie: PLIE
pole_emploi: Arbeidsbureau
referent_RSA: RSA-referent
mission_locale: Lokale missie
rqth: RQTH
autre: Andere
label: "Begeleiding"
freins_perso:
situation_administrative: Administratieve situatie
situation_personnelle_et_familiale: Persoonlijke en familiale situatie
comportement: Gedrag
etat_de_sante: Gezondheidstoestand
precarite_situation_materielle: Precaire materiële situatie
condition_ou_absence_logement: Huisvestingsvoorwaarden of ontbreken daarvan
autres: Andere
freins_emploi:
garde_d_enfants: Kinderopvang
sante: Gezondheid
famille: Familie
finances: Financiën
maitrise_de_la_langue: Taalbeheersing
autres: Andere
neet_eligibility:
oui: Ja
non: Nee
en_attente: In afwachting
label: "NEET-geschiktheid"
handicap_recommandation:
travail_esat: Werk in ESAT
milieu_ordinaire: Reguliere omgeving
entreprise_adaptee: Aangepast bedrijf
moyen_transport:
transport_commun: Openbaar vervoer
scooter: Scooter
velo: Fiets
voiture: Auto
autre: Andere
label: "Vervoermiddel"
formation_level:
sans_diplome: Zonder diploma
BEP_CAP: BEP CAP
BAC: BAC
BAC+2: BAC +2
BAC+3: BAC +3
BAC+4: BAC +4
BAC+5: BAC +5
BAC+8: BAC +8
formation_type:
formation_initiale: Initiële opleiding
formation_continue: Permanente vorming
diploma_obtained:
fr: In Frankrijk
non-fr: In het buitenland
aucun: Geen
diploma_reconnu:
oui: Ja
non: Nee
nsp: Weet niet
xp_contrat_type:
cddi: CDDI
cdd-6mois: Tijdelijk contract -6 maanden
cdd+6mois: Tijdelijk contract +6 maanden
interim: Uitzendwerk
apprentissage: Leercontract
contrat_prof: Professioneel contract
cui: CUI
cae: CAE
cdi: Contract voor onbepaalde tijd
stage: Stage
volontariat: Vrijwilligerswerk
benevolat: Vrijwilligerswerk
autres: Andere
immersion_objectif:
'decouvrir_metier': "Een beroep of een activiteitensector ontdekken"
'confirmer_projet_prof': "Een professioneel project bevestigen"
'acquerir_experience': "Professionele ervaring opdoen"
'acquerir_competences': "Nieuwe vaardigheden verwerven"
'initier_demarche_recrutement': "Een wervingsprocedure initiëren"
'autre': "Andere"
immersion_savoir_etre:
'assiduite': "Ijver"
'ponctualite': "Punctualiteit"
'respect_consigne_securite': "Respect voor veiligheidsinstructies"
'relation_hierarchie': "Relatie met de hiërarchie"
'capacite_adaptation': "Aanpassingsvermogen"
'motivation_travail': "Werkmotivatie"
immersion_ponctualiteSalarie:
un: Eén vertraging
aucun: Geen vertraging
plusieurs: Meerdere vertragingen
immersion_assiduite:
aucun: Geen afwezigheid
un: Eén afwezigheid
plusieurs: Meerdere afwezigheden
immersion_integreRegle:
1_temps: Na een bepaalde tijd
rapidement: Snel
pas_encore: Heeft ze nog niet geïntegreerd
immersion_nsp:
oui: Ja
non: Nee
nsp: Weet niet
projet_prof:
type_contrat:
cdd: "Tijdelijk contract"
cdi: "Contract voor onbepaalde tijd"
contrat_insertion: "Inschakelingscontract"
interim: "Uitzendwerk"
indifferent: "Maakt niet uit"
label: "Gezochte type contract"
apprentissage: Leercontract
personnalisation: Personalisatie
creation_entreprise: Bedrijfsoprichting
note: "Opmerkingen gezocht contract"
volume_horaire:
temps_plein: "Voltijds"
temps_partiel: "Deeltijds"
label: "Uurvolume"
note: "Opmerkingen uurvolume"
idee: "Ideeën"
encoursdeconstruction: "In opbouw"
valide:
note: "Opmerkingen gevalideerd"
code: "Codes gevalideerd"
note: "Opmerkingen"
souhait:
code: "Codes wensen"
chill_3party:
key_label:
prescripteur: Voorschrijver
entreprise: Bedrijf
crud:
csfrein:
title_new: Nieuw rapport "belemmering" voor %person%
title_view: Rapport 'Belemmering' voor %person%
title_edit: Rapport "belemmering" bewerken
title_delete: Belemmering verwijderen
button_delete: Verwijderen
confirm_message_delete: %as_string% verwijderen?
cscv:
title_new: Nieuw CV voor %person%
title_view: CV voor %person%
title_edit: CV bewerken
title_delete: CV verwijderen
button_delete: Verwijderen
confirm_message_delete: %as_string% verwijderen?
no_date: Geen datum aangegeven
no_end_date: einddatum onbekend
no_start_date: startdatum onbekend
immersion:
title_new: Nieuwe immersie voor %person%
title_view: Immersie voor %person%
title_edit: Immersie bewerken
title_delete: Immersie verwijderen
button_delete: Verwijderen
confirm_message_delete: %as_string% verwijderen?
projet_prof:
title_new: Nieuw professioneel project voor %person%
title_view: Professioneel project voor %person%
title_edit: Professioneel project bewerken

View File

@@ -18,6 +18,7 @@ use Chill\MainBundle\Entity\UserJob;
use Chill\MainBundle\Form\Type\ChillDateType;
use Chill\MainBundle\Form\Type\ChillPhoneNumberType;
use Chill\MainBundle\Form\Type\PickCivilityType;
use Chill\MainBundle\Repository\UserJobRepository;
use Chill\MainBundle\Templating\TranslatableStringHelper;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
@@ -36,7 +37,7 @@ use Symfony\Component\Validator\Constraints\Regex;
class UserType extends AbstractType
{
public function __construct(private readonly TranslatableStringHelper $translatableStringHelper, protected ParameterBagInterface $parameterBag) {}
public function __construct(private readonly TranslatableStringHelper $translatableStringHelper, protected ParameterBagInterface $parameterBag, private readonly UserJobRepository $userJobRepository) {}
public function buildForm(FormBuilderInterface $builder, array $options)
{
@@ -80,12 +81,7 @@ class UserType extends AbstractType
'placeholder' => 'choose a job',
'class' => UserJob::class,
'choice_label' => fn (UserJob $c) => $this->translatableStringHelper->localize($c->getLabel()),
'query_builder' => static function (EntityRepository $er) {
$qb = $er->createQueryBuilder('uj');
$qb->where('uj.active = TRUE');
return $qb;
},
'choices' => $this->loadAndSortUserJobs(),
])
->add('mainLocation', EntityType::class, [
'label' => 'Main location',
@@ -96,6 +92,7 @@ class UserType extends AbstractType
'query_builder' => static function (EntityRepository $er) {
$qb = $er->createQueryBuilder('l');
$qb->orderBy('l.locationType');
$qb->orderBy('l.name', 'ASC');
$qb->where('l.availableForUsers = TRUE');
return $qb;
@@ -155,6 +152,20 @@ class UserType extends AbstractType
}
}
private function loadAndSortUserJobs(): array
{
$items = $this->userJobRepository->findBy(['active' => true]);
usort(
$items,
fn ($a, $b) => mb_strtolower((string) $this->translatableStringHelper->localize($a->getLabel()))
<=>
mb_strtolower((string) $this->translatableStringHelper->localize($b->getLabel()))
);
return $items;
}
/**
* @param OptionsResolverInterface $resolver
*/

View File

@@ -0,0 +1,7 @@
#diff ago. See doc here : http://twig.sensiolabs.org/doc/extensions/date.html
diff.ago.second: '{0} Nu | {1} Een seconde geleden | ]1,Inf] %count% seconden geleden'
diff.ago.minute: '{0} Nu | {1} Een minuut geleden | ]1,Inf] %count% minuten geleden'
diff.ago.hour: '{1} Een uur geleden | ]1,Inf] %count% uur geleden'
diff.ago.day: '{1} Gisteren | ]1,Inf] %count% dagen geleden'
diff.ago.month: '{1} Vorige maand | ]1,Inf] %count% maanden geleden'
diff.ago.year: '{1} Een jaar geleden | ]1,Inf] %count% jaar geleden'

View File

@@ -0,0 +1,155 @@
years_old: >-
{age, plural,
one {# jaar}
many {# jaar}
other {# jaar}
}
user_group:
with_count_users: >-
{count, plural,
=0 {Geen lid}
one {1 gebruiker}
many {# gebruikers}
other {# gebruikers}
}
user_removed: Gebruiker {user} is succesvol verwijderd uit groep {user_group}
user_added: Gebruiker {user} is succesvol toegevoegd aan groep {user_group}
label_related_to_user_job: Groep {job} (Beroepsgroep)
notification:
My notifications with counter: >-
{nb, plural,
=0 {Mijn meldingen}
one {# melding}
few {# meldingen}
other {# meldingen}
}
counter total notifications: >-
{total, plural,
=0 {Geen melding}
one {# melding}
few {# meldingen}
other {# meldingen}
}
counter unread notifications: >-
{unread, plural,
=0 {Geen ongelezen}
one {# ongelezen}
few {# ongelezen}
other {# ongelezen}
}
counter comments: >-
{nb, plural,
=0 {Geen opmerking}
one {# opmerking}
few {# opmerkingen}
other {# opmerkingen}
}
daily_notifications: >-
{notification_count, plural,
=1 {Hier is uw melding van de dag:}
other {Hier zijn uw # meldingen van de dag:}
}
workflow:
My workflows with counter: >-
{wc, plural,
=0 {Mijn workflows}
one {# workflow}
few {# workflows}
other {# workflows}
}
signature:
signed_statement: 'Handtekening toegepast op {datetime, date, short} om {datetime, time, short}'
rejected_statement: 'Handtekening geweigerd op {datetime, date, short} om {datetime, time, short}'
canceled_statement: 'Handtekening geannuleerd op {datetime, date, short} om {datetime, time, short}'
On hold by: In afwachting door {by}
signature_required_title: >-
{nb_signatures, plural,
=0 {Geen handtekening gevraagd}
one {Handtekening gevraagd}
other {Handtekeningen gevraagd}
}
signatures_title: >-
{nb_signatures, plural,
=0 {Geen handtekening}
one {Handtekening}
other {Handtekeningen}
}
pending_signatures: >-
{nb_signatures, plural,
=0 {Geen handtekening gevraagd}
one {Eén handtekening gevraagd}
other {# handtekeningen gevraagd}
}
send_external_message:
document_available_until: De link is geldig tot {expiration, date, long} om {expiration, time, short}.
explanation: '{sender} stuurt u documenten.'
button_content: 'Documenten bekijken die zijn verzonden door {sender}'
confidentiality: Wij vestigen uw aandacht op het feit dat deze documenten vertrouwelijk zijn.
see_doc_action_description: 'Vertrouwelijke documenten bekijken die zijn verzonden door {sender}'
external_views:
title: >-
{numberOfSends, plural,
=0 {In afwachting van raadpleging}
=1 {In afwachting van raadpleging}
other {In afwachting van raadplegingen}
}
last_view_at: Laatst bekeken op {at, date, long} om {at, time, short}
number_of_views: >-
{numberOfViews, plural,
=0 {De deling is nooit bekeken}
=1 {De deling is één keer bekeken}
other {De deling is # keer bekeken}
}
public_link:
shared_explanation_until_remaining: >-
Deze deling is actief tot {expireAt, date, long} om {expireAt, time, short}. {viewsCount, plural,
=0 {Deze deling is nog niet bekeken}
one {Deze deling is één keer bekeken}
other {Deze deling is # keer bekeken}
}, {viewsRemaining, plural,
=0 {er zijn geen weergaven meer mogelijk.}
one {er is nog één weergave mogelijk.}
other {er zijn nog # weergaven mogelijk.}
}
duration:
minute: >-
{m, plural,
=0 {Geen duur}
one {# minuut}
few {# minuten}
other {# minuten}
}
hour: >-
{h, plural,
=0 {Geen duur}
one {# uur}
few {# uur}
other {# uur}
}
day: >-
{d, plural,
=0 {Geen duur}
one {# dag}
few {# dagen}
other {# dagen}
}
filter_order:
by_date:
From: Vanaf {from_date, date, long}
To: Tot {to_date, date, long}
By: Filteren op
Search: Zoeken in de lijst
By date: Filteren op datum
search_box: Filteren op inhoud
absence:
You are listed as absent, as of {date, date, short}: Uw afwezigheid is aangegeven vanaf {date, date, short}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,45 @@
# role_scope constraint
# scope presence
The role "%role%" require to be associated with a scope.: De rol "%role%" moet gekoppeld zijn aan een dienst.
The role "%role%" should not be associated with a scope.: De rol "%role%" mag niet gekoppeld zijn aan een dienst.
"The password must contains one letter, one capitalized letter, one number and one special character as *[@#$%!,;:+\"'-/{}~=µ()£]). Other characters are allowed.": "Het wachtwoord moet een hoofdletter, een kleine letter en ten minste één speciaal teken bevatten uit *[@#$%!,;:+\"'-/{}~=µ()£]). Andere tekens zijn toegestaan."
The password fields must match: De wachtwoorden moeten overeenkomen
The password must be greater than {{ limit }} characters: "[1,Inf] Het wachtwoord moet minstens {{ limit }} tekens bevatten"
A permission is already present for the same role and scope: Er bestaat al een toestemming voor dezelfde rol en dienst.
#UserCircleConsistency
"{{ username }} is not allowed to see entities published in this circle": "{{ username }} is niet bevoegd om het element te zien dat in deze dienst is gepubliceerd."
The user in cc cannot be a dest user in the same workflow step: Een gebruiker in Cc kan geen gebruiker zijn die valideert.
#password request
This username or email does not exists: Deze gebruikersnaam of e-mail bestaat niet in de database
#phonenumber
This is not a landline phonenumber: Dit nummer is geen geldig vast telefoonnummer
This is not a mobile phonenumber: Dit nummer is geen geldig mobiel nummer
This is not a valid phonenumber: Dit telefoonnummer is niet geldig
address:
street1-should-be-set: Er moet een adresregel aanwezig zijn
date-should-be-set: De begindatum van geldigheid moet aanwezig zijn
postcode-should-be-set: De postcode moet worden ingevuld
notification:
At least one addressee: Geef ten minste één geadresseerde op
Title must be defined: Er moet een titel worden aangegeven
Comment content might not be blank: De opmerking kan niet leeg zijn
workflow:
You must add at least one dest user or email: Geef ten minste één geadresseerde of een e-mailadres op
The user in cc cannot be a dest user in the same workflow step: De gebruiker in kopie kan niet aanwezig zijn in de gebruikers die de volgende stap zullen valideren
transition_has_destinee_if_sent_external: Geef een geadresseerde van de externe verzending op
transition_destinee_not_necessary: Voor deze transitie kunt u geen externe geadresseerden opgeven
You must add a destinee for signing: Geef een gebruiker of een gebruiker op voor ondertekening
rolling_date:
When fixed date is selected, you must provide a date: Geef de gekozen vaste datum op
user:
absence_end_requires_start: U kunt geen einddatum van afwezigheid invullen zonder begindatum.

View File

@@ -20,16 +20,16 @@
</ul>
</div>
<ul class="record_actions">
<li>
<button class="btn btn-save" disabled>
{{ $t("confirm.ok") }}
</button>
</li>
<li>
<a class="btn btn-delete" :href="deleteLink">
{{ $t("confirm.delete") }}
</a>
</li>
<li>
<button class="btn btn-save" disabled>
{{ $t("confirm.ok") }}
</button>
</li>
</ul>
</div>
@@ -40,6 +40,11 @@
"
/>
<ul class="record_actions">
<li>
<a class="btn btn-delete" :href="deleteLink">
{{ $t("confirm.delete") }}
</a>
</li>
<li>
<button
class="btn btn-save"
@@ -48,11 +53,6 @@
{{ $t("confirm.ok") }}
</button>
</li>
<li>
<a class="btn btn-delete" :href="deleteLink">
{{ $t("confirm.delete") }}
</a>
</li>
</ul>
</div>
</div>
@@ -112,7 +112,7 @@
</template>
<template #footer>
<button
class="btn btn-danger"
class="btn btn-save"
:disabled="disableConfirm"
@click="confirmCourse"
>

View File

@@ -0,0 +1,211 @@
Born the date: >-
{gender, select,
man {Geboren op {birthdate}}
woman {Geboren op {birthdate}}
neutral {Geboren op {birthdate}}
other {Geboren op {birthdate}}
}
Requestor: >-
{gender, select,
man {Aanvrager}
woman {Aanvraagster}
neutral {Aanvrager}
}
accompanying_period:
Participants_without_count: >-
{count, plural,
=0 {Deelnemer}
=1 {Deelnemer}
other {Deelnemers}
}
number: >-
nr. {id}
person:
from_the: sinds
And himself: >-
{gender, select,
man {en hijzelf}
woman {en zijzelf}
neutral {en zijzelf}
other {en zijzelf}
}
household:
Household: Huishouden
Household number: Huishouden {household_num}
Household members: Leden van het huishouden
Household editor: Lidmaatschap invullen
Members at same time: Gelijktijdige leden
Any simultaneous members: Geen gelijktijdige leden
Select people to move: Gebruikers kiezen
Show future or past memberships: >-
{length, plural,
one {Oud lidmaatschap tonen}
many {# oude of toekomstige lidmaatschappen tonen}
other {# oude of toekomstige lidmaatschappen tonen}
}
Show accompanying periods of past or future memberships: >-
{length, plural,
one {De trajecten van een oud lidmaatschap tonen}
many {# trajecten van oude of toekomstige lidmaatschappen tonen}
other {# trajecten van oude of toekomstige lidmaatschappen tonen}
}
Hide memberships: Verbergen
Those members does not share address: Deze gebruikers delen het adres van het huishouden niet.
Any persons into this position: Geen persoon behoort tot het huishouden in deze positie.
Leave household: Huishouden verlaten
Leave: Loskoppelen
person:
leave: De gebruiker verlaat het huishouden
Join: Huishouden aansluiten
Change position: Herpositioneren
Household file: Huishoudendossier
Add a member: Lid toevoegen
Update membership: Bewerken
successfully saved member: Lid succesvol opgeslagen
Start date: Startdatum van het lidmaatschap van het huishouden
End date: Einddatum van het lidmaatschap van het huishouden
Comment: Opmerking
is holder: Is houder
is not holder: Is geen houder
holder: Houder
Edit member household: Lidmaatschap van het huishouden invullen
Edit his household: Zijn lidmaatschap van het huishouden bewerken
Current household members: Huidige leden
Household summary: Overzicht van het huishouden
Accompanying period: Begeleidingstraject
Addresses: Adresgeschiedenis
Relationship: Verwantschap
Budget: Budget
Household relationships: Verwantschappen in het huishouden
Current address: Huidig adres
Household does not have any address currently: Het huishouden heeft momenteel geen adres ingevuld
Edit household members: Lidmaatschap van het huishouden invullen
and x other persons: >-
{x, plural,
one {en één andere persoon}
many {en # andere personen}
other {en # andere personen}
}
Expecting for birth on date: Geboorte verwacht op {date}
Expecting for birth: Geboorte verwacht (datum onbekend)
Any expecting birth: Geen aanstaande geboorte ingevuld.
New comment and expecting birth: Opmerking schrijven
Edit comment and expecting birth: Opmerking bijwerken
Edit member metadata: Aanvullende gegevens
comment_membership: Algemene opmerking over leden
expecting_birth: Geboorte verwacht?
date_expecting_birth: Datum van de verwachte geboorte
data_saved: Gegevens opgeslagen
Household history: Geschiedenis van de huishoudens
Household history for person: Geschiedenis van de huishoudens van de persoon
Household history for %name%: Geschiedenis van de huishoudens voor {name}
Household shared: Woonhuishouden
Household not shared: Huishoudens buiten woonplaats
Members without position: Leden zonder positie
Never in any household: Lid van geen enkel huishouden
Membership currently running: Lopend
from: Sinds
to: Tot
person history: Huishoudens
As member: Als
household_composition:
Since: >-
Sinds {startDate, date, long}
Still active: Nog steeds actief
Until: >-
Tot {endDate, date, long}
numberOfChildren children in household: >-
{numberOfChildren, plural,
=0 {Geen kind in het huishouden}
one {1 kind in het huishouden}
few {# kinderen in het huishouden}
other {# kinderen in het huishouden}
}
numberOfDependents adult dependents: >-
{numberOfDependents, plural,
=0 {Geen meerderjarige ten laste}
one {1 meerderjarige ten laste}
few {# meerderjarigen ten laste}
other {# meerderjarigen ten laste}
}
numberOfDependentsWithDisabilities dependents with disabilities: >-
{numberOfDependentsWithDisabilities, plural,
=0 {Geen ten laste erkend als persoon met beperking}
one {1 ten laste erkend als persoon met beperking}
few {# ten laste erkend als persoon met beperking}
other {# ten laste erkend als persoon met beperking}
}
periods:
title: Begeleidingstraject (nr. {id})
show closed periods: >-
{nb_items, plural,
=0 {Geen afgesloten traject}
one {Eén afgesloten traject of oud traject tonen}
many {# afgesloten trajecten of oude trajecten tonen}
other {# afgesloten trajecten of oude trajecten tonen}
}
hide closed periods: >-
{nb_items, plural,
=0 {Geen afgesloten traject}
one {Eén afgesloten traject of oud traject verbergen}
many {# afgesloten trajecten of oude trajecten verbergen}
other {# afgesloten trajecten of oude trajecten verbergen}
}
exports:
by_person:
Filtered by person\'s geographical unit (based on address) computed at date, only units:
"Gefilterd op geografische zone op basis van het adres, berekend op {datecalc, date, short}, alleen de volgende zones: {units}"
filter:
person:
without_participation_between_dates:
"Filtered by having no participations during period: between": "Alleen de gebruikers die door geen enkel traject zijn geraakt tussen {dateafter, date, short} en {datebefore, date, short}"
course:
not_having_address_reference:
describe: >-
Alleen de trajecten die niet gelokaliseerd zijn op een referentieadres, op de datum van {date_calc, date, medium}
by_referrer_between_dates:
description: >-
Gefilterd op referent van het traject, tussen twee data: vanaf {start_date, date, medium}, tot {end_date, date, medium}, alleen {agents}
by_user_job:
"Filtered by user job: only job": "Gefilterd op beroep van de referent tussen {startDate, date, short} en {endDate, date, short}: alleen {job}"
by_user_scope:
"Filtered by user main scope: only scopes": "Gefilterd op dienst van de referent tussen {startDate, date, short} en {endDate, date, short}: alleen {scopes}"
work:
by_treating_agent:
Filtered by treating agent at date: >-
De behandelende agenten op { agent_at, date, medium }, alleen {agents}
step_history:
by_date:
description: >-
Statuswijzigingen gefilterd op datum: na { start_date, date, medium } (inclusief), voor { end_date, date, medium }
'total persons matching the search pattern': >-
{ total, plural,
=0 {Geen gebruiker komt overeen met de zoektermen}
one {Eén gebruiker komt overeen met de zoektermen}
many {# gebruikers komen overeen met de zoektermen}
other {# gebruikers komen overeen met de zoektermen}
}
'nb person with similar name. Please verify that this is a new person': >-
{ nb, plural,
=0 {Geen gebruiker heeft een vergelijkbare naam}
one {Eén gebruiker heeft een vergelijkbare naam. Controleer dat het niet om hem/haar gaat.}
other {# gebruikers hebben een vergelijkbare naam. Controleer dat het niet om één van hen gaat}
}
accompanying_course_evaluation_document:
title: Evaluatie (nr. {id}) - {doc_title}
duplicated_at: >-
Gedupliceerd op {at, date, long} om {at, time, short}
accompanying_period_work:
title: Begeleidingsactie (nr. {id}) - {action_title}

File diff suppressed because it is too large Load Diff

View File

@@ -10,3 +10,68 @@
'Opening date can not be null': 'Startdatum kan niet nul zijn'
'Closing date is not valid': 'De datum van afsluiten is niet correct'
'Closing date can not be null': 'De datum van afsluiten kan niet nul zijn'
The date of closing is before the date of opening: De sluitingsdatum ligt voor de openingsdatum
The closing date must be later than the date of creation: De sluitingsdatum moet later zijn dan de aanmaakdatum van het traject
The birthdate must be before %date%: De geboortedatum moet voor %date% zijn
'Invalid phone number: it should begin with the international prefix starting with "+", hold only digits and be smaller than 20 characters. Ex: +33123456789': 'Ongeldig telefoonnummer: het moet beginnen met het internationale voorvoegsel voorafgegaan door "+", alleen cijfers bevatten en minder dan 20 tekens zijn. Bijv.: +31623456789'
'Invalid phone number: it should begin with the international prefix starting with "+", hold only digits and be smaller than 20 characters. Ex: +33623456789': 'Ongeldig telefoonnummer: het moet beginnen met het internationale voorvoegsel voorafgegaan door "+", alleen cijfers bevatten en minder dan 20 tekens zijn. Bijv.: +33623456789'
'The email is not valid': 'Het e-mailadres is niet geldig'
Two addresses has the same validFrom date: De geldigheidsdatum is identiek aan die van een ander adres
The firstname cannot be empty: De voornaam kan niet leeg zijn
The lastname cannot be empty: De achternaam kan niet leeg zijn
The gender must be set: Het geslacht moet worden ingevuld
You are not allowed to perform this action: U heeft niet het recht om deze waarde te wijzigen.
Sorry, but someone else has already changed this entity. Please refresh the page and apply the changes again: Sorry, maar iemand anders heeft deze entiteit al gewijzigd. Vernieuw de pagina en pas de wijzigingen opnieuw toe
A center is required: Een territorium is vereist
#export list
You must select at least one element: U moet ten minste één element selecteren
# filter by person birthdate
The "date to" should not be empty: Het veld "geboren vóór deze datum" kan niet leeg zijn
The "date from" should not be empty: Het veld "geboren na deze datum" kan niet leeg zijn
The date "date to" should be after the date given in "date from" field: De datum "geboren vóór deze datum" moet eerder zijn dan de datum "geboren na deze datum".
# filter by nationality
A nationality must be selected: Een nationaliteit moet worden gekozen
# aggregator by country, nationality
You should select an option: Een optie moet worden gekozen.
# aggregator by age
The date should not be empty: De datum mag niet leeg zijn
# household
household:
max_holder_overflowed_infinity: Er kunnen niet meer dan twee houders tegelijk zijn. Met deze wijziging zal dit aantal vanaf {{ start }} worden overschreden.
max_holder_overflowed: Er kunnen niet meer dan twee houders tegelijk zijn. Met deze wijziging zal dit aantal tussen {{ start }} en {{ end }} worden overschreden.
household_membership:
The end date must be after start date: De einddatum van het lidmaatschap moet later zijn dan de begindatum.
Person with membership covering: Een gebruiker kan niet tegelijkertijd tot twee huishoudens behoren. Met deze wijziging zou %person_name% vanaf %from% tot %nbHousehold% huishoudens behoren.
# Accompanying period
'{{ name }} is already associated to this accompanying course.': '{{ name }} is al gekoppeld aan dit traject.'
A course must contains at least one social issue: 'Een traject moet aan ten minste één sociale problematiek worden gekoppeld'
A course must be associated to at least one scope: 'Een traject moet aan ten minste één dienst worden gekoppeld'
The social %name% issue cannot be deleted because it is associated with an activity or an action: 'De sociale problematiek "%name%" kan niet worden verwijderd omdat deze is gekoppeld aan een uitwisseling of een actie'
A confidential parcours must have a referrer: 'Een vertrouwelijk traject moet een referent hebben'
Only the referrer can change the confidentiality of a parcours: 'Alleen de referent kan de vertrouwelijkheid wijzigen'
# resource
You must associate at least one entity: Koppel een gebruiker, een derde of geef een vrije beschrijving op
You cannot associate a resource with the same person: U kunt de gebruiker zelf niet als hulpbron toevoegen.
#location
The period must remain located: 'Een traject moet worden gelokaliseerd'
The person where the course is located must be associated to the course. Change course's location before removing the person.: "Het traject is gelokaliseerd bij deze gebruiker. Wijzig de lokalisatie van het traject voordat u de gebruiker verwijdert"
#relationship
relationship:
duplicate: Er bestaat al een verwantschapsrelatie tussen deze 2 gebruikers
person_creation:
If you want to create an household, an address is required: Voor het aanmaken van een huishouden is een adres vereist
accompanying_course_work:
The endDate should be greater or equal than the start date: De einddatum moet gelijk zijn aan of later dan de begindatum

View File

@@ -0,0 +1,7 @@
total reports matching the search: >-
{ total, plural,
=0 {Geen enkel rapport voldoet aan de zoekterm(en)}
one {Één rapport voldoet aan de zoekterm(en)}
many {# rapporten voldoen aan de zoekterm(en)}
other {# rapporten voldoen aan de zoekterm(en)}
}

View File

@@ -1,31 +1,55 @@
'Report edit': Dossier uitgave
'Save report': Bewaar consultatiegegevens
'Reset report': Verwijder consultatiegegevens
'Add a report': Voeg een consultatierapport toe
'Add report': 'Voeg rapport toe'
'Create a new report': 'Maak een nieuw consultatieblad aan'
'Report view': "Details van de consultatiegegevens"
'Update the report': 'Vul dossier aan'
'Report list': 'Overzicht van de consultaties'
'Report edit': "Rapport bewerken"
'Save report': "Rapport opslaan"
'Reset report': "Resetten"
'Add a report': "Rapport toevoegen"
'Add report': 'Rapport toevoegen'
'Create a new report': 'Nieuw rapport aanmaken'
'Report view': "Details van een rapport"
'Update the report': 'Rapport bewerken'
'Report list': 'Lijst van rapporten'
Details: Details
Person: Person
Scope: Scope
Person: Gebruiker
Scope: Dienst
Date: Datum
User: Gebruiker
'Report type': 'Soort of verslag'
'View the report': "Bekijk de consultatiegegevens"
'Report type': 'Type rapport'
'View the report': "Rapport bekijken"
Report data: Rapportgegevens
'Report view : %name%': 'Rapport: %name%'
Report: Rapport
No report registered for this person.: Geen rapport voor deze gebruiker.
#Flash messages
'Success : report created!': "De consultatiegegevens zijn correct ingevuld!"
'The form is not valid. The report has not been created !': "De gegevens zijn niet correct, er wordt geen rapport gemaakt"
'Success : report updated!': "Update is gelukt"
'The form is not valid. The report has not been updated !': "Update is mislukt, probeer opnieuw."
'Success : report created!': "Succes: het rapport is aangemaakt!"
'The form is not valid. The report has not been created !': "Het formulier bevat fouten, het rapport is niet aangemaakt"
'Success : report updated!': "Succes: het rapport is bijgewerkt!"
'The form is not valid. The report has not been updated !': "Het formulier bevat fouten, het rapport is niet bijgewerkt"
#Exception messags
'Unable to find this report.': Dossier is onvindbaar
'This is not the report of the person.': "Dit is niet het dossier van deze person"
'Unable to find this report.': Rapport niet gevonden.
'This is not the report of the person.': "De persoon en het geselecteerde rapport zijn niet gekoppeld"
'You are going to leave a page with unsubmitted data. Are you sure you want to leave ?': 'U bent aan te vertrekken een pagina die veranderdt datas behoudt. Bent u er zeker van dat u wil vertrekken ?'
#search
'You may not set a date argument and a date in default': U hebt twee datums ingevoerd, één met het datumargument en de andere in de standaard zoekzone. Geef één van beide op
'You must provide either a date:YYYY-mm-dd argument or a YYYY-mm-dd default search': Geef ofwel een argument date:YYYY-mm-dd op, ofwel een datum in de standaardzoekopdracht.
'Reports search results': Zoeken in de rapporten
#timeline
'%user% has filled a %report_label% report on %date%': "%user% heeft een rapport '%report_label%' toegevoegd om %date%"
'%user% has filled a %report_label% report': "%user% heeft een rapport '%report_label%' toegevoegd"
#roles
CHILL_REPORT_UPDATE: Rapporten bewerken
CHILL_REPORT_SEE: Rapporten bekijken
CHILL_REPORT_CREATE: Rapporten aanmaken
CHILL_REPORT_LISTS: Lijst van rapporten
#exports
"List for report '%type%'": Lijst van rapporten "%type%"
"Generate list of report '%type%'": Genereert een lijst van rapporten "%type%"
"Report's question": Vraag van het rapport
Filter by report's date: Filteren op rapportdatum
Report is after this date: Rapporten na deze datum
Report is before this date: Rapporten vóór deze datum
"Filtered by report's date: between %date_from% and %date_to%": "Gefilterd op rapportdatum: tussen %date_from% en %date_to%"

View File

@@ -0,0 +1,14 @@
#widget
nb tasks over deadline: >-
{nb, plural,
=0 {Geen taak met overschreden deadline}
one {Eén taak met overschreden deadline}
other {# taken met overschreden deadline}
}
nb tasks near deadline: >-
{nb, plural,
=0 {Geen taak in herinnering}
one {Eén taak in herinnering}
other {# taken in herinnering}
}

View File

@@ -0,0 +1,117 @@
Tasks: "Taken"
"New task": "Nieuwe taak"
"Add a new task": "Nieuwe taak toevoegen"
Title: Titel
Description: Beschrijving
Assignee: "Toegewezen persoon"
Scope: Dienst
"Start date": "Startdatum"
"End date": "Einddatum"
"Warning date": "Waarschuwingsdatum"
"Warning interval": "Waarschuwingstermijn vóór de einddatum"
"Unknown dates": "Data niet gespecificeerd"
"N": ""
"Unit": ""
Task: Taak
Details: Details
Person: Gebruiker
Date: Datum
Dates: Data
User: Gebruiker
"Task list": "Takenlijst"
"Tasks with expired deadline": "Taken met een overschreden einddatum"
"Tasks with warning deadline reached": "Taken met een bereikte waarschuwingsdatum"
"Current tasks": "Lopende taken"
"Closed tasks": Afgesloten taken
"Tasks not started": "Niet-begonnen taken"
"Task start date": "Startdatum"
"Task warning date": "Waarschuwingsdatum"
"Task end date": "Einddatum"
"Start": "Start"
"Warning": "Waarschuwing"
"End": "Einddatum"
"Task type": "Type"
"Task status": "Status"
"Edit the task": "Taak bewerken"
"Edit task": "Taak bewerken"
"Save task": "Taak opslaan"
"View the task": "Taak bekijken"
"Update the task": "Taak bijwerken"
"Remove task": "Taak verwijderen"
"Delete": "Verwijderen"
"Change task status": "Status wijzigen"
'Are you sure you want to remove the task about "%name%" ?': 'Weet u zeker dat u de taak van "%name%" wilt verwijderen?'
'Are you sure you want to remove the task "%title%" ?': 'Weet u zeker dat u de taak "%title%" wilt verwijderen?'
"See more": "Meer zien"
"Associated tasks": "Gekoppelde taken"
"My tasks": "Mijn taken"
"Tasks for this accompanying period": "Taken voor dit begeleidingstraject"
"Tasks for {{ name }}": "Taken voor {{ name }}"
"No description": "Geen beschrijving"
"No dates specified": "Data niet gespecificeerd"
"No one assignee": "Geen toegewezen gebruiker"
"Task types": Taaktypes
Days: Dag(en)
Weeks: Week/Weken
Months: Maand(en)
Year: Jaar/Jaren
Filter the tasks: Taken filteren
Filter: Filteren
Any user: Alle gebruikers
Unassigned: Niet toegewezen
Associated person: Gekoppelde gebruiker
Default task: Standaardtaak
Not assigned: Geen toegewezen gebruiker
For person: Voor
By: Door
Any tasks: Geen taak
Filter by user: Filteren op gebruiker(s)
# transitions - default task definition
"new": "nieuw"
"in_progress": "bezig"
"closed": "gesloten"
"canceled": "verwijderd"
start: starten
close: afsluiten
cancel: annuleren
Start_verb: Starten
Close_verb: Afsluiten
Set this task to cancel state: Deze taak markeren als geannuleerd
"%user% has closed the task": "%user% heeft de taak gesloten"
"%user% has canceled the task": "%user% heeft de taak geannuleerd"
"%user% has started the task": "%user% heeft de taak gestart"
"%user% has created the task": "%user% heeft de taak ingevoerd"
Are you sure you want to close this task ?: Weet u zeker dat u deze taak wilt afsluiten?
Are you sure you want to cancel this task ?: Weet u zeker dat u deze taak wilt annuleren?
Are you sure you want to start this task ?: Weet u zeker dat u deze taak wilt starten?
#Flash messages
"The task is created": "De taak is aangemaakt"
"There is no tasks.": Geen taak.
"The task has been successfully removed.": "De taak is succesvol verwijderd"
"This form contains errors": "Dit formulier bevat fouten"
"The task has been updated": "De taak is bijgewerkt"
"The transition is successfully applied": "De transitie is succesvol toegepast"
"The transition could not be applied": "De transitie kon niet worden toegepast"
Tasks near deadline: Taken met naderende einddatum
Tasks over deadline: Taken met overschreden einddatum
Tasks without alert: Taken met toekomstige of zonder einddatum
#title
My tasks near deadline: Mijn taken met naderende einddatum
My tasks over deadline: Mijn taken met overschreden einddatum
#transition page
Apply transition on task <em>%title%</em>: Transitie toepassen op taak <em>%title%</em>
All centers: Alle territoria
# ROLES
CHILL_TASK_TASK_CREATE: Taak toevoegen
CHILL_TASK_TASK_DELETE: Taak verwijderen
CHILL_TASK_TASK_SHOW: Taak bekijken
CHILL_TASK_TASK_UPDATE: Taak bewerken
CHILL_TASK_TASK_CREATE_FOR_COURSE: Taak aanmaken voor een traject
CHILL_TASK_TASK_CREATE_FOR_PERSON: Taak aanmaken voor een gebruiker

View File

@@ -0,0 +1,4 @@
The start date must be before the end date: De startdatum moet voor de einddatum liggen
This form contains errors: Het formulier bevat fouten
The start date must be before warning date: De startdatum moet voor de waarschuwingsdatum liggen
An end date is required if a warning interval is set: Een einddatum is vereist wanneer een herinneringsinterval is ingesteld

View File

@@ -0,0 +1,169 @@
Third party: Externe partner
Third parties: Externe partners
third parties: externe partners
firstname: Voornaam
name: Naam
telephone: Telefoon
telephone2: Ander telefoonnummer
adress: Adres
email: E-mail
comment: Opmerking
thirdparty.type: type
thirdparty.Type: Type
thirdparty.No_phonenumber: Geen telefoonnummer
thirdparty.No_email: Geen e-mail
thirdparty.No_comment: Geen opmerking
thirdparty.NameCompany: Dienst/Afdeling
thirdparty.Acronym: Afkorting
thirdparty.Categories: Categorieën
thirdparty.no_categories: Geen categorie
thirdparty.Child: Contactpersoon
thirdparty.child: Contactpersoon
thirdparty.Children: Contactpersonen
thirdparty.children: Contactpersonen
thirdparty.Parent: Institutionele externe partner
thirdparty.Parents: Institutionele externe partners
thirdparty.Civility: Aanspreekvorm
thirdparty.choose civility: --
thirdparty.Profession: Hoedanigheid
thirdparty.choose profession: --
thirdparty.CreatedAt.short: 'Aangemaakt op '
thirdparty.UpdatedAt.short: 'Gewijzigd op '
thirdparty.UpdateBy.short: ' door '
thirdparty.CreatedAt.long: Aanmaakdatum
thirdparty.UpdatedAt.long: Datum van de laatste wijziging
thirdparty.UpdateBy.long: Gebruiker die de laatste wijziging heeft uitgevoerd
thirdparty.A company: Een rechtspersoon
thirdparty.company: Rechtspersoon
thirdparty.A contact: Een natuurlijk persoon
thirdparty.contact: Natuurlijk persoon
thirdparty.Contact of: Contact van
thirdparty.a_company_explanation: >-
Rechtspersonen kunnen één of meerdere contacten hebben, intern aan de instelling. Het is ook mogelijk om
hen een afkorting en de naam van een dienst toe te kennen.
thirdparty.a_contact_explanation: >-
Natuurlijke personen hebben geen afkorting, dienst of onderliggende contacten. Het is mogelijk om hen
een aanspreekvorm en een beroep toe te kennen.
thirdparty.Which kind of third party ?: Welk type externe partner wilt u aanmaken?
thirdparty.Contact data are confidential: Contactgegevens zijn vertrouwelijk
New third party: Nieuwe externe partner toevoegen
Show third party %name%: Externe partner "%name%"
Create third party: Externe partner aanmaken
Update third party %name%: Externe partner "%name%" bijwerken
List of third parties: Lijst van externe partners
Third party updated: De externe partner is bijgewerkt
Third party created: De externe partner is aangemaakt
thirdparty.Status: Status
Active, shown to users: Actief, zichtbaar voor gebruikers
Active: Actief
shown to users: zichtbaar voor gebruikers
Inactive, not shown to users: Inactief, onzichtbaar voor gebruikers
Inactive: Inactief
not shown to users: onzichtbaar voor gebruikers
Show thirdparty: Externe partner bekijken
Add a contact: Contact toevoegen
Remove a contact: Verwijderen
Contacts: Contacten
No contacts associated: Geen contact
No nameCompany given: Geen bedrijfsnaam ingevuld
No acronym given: Geen afkorting ingevuld
No phone given: Geen telefoon ingevuld
No email given: Geen e-mailadres ingevuld
The party is visible in those centers: De externe partner is zichtbaar in deze territoria
The party is not visible in any center: De externe partner is niet gekoppeld aan een territorium
No third parties: Geen externe partners
Any third party selected: Geen externe partner geselecteerd
Thirdparty handling: Behandelende externe partner
Thirdparty workers: Tussenkomende externe partners
Third party category: Categorieën van externe partners
Third party configuration: Beheer van externe partners
# person resource
Select a thirdparty: "Kies een externe partner"
Contact person: "Contactpersoon"
# Residential address
The address of a third party: Het adres van een externe partner
residential_address_third_party_explanation: Het adres zal worden gekoppeld aan dat van een externe partner.
Host third party: Het adres van een externe partner kiezen
# ROLES
CHILL_3PARTY_3PARTY_CREATE: Externe partner toevoegen
CHILL_3PARTY_3PARTY_SHOW: Externe partner bekijken
CHILL_3PARTY_3PARTY_UPDATE: Externe partner bewerken
# crud:
crud:
3party_3party:
index:
add_new: Aanmaken
thirdparty_thirdparty-category:
index:
title: Lijst van categorieën van externe partners
add_new: Nieuwe toevoegen
title_new: Nieuwe categorie van externe partners
title_edit: Categorie van externe partners bewerken
# docgen
docgen:
A context for person with a third party (for sending mail): Een context van een persoon met een externe partner (om bijvoorbeeld een brief naar deze externe partner te sturen)
Person with third party: Persoon met keuze van een externe partner
Ask for thirdParty: Vragen aan de gebruiker om een externe partner te specificeren
thirdParty label: Benaming van de externe partner
# exports
export:
list:
acp:
isRequestorThirdParty: Is de aanvrager een externe partner?
requestorThirdPartyId: Identificatie van de externe partner
acprequestorThirdPaty: Naam van de aanvragende externe partner
acpw:
handlingThierParty: Behandelende externe partner
thirdParties: Tussenkomende externe partner
# exports filters/aggregators
Filtered by person\'s who have a residential address located at a thirdparty of type %thirparty_type%: Alleen de gebruikers die een woonadres hebben bij een externe partner van categorie %thirdparty_type%
is thirdparty: De aanvrager is een externe partner
Filter by person's who have a residential address located at a thirdparty of type: Gebruikers filteren die een woonadres hebben bij een externe partner
"Filtered by person's who have a residential address located at a thirdparty of type %thirdparty_type% and valid on %date_calc%": "Alleen de gebruikers die een woonadres hebben bij een externe partner van categorie %thirdparty_type% en geldig op datum %date_calc%"
# admin
admin:
export_description: Lijst van externe partners (CSV-formaat)
Profession: Beroep
Firstname: Voornaam
Name_company: Dienst/Afdeling
Address: Adres
Civility: Aanspreekvorm
Id: Identificatie
Contact id: Identificatie van het contact
Contact name: Naam van het contact
Contact firstname: Voornaam van het contact
Contact phone: Telefoon van het contact
Contact phone2: Andere telefoon van het contact
Telephone2: Andere telefoon
Contact email: E-mail van het contact
Contact address: Adres van het contact
Contact profession: Beroep van het contact
thirdparty_duplicate:
title: Dubbele externe partners samenvoegen
find: Een dubbele externe partner aanwijzen
Thirdparty to keep: Te behouden externe partner
Thirdparty to delete: Te verwijderen externe partner
Thirdparty to delete explanation: Deze externe partner zal worden verwijderd. Alleen de contacten van deze externe partner, hieronder opgesomd, zullen worden overgedragen.
Thirdparty to keep explanation: Deze externe partner zal worden behouden
Data to keep: Bewaarde gegevens
You cannot merge a thirdparty with itself. Please choose a different thirdparty: U kunt een externe partner niet met zichzelf samenvoegen. Kies een andere externe partner.
A thirdparty can only be merged with a thirdparty of the same kind: Een externe partner kan alleen worden samengevoegd met een externe partner van hetzelfde type.
Two child thirdparties must have the same parent: Twee externe partners van het type "contact" moeten gelinked zijn aan dezelfde hiërarchische "ouder".
Merge successful: Het samenvoegen is succesvol uitgevoerd

View File

@@ -0,0 +1,2 @@
thirdParty:
thirdParty_has_no_email: De externe partner {{ thirdParty }} heeft geen e-mail adres.

View File

@@ -0,0 +1,2 @@
wopi_editor:
document unsupported for edition: Dit formaat van document is niet bewerkbaar.

View File

@@ -2,9 +2,6 @@
"champs-libres/wopi-bundle": {
"version": "dev-master"
},
"chill-project/chill-zimbra-bundle": {
"version": "dev-472-zimbra-connector"
},
"doctrine/annotations": {
"version": "1.14",
"recipe": {
@@ -263,6 +260,15 @@
"src/Kernel.php"
]
},
"symfony/loco-translation-provider": {
"version": "6.0",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "5.3",
"ref": "500b568fcdf2de12ac18e157e11820114db89986"
}
},
"symfony/mailer": {
"version": "5.4",
"recipe": {