Merge branch 'master' into master

This commit is contained in:
Lorenzo Milesi
2022-08-11 09:53:06 +02:00
committed by GitHub
123 changed files with 2708 additions and 747 deletions

View File

@ -11,7 +11,7 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
operating-system: ['ubuntu-latest'] operating-system: ['ubuntu-latest']
php-versions: ['8.1', '8.0','7.4','7.3', '7.2','7.1','7.0', '5.6'] php-versions: ['8.1', '8.0','7.4']
services: services:
mariadb: mariadb:
@ -69,6 +69,9 @@ jobs:
- name: Run tests - name: Run tests
run: XDEBUG_MODE=coverage php vendor/bin/codecept run --coverage --coverage-xml run: XDEBUG_MODE=coverage php vendor/bin/codecept run --coverage --coverage-xml
- name: Run static code analysis
run: vendor/bin/phpstan analyse
- name: Archive failed tests artifacts - test output & log - name: Archive failed tests artifacts - test output & log
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@v2
if: failure() if: failure()

3
.gitignore vendored
View File

@ -47,8 +47,7 @@ codeception.yml
# Code Style Checkers and Mess Detectors # Code Style Checkers and Mess Detectors
/phpcs.xml /phpcs.xml
/.php_cs.cache .php-cs-fixer.cache
/.php_cs
# composer # composer
composer.lock composer.lock

43
.php-cs-fixer.dist.php Normal file
View File

@ -0,0 +1,43 @@
<?php
$header = <<<'EOF'
This file is part of the 2amigos/yii2-usuario project.
(c) 2amigOS! <http://2amigos.us/>
For the full copyright and license information, please view
the LICENSE file that was distributed with this source code.
EOF;
$finder = PhpCsFixer\Finder::create()
->exclude(['resources'])
->in("src/User")
;
$config = new PhpCsFixer\Config();
return $config->setRules([
'@PSR1' => true,
'@PSR2' => true,
'array_syntax' => ['syntax' => 'short'],
'header_comment' => ['header' => $header],
'combine_consecutive_unsets' => true,
'no_extra_blank_lines' => [
'tokens' => ['break', 'case', 'continue', 'curly_brace_block', 'default', 'extra', 'parenthesis_brace_block', 'return', 'square_brace_block', 'switch', 'throw', 'use', 'use_trait',],
],
'no_useless_else' => true,
'no_useless_return' => true,
'ordered_class_elements' => true,
'ordered_imports' => true,
'phpdoc_add_missing_param_annotation' => true,
'phpdoc_order' => true,
'phpdoc_align' => true,
'no_trailing_whitespace' => true,
'no_whitespace_in_blank_line' => true,
'no_trailing_comma_in_singleline_array' => true,
'no_whitespace_before_comma_in_array' => true,
'trim_array_spaces' => true,
'explicit_string_variable' => true,
'binary_operator_spaces' => true,
])
->setFinder($finder)
;

View File

@ -1,49 +0,0 @@
<?php
$header = <<<'EOF'
This file is part of the 2amigos/yii2-usuario project.
(c) 2amigOS! <http://2amigos.us/>
For the full copyright and license information, please view
the LICENSE file that was distributed with this source code.
EOF;
$finder = PhpCsFixer\Finder::create()
->exclude([
'.github',
'docs',
'temp',
'tests',
'vendor',
'src/User/resources'
])
->in(__DIR__);
return PhpCsFixer\Config::create()
->setRules(array(
'@PSR1' => true,
'@PSR2' => true,
'header_comment' => ['header' => $header],
'array_syntax' => array('syntax' => 'short'),
'combine_consecutive_unsets' => true,
'no_extra_consecutive_blank_lines' => array(
'break',
'continue',
'extra',
'return',
'throw',
'use',
'parenthesis_brace_block',
'square_brace_block',
'curly_brace_block'
),
'no_useless_else' => true,
'no_useless_return' => true,
'ordered_class_elements' => true,
'ordered_imports' => true,
'phpdoc_add_missing_param_annotation' => true,
'phpdoc_order' => true,
'phpdoc_align' => true
))
->setFinder($finder);

View File

@ -1,73 +1,92 @@
# CHANGELOG # CHANGELOG
## work in progress ## 1.6.0 work in progress
- Fix replace non-working travis build with working github actions build (TonisOrmisson) **WARNING**: this release (long time due) makes a step forward in PHP
- Fix user login events not triggered on ajax requests (TonisOrmisson) compatibility, leaving behind obsolete versions. While yii2-usuario should
- Enh: Added minimum requirements when a new password is automatically generated (MatteoF96) still work without issues on 5.6, from now on testing and development will
- Fix #380: Avoid rewriting AccessRule::matchRole (maxxer) look forward and manitain only >=7.4 versions.
- Fix #378: Add module attribute 'disableIpLogging' (jkmssoft)
- Enh #387: Added Persian translation (hadi-aj) There's a change in flash messages handling, please see #391
- Fix #384: Delete flash messages after consuming (cgsmith)
- Enh: Added SK translations (snickom) - Ehn: update welcome and confirmation email ending line (maxxer)
- Fix: allow password_changed_at to be saved when reseting password (p4blojf) - Ehn #361: Record and manage user session history (maranqz)
- Fix #430: Moved EVENT_BEFORE_PROFILE_UPDATE to correct place (eluhr) - Fix: replace non-working travis build with working github actions build (TonisOrmisson)
- Fix #391: Always create flash messages, allow `enableFlashMessages` only to dictate display (ajmedway) - Fix: user login events not triggered on ajax requests (TonisOrmisson)
- Enh: Added minimum requirements when a new password is automatically generated (MatteoF96)
- Fix #380: Avoid rewriting AccessRule::matchRole (maxxer)
- Fix #378: Add module attribute 'disableIpLogging' (jkmssoft)
- Enh #387: Added Persian translation (hadi-aj)
- Fix #384: Delete flash messages after consuming (cgsmith)
- Fix #381: Renamed events in `UserEvent` to avoid conflicts with events in `FormEvent` (Slayvin)
- Enh: Added SK translations (snickom)
- Fix: allow `password_changed_at` to be saved when reseting password (p4blojf)
- Fix #430: Moved `EVENT_BEFORE_PROFILE_UPDATE` to correct place (eluhr)
- Ehn #456: Added filter to allow forcing 2FA for specific user roles (acordeddu)
- Ehn #412: Allow role names to support UTF-8 chars (4khobta)
- Ehn #448: Remove deprecated SwiftMailer, use SymfonyMailer instead (TonisOrmisson)
- Ehn #428: Translations of the placeholders in the login widget (anapaulaxenon)
- Update PHP-CS-Fixer configuration to new version (maxxer)
- Fix #391: Always create flash messages, allow `enableFlashMessages` only to dictate display (ajmedway)
## 1.5.1 April 5, 2020 ## 1.5.1 April 5, 2020
- Fix #370: Extending view fix (effsoft)
- Fix #306: Add event for failed login (ivan-cc) - Fix #370: Extending view fix (effsoft)
- Fix #347: Only pass fields known to User model in registrationControl->actionRegister() (BillHeaton) - Fix #306: Add event for failed login (ivan-cc)
- Fix #346: Update ReCaptcha guide to not use AJAX (BillHeaton) - Fix #347: Only pass fields known to User model in registrationControl->actionRegister() (BillHeaton)
- Fix #345: Update ReCaptcha guide to add scenarios() in recoveryForm (BillHeaton) - Fix #346: Update ReCaptcha guide to not use AJAX (BillHeaton)
- Fix #307: Fix French translation (arollmann) - Fix #345: Update ReCaptcha guide to add scenarios() in recoveryForm (BillHeaton)
- Fix #316: Fix new response from Google OAuth Api (Julian-B90) - Fix #307: Fix French translation (arollmann)
- Fix #321: Fix new response from LinkedIn OAuth Api (tonydspaniard) - Fix #316: Fix new response from Google OAuth Api (Julian-B90)
- Fix #322: Fix boolean values in migrations for SQL server (tsdogs) - Fix #321: Fix new response from LinkedIn OAuth Api (tonydspaniard)
- Enh #325: Added support for sqlite3 (santilin) - Fix #322: Fix boolean values in migrations for SQL server (tsdogs)
- Fix #326: Fix rule for the user auth_tf_enabled field (santilin) - Enh #325: Added support for sqlite3 (santilin)
- Fix #290: Fix wrong email message for resending confirmation (tonydspaniard) - Fix #326: Fix rule for the user auth_tf_enabled field (santilin)
- Enh #269: Added help documentation to console commands (tonydspaniard) - Fix #290: Fix wrong email message for resending confirmation (tonydspaniard)
- Fix #244: Fix forced inclusion of a suggested class (tonydspaniard) - Enh #269: Added help documentation to console commands (tonydspaniard)
- Fix user event triggering in admin controller (maxxer) - Fix #244: Fix forced inclusion of a suggested class (tonydspaniard)
- Enh #331: Added Ukrainian translations (kwazaro) - Fix user event triggering in admin controller (maxxer)
- Enh #324: Added option to restrict user assignments to roles only (CheckeredFlag) - Enh #331: Added Ukrainian translations (kwazaro)
- Enh #224: Added option to require consent (eseperio) - Enh #324: Added option to restrict user assignments to roles only (CheckeredFlag)
- Enh: Added classMap for MailService (necrox87) - Enh #224: Added option to require consent (eseperio)
- Enh: Added classMap for MailService (necrox87)
## 1.5.0 April 19, 2019 ## 1.5.0 April 19, 2019
- Fix: Fix condition in EmailChangeService (it was always false) (borisaeric)
- Fix #198: Updated translations by quique, bizley, TonisOrmisson, guogan, Dezinger, maxxer, wautvda, mrbig00, fabiomlferreira, WeeSee - Fix: Fix condition in EmailChangeService (it was always false) (borisaeric)
- Fix #209: Doc fix. allowAccountDelete default value is false (Dezinger) - Fix #198: Updated translations by quique, bizley, TonisOrmisson, guogan, Dezinger, maxxer, wautvda, mrbig00, fabiomlferreira, WeeSee
- Fix #211: Migration boolean default value set to FALSE instead 0 (Dezinger) - Fix #209: Doc fix. allowAccountDelete default value is false (Dezinger)
- Fix #213: Migration sql syntax fix (Dezinger) - Fix #211: Migration boolean default value set to FALSE instead 0 (Dezinger)
- Ehn #131: 2FA libraries now optional (maxxer) - Fix #213: Migration sql syntax fix (Dezinger)
- Ehn #187: Add GDPR features (Eseperio) - Ehn #131: 2FA libraries now optional (maxxer)
- Enh #184: Add `last-login-ip` capture capability (kartik-v) - Ehn #187: Add GDPR features (Eseperio)
- Enh: Changed `View::render()` calls in views to use absolute paths (ajmedway) - Enh #184: Add `last-login-ip` capture capability (kartik-v)
- Fix #169: Fix bug in ReCaptchaComponent (BuTaMuH) - Enh: Changed `View::render()` calls in views to use absolute paths (ajmedway)
- Fix #168: Fix spelling in russian language (EvgenyOrekhov) - Fix #169: Fix bug in ReCaptchaComponent (BuTaMuH)
- Fix #195: UserCreateService: check if we're from web before setting flash message (maxxer) - Fix #168: Fix spelling in russian language (EvgenyOrekhov)
- Enh: Improvements to the admin responsive design (wautvda) - Fix #195: UserCreateService: check if we're from web before setting flash message (maxxer)
- Enh: Add controller module class reference (TonisOrmisson) - Enh: Improvements to the admin responsive design (wautvda)
- Enh: Replace the deprecated InvalidParamException in ClassMapHelper (TonisOrmisson) - Enh: Add controller module class reference (TonisOrmisson)
- Fix #242: Add POST filter for `admin/force-password-change` action (bscheshirwork) - Enh: Replace the deprecated InvalidParamException in ClassMapHelper (TonisOrmisson)
- Enh #251: Use `asset-packagist` instead of `fxp-asset` if you run it as a module without having a project around (bscheshirwork) - Fix #242: Add POST filter for `admin/force-password-change` action (bscheshirwork)
- Fix #252: Delete check for unexpected property `allowPasswordRecovery` for resend email by admin (bscheshirwork) - Enh #251: Use `asset-packagist` instead of `fxp-asset` if you run it as a module without having a project around (bscheshirwork)
- Fix #254: Rename `GDPR` properties to `lowerCamelCase` style (bscheshirwork) - Fix #252: Delete check for unexpected property `allowPasswordRecovery` for resend email by admin (bscheshirwork)
- Enh #253: Add PHPDoc for events class (bscheshirwork) - Fix #254: Rename `GDPR` properties to `lowerCamelCase` style (bscheshirwork)
- Fix #258: Rename `GDPR` delete action to `lowerCamelCase`/`dash` style (bscheshirwork) - Enh #253: Add PHPDoc for events class (bscheshirwork)
- Fix #271: Add closure support for `from` email address; Change default sender to `supportEmail` (bscheshirwork) - Fix #258: Rename `GDPR` delete action to `lowerCamelCase`/`dash` style (bscheshirwork)
- Fix #276: Fix missing translatable strings - Fix #271: Add closure support for `from` email address; Change default sender to `supportEmail` (bscheshirwork)
- Enh #249: Show message `email send if possible` any time on reset password request (bscheshirwork) - Fix #276: Fix missing translatable strings
- Enh #282: Allows customization of controller namespace (maxxer) - Enh #249: Show message `email send if possible` any time on reset password request (bscheshirwork)
- Enh #303: Added French translation (pde159) - Enh #282: Allows customization of controller namespace (maxxer)
- Fix #304: Fixed broken regex character class (CheckeredFlag) - Enh #303: Added French translation (pde159)
- Fix #304: Fixed broken regex character class (CheckeredFlag)
## 1.1.4 - February 19, 2018 ## 1.1.4 - February 19, 2018
- Enh: Check enableEmailConfirmation on registration (faenir) - Enh: Check enableEmailConfirmation on registration (faenir)
- Fix #154: Fix DateTime constructor with Unix timestamps (tonydspaniard) - Fix #154: Fix DateTime constructor with Unix timestamps (tonydspaniard)
## 1.1.2-3 - February 9, 2018 ## 1.1.2-3 - February 9, 2018
- Bug: Bugfix for Model events UserEvent::EVENT_BEFORE_CONFIRMATION and UserEvent::EVENT_AFTER_CONFIRMATION (ajmedway) - Bug: Bugfix for Model events UserEvent::EVENT_BEFORE_CONFIRMATION and UserEvent::EVENT_AFTER_CONFIRMATION (ajmedway)
- Bug: Bugfix for Model events UserEvent::EVENT_BEFORE_CREATE and UserEvent::EVENT_AFTER_CREATE (ajmedway) - Bug: Bugfix for Model events UserEvent::EVENT_BEFORE_CREATE and UserEvent::EVENT_AFTER_CREATE (ajmedway)
- Enh #137: Added the ability to make `enableAutologin` configurable (pappfer) - Enh #137: Added the ability to make `enableAutologin` configurable (pappfer)
@ -82,6 +101,7 @@
- Bug #110: Honor `enableFlashMessages` in `PasswordRecoveryService` (maxxer) - Bug #110: Honor `enableFlashMessages` in `PasswordRecoveryService` (maxxer)
## 1.1.1 - November 27, 2017 ## 1.1.1 - November 27, 2017
- Bug #115: Convert client_id to string because pgsql fail with type convertion (Dezinger) - Bug #115: Convert client_id to string because pgsql fail with type convertion (Dezinger)
- Bug #119: Security fix: add AccessControl to RuleController (Dezinger) - Bug #119: Security fix: add AccessControl to RuleController (Dezinger)
- Enh #120: 2FA i18n russian translation (Dezinger) - Enh #120: 2FA i18n russian translation (Dezinger)
@ -94,6 +114,7 @@
- Enh #109: Make use of better classes names (tonydspaniard) - Enh #109: Make use of better classes names (tonydspaniard)
## 1.1.0 - October 22, 2017 ## 1.1.0 - October 22, 2017
- Enh #91: Documentation for Mail events (kartik-v) - Enh #91: Documentation for Mail events (kartik-v)
- Enh #79: Enhancements to Mailer exception handling and events (kartik-v) - Enh #79: Enhancements to Mailer exception handling and events (kartik-v)
- Fix #85: External links should open in a new tab|window (eseperio) - Fix #85: External links should open in a new tab|window (eseperio)
@ -115,12 +136,14 @@
- Fix #86: Fix view location bug (tonydspaniard) - Fix #86: Fix view location bug (tonydspaniard)
## 1.0.13 - August 12, 2017 ## 1.0.13 - August 12, 2017
- Fix #49: Fix wrong call of method make() for set attributes (MKiselev) - Fix #49: Fix wrong call of method make() for set attributes (MKiselev)
- Enh #46: Use safeUp()/safeDown() instead up()/down() in migrations (MKiselev) - Enh #46: Use safeUp()/safeDown() instead up()/down() in migrations (MKiselev)
- Fix #51: Typo fix rememberLoginLifeSpan to rememberLoginLifespan (MKiselev) - Fix #51: Typo fix rememberLoginLifeSpan to rememberLoginLifespan (MKiselev)
- Fix #58: Last login fix (pappfer) - Fix #58: Last login fix (pappfer)
## 1.0.12 - August 6, 2017 ## 1.0.12 - August 6, 2017
- Bug Fix: Modify ResetPasswordService to forcely update password_hash field (tonydspaniard) - Bug Fix: Modify ResetPasswordService to forcely update password_hash field (tonydspaniard)
- Bug Fix: Fixed wrong routing misspell (tonydspaniard) - Bug Fix: Fixed wrong routing misspell (tonydspaniard)
- Enh #41: Remove deprecated package yii2-codeception (tonydspaniard) - Enh #41: Remove deprecated package yii2-codeception (tonydspaniard)
@ -130,12 +153,14 @@
- Fix #42: Allow setting permissions as children to roles (kurounin) - Fix #42: Allow setting permissions as children to roles (kurounin)
## 1.0.10-11 - July 25, 2017 ## 1.0.10-11 - July 25, 2017
- Fix #37: Fix bower alias in test environment (tekord) - Fix #37: Fix bower alias in test environment (tekord)
- Enh #32: Added Italian Translation (maxxer) - Enh #32: Added Italian Translation (maxxer)
- Fix #30: Prefill username and email in SettingsForm (mattheobjornson) - Fix #30: Prefill username and email in SettingsForm (mattheobjornson)
- Enh #39: Added `last_login_at` field to user table (pappfer) - Enh #39: Added `last_login_at` field to user table (pappfer)
## 1.0.9 - July 19, 2017 ## 1.0.9 - July 19, 2017
- Enh #22: Added impersonation feature (tonydspaniard) - Enh #22: Added impersonation feature (tonydspaniard)
## 1.0.8 - July 16, 2017 ## 1.0.8 - July 16, 2017

View File

@ -7,7 +7,6 @@ Yii 2 Usuario Extension
[![Latest Stable Version](https://poser.pugx.org/2amigos/yii2-usuario/version)](https://packagist.org/packages/2amigos/yii2-usuario) [![Latest Stable Version](https://poser.pugx.org/2amigos/yii2-usuario/version)](https://packagist.org/packages/2amigos/yii2-usuario)
[![Total Downloads](https://poser.pugx.org/2amigos/yii2-usuario/downloads)](https://packagist.org/packages/2amigos/yii2-usuario) [![Total Downloads](https://poser.pugx.org/2amigos/yii2-usuario/downloads)](https://packagist.org/packages/2amigos/yii2-usuario)
[![Build Status](https://github.com/2amigos/yii2-usuario/actions/workflows/php.yml/badge.svg)](https://github.com/2amigos/yii2-usuario/actions/) [![Build Status](https://github.com/2amigos/yii2-usuario/actions/workflows/php.yml/badge.svg)](https://github.com/2amigos/yii2-usuario/actions/)
[![Latest Unstable Version](https://poser.pugx.org/2amigos/yii2-usuario/v/unstable)](//packagist.org/packages/2amigos/yii2-usuario) [![Latest Unstable Version](https://poser.pugx.org/2amigos/yii2-usuario/v/unstable)](//packagist.org/packages/2amigos/yii2-usuario)
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/2amigos/yii2-usuario/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/2amigos/yii2-usuario/?branch=master) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/2amigos/yii2-usuario/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/2amigos/yii2-usuario/?branch=master)

View File

@ -44,15 +44,19 @@
"2amigos/yii2-selectize-widget": "^1.1", "2amigos/yii2-selectize-widget": "^1.1",
"yiisoft/yii2-authclient": "^2.1", "yiisoft/yii2-authclient": "^2.1",
"yiisoft/yii2-httpclient": "^2.0", "yiisoft/yii2-httpclient": "^2.0",
"yiisoft/yii2-bootstrap": "^2.0", "yiisoft/yii2-bootstrap": "^2.0"
"yiisoft/yii2-swiftmailer": "^2.0"
}, },
"suggest": { "suggest": {
"yiisoft/yii2-symfonymailer": "A mailer driver is needed to send e-mails. Older versions use abandoned Swiftmailer which can be replaced with symfonymailer",
"2amigos/2fa-library": "Needed if you want to enable 2 Factor Authentication. Require version ^1.0", "2amigos/2fa-library": "Needed if you want to enable 2 Factor Authentication. Require version ^1.0",
"2amigos/qrcode-library": "Needed if you want to enable 2FA with QR Code generation. Require version ^1.1" "2amigos/qrcode-library": "Needed if you want to enable 2FA with QR Code generation. Require version ^1.1"
}, },
"require-dev": { "require-dev": {
"friendsofphp/php-cs-fixer": "^2.3", "2amigos/2fa-library": "^2.0",
"2amigos/qrcode-library": "^2.0",
"friendsofphp/php-cs-fixer": "^3",
"php": ">=7.4",
"yiisoft/yii2-symfonymailer": "~2.0.0",
"squizlabs/php_codesniffer": "*", "squizlabs/php_codesniffer": "*",
"phpmd/phpmd": "@stable", "phpmd/phpmd": "@stable",
"codeception/verify": "^0.3.3", "codeception/verify": "^0.3.3",
@ -61,7 +65,8 @@
"codeception/module-filesystem": "^1.0", "codeception/module-filesystem": "^1.0",
"codeception/module-yii2": "^1.1", "codeception/module-yii2": "^1.1",
"codeception/module-asserts": "^1.1", "codeception/module-asserts": "^1.1",
"codeception/module-db": "^1.0" "codeception/module-db": "^1.0",
"phpstan/phpstan": "^1.8"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
@ -74,11 +79,17 @@
} }
}, },
"config": { "config": {
"platform": {
"php": "7.4"
},
"preferred-install": { "preferred-install": {
"*": "auto" "*": "auto"
}, },
"fxp-asset": { "fxp-asset": {
"enabled": false "enabled": false
},
"allow-plugins": {
"yiisoft/yii2-composer": true
} }
}, },
"conflict": { "conflict": {

6
docs/events/user-events.md Normal file → Executable file
View File

@ -21,6 +21,8 @@ On Controllers
- **UserEvent::EVENT_AFTER_UNBLOCK**: Occurs after a user is being un-blocked - **UserEvent::EVENT_AFTER_UNBLOCK**: Occurs after a user is being un-blocked
- **UserEvent::EVENT_BEFORE_SWITCH_IDENTITY**: Occurs before a user is being impersonated by admin - **UserEvent::EVENT_BEFORE_SWITCH_IDENTITY**: Occurs before a user is being impersonated by admin
- **UserEvent::EVENT_AFTER_SWITCH_IDENTITY**: Occurs after a user his being impersonated by admin - **UserEvent::EVENT_AFTER_SWITCH_IDENTITY**: Occurs after a user his being impersonated by admin
- **SessionEvent::EVENT_BEFORE_TERMINATE_USER_SESSIONS**
- **SessionEvent::EVENT_AFTER_TERMINATE_USER_SESSIONS**
- **RegistrationController** - **RegistrationController**
@ -41,6 +43,10 @@ On Controllers
- **UserEvent::EVENT_BEFORE_DELETE**: Occurs before the user account is deleted - **UserEvent::EVENT_BEFORE_DELETE**: Occurs before the user account is deleted
- **UserEvent::EVENT_AFTER_DELETE**: Occurs after the user account is deleted - **UserEvent::EVENT_AFTER_DELETE**: Occurs after the user account is deleted
- **SessionController**
- **SessionEvent::EVENT_BEFORE_TERMINATE_USER_SESSIONS**: Occurs before the user sessions is terminated
- **SessionEvent::EVENT_AFTER_TERMINATE_USER_SESSIONS**: Occurs after the user sessions is terminated
On Models On Models
--------- ---------

View File

@ -0,0 +1,60 @@
How to enable session history
============================
Session history list user sessions.
User can delete all sessions except current.
Configure Module and Application
--------------------------------
```php
// ...
'modules' => [
'user' => [
'class' => Da\User\Module::class,
'enableSessionHistory' => true,
]
],
// ...
'components' => [
'session' => Da\User\Service\SessionHistory\SessionHistoryDecorator::class,
]
// ...
'container' => [
'singletons' => [
Da\User\Service\SessionHistory\TerminateSessionsServiceInterface::class => Da\User\Service\SessionHistory\TerminateSessionsService::class
]
]
// ...
'controllerMap' => [
'migrate' => [
...
'migrationNamespaces' => [
'Da\User\Migration\Session',
],
],
],
```
Additionally for upping migration can use
```
./yii migrate --migrationNamespaces=Da\\User\\Migration\Session
```
Setting user screenshot:
![Settings user screenshot](./session-history/settings.png)
Admin screenshot:
![Admin screenshot](./session-history/admin.png)
© [2amigos](http://www.2amigos.us/) 2013-2019

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

1
docs/index.md Normal file → Executable file
View File

@ -188,6 +188,7 @@ Helpful Guides
- [How to Switch Identities](helpful-guides/how-to-switch-identities.md) - [How to Switch Identities](helpful-guides/how-to-switch-identities.md)
- [Separate Frontend and Backend Sessions](helpful-guides/separate-frontend-and-backend-sessions.md) - [Separate Frontend and Backend Sessions](helpful-guides/separate-frontend-and-backend-sessions.md)
- [Social Network Authentication](helpful-guides/social-network-authentication.md) - [Social Network Authentication](helpful-guides/social-network-authentication.md)
- [How to Enable session history](helpful-guides/how-to-use-session-history.md)
Contributing Contributing
------------ ------------

34
docs/installation/configuration-options.md Normal file → Executable file
View File

@ -3,6 +3,22 @@ Configuration Options
The module comes with a set of attributes to configure. The following is the list of all available options: The module comes with a set of attributes to configure. The following is the list of all available options:
#### enableSessionHistory (Type: `boolean, integer`, Default value: `false`)
If this option is to `true`, session history will be kept, [more](../helpful-guides/how-to-use-session-history.md).
#### numberSessionHistory (Type: `boolean, integer`, Default value: `false`)
Number of expired storing records `session history`, values:
- `false` Store all records without deleting
- `integer` Count of records for storing
#### timeoutSessionHistory (Type: `boolean, integer`, Default value: `false`)
How long store `session history` after expiring, values:
- `false` Store all records without deleting
- `integer` Time for storing after expiring in seconds
#### enableTwoFactorAuthentication (type: `boolean`, default: `false`) #### enableTwoFactorAuthentication (type: `boolean`, default: `false`)
Setting this attribute will allow users to configure their login process with two-factor authentication. Setting this attribute will allow users to configure their login process with two-factor authentication.
@ -12,6 +28,24 @@ Setting this attribute will allow users to configure their login process with tw
By default, Google Authenticator App for two-factor authentication cycles in periods of 30 seconds. In order to allow By default, Google Authenticator App for two-factor authentication cycles in periods of 30 seconds. In order to allow
a bigger period so to avoid out of sync issues. a bigger period so to avoid out of sync issues.
#### twoFactorAuthenticationForcedPermissions (type: `array`, default: `[]`)
The list of permissions for which two factor authentication is mandatory. In order to perform the check in every action you must configure a filter into your config file like this:
use Da\User\Filter\TwoFactorAuthenticationEnforceFilter;
...
'on beforeAction' => function() {
Yii::$app->controller->attachBehavior(
'enforceTwoFactorAuthentication',[
'class' => TwoFactorAuthenticationEnforceFilter::class,
'except' => ['login', 'logout', 'account', 'two-factor', 'two-factor-enable'],
]
);
},
...
This will redirect the user to their account page until the two factor authentication is enabled.
#### enableGdprCompliance (type: `boolean`, default: `false`) #### enableGdprCompliance (type: `boolean`, default: `false`)
Setting this attribute enables a serie of measures to comply with EU GDPR regulation, like data consent, right to be forgotten and data portability. Setting this attribute enables a serie of measures to comply with EU GDPR regulation, like data consent, right to be forgotten and data portability.

8
phpstan.neon Normal file
View File

@ -0,0 +1,8 @@
parameters:
level: 1
paths:
- src
excludePaths:
- 'src/resources/i18n/*'
bootstrapFiles:
- stan_autoload.php

10
src/User/Bootstrap.php Normal file → Executable file
View File

@ -16,7 +16,9 @@ use Da\User\Contracts\AuthManagerInterface;
use Da\User\Controller\SecurityController; use Da\User\Controller\SecurityController;
use Da\User\Event\FormEvent; use Da\User\Event\FormEvent;
use Da\User\Helper\ClassMapHelper; use Da\User\Helper\ClassMapHelper;
use Da\User\Model\SessionHistory;
use Da\User\Model\User; use Da\User\Model\User;
use Da\User\Search\SessionHistorySearch;
use Yii; use Yii;
use yii\authclient\Collection; use yii\authclient\Collection;
use yii\base\Application; use yii\base\Application;
@ -128,7 +130,7 @@ class Bootstrap implements BootstrapInterface
$model = is_array($definition) ? $definition['class'] : $definition; $model = is_array($definition) ? $definition['class'] : $definition;
$name = substr($class, strrpos($class, '\\') + 1); $name = substr($class, strrpos($class, '\\') + 1);
$modelClassMap[$class] = $model; $modelClassMap[$class] = $model;
if (in_array($name, ['User', 'Profile', 'Token', 'SocialNetworkAccount'])) { if (in_array($name, ['User', 'Profile', 'Token', 'SocialNetworkAccount', 'SessionHistory'])) {
$di->set( $di->set(
"Da\\User\\Query\\{$name}Query", "Da\\User\\Query\\{$name}Query",
function () use ($model) { function () use ($model) {
@ -315,10 +317,12 @@ class Bootstrap implements BootstrapInterface
'Assignment' => 'Da\User\Model\Assignment', 'Assignment' => 'Da\User\Model\Assignment',
'Permission' => 'Da\User\Model\Permission', 'Permission' => 'Da\User\Model\Permission',
'Role' => 'Da\User\Model\Role', 'Role' => 'Da\User\Model\Role',
'SessionHistory' => SessionHistory::class,
// --- search // --- search
'UserSearch' => 'Da\User\Search\UserSearch', 'UserSearch' => 'Da\User\Search\UserSearch',
'PermissionSearch' => 'Da\User\Search\PermissionSearch', 'PermissionSearch' => 'Da\User\Search\PermissionSearch',
'RoleSearch' => 'Da\User\Search\RoleSearch', 'RoleSearch' => 'Da\User\Search\RoleSearch',
'SessionHistorySearch' => SessionHistorySearch::class,
// --- forms // --- forms
'RegistrationForm' => 'Da\User\Form\RegistrationForm', 'RegistrationForm' => 'Da\User\Form\RegistrationForm',
'ResendForm' => 'Da\User\Form\ResendForm', 'ResendForm' => 'Da\User\Form\ResendForm',
@ -338,11 +342,13 @@ class Bootstrap implements BootstrapInterface
'Assignment', 'Assignment',
'Permission', 'Permission',
'Role', 'Role',
'SessionHistory'
], ],
'Da\User\Search' => [ 'Da\User\Search' => [
'UserSearch', 'UserSearch',
'PermissionSearch', 'PermissionSearch',
'RoleSearch', 'RoleSearch',
'SessionHistorySearch',
], ],
'Da\User\Form' => [ 'Da\User\Form' => [
'RegistrationForm', 'RegistrationForm',
@ -359,7 +365,7 @@ class Bootstrap implements BootstrapInterface
$mapping = array_merge($defaults, $userClassMap); $mapping = array_merge($defaults, $userClassMap);
foreach ($mapping as $name => $definition) { foreach ($mapping as $name => $definition) {
$map[$this->getRoute($routes, $name) . "\\$name"] = $definition; $map[$this->getRoute($routes, $name) . "\\{$name}"] = $definition;
} }
return $map; return $map;

39
src/User/Controller/AdminController.php Normal file → Executable file
View File

@ -17,9 +17,11 @@ use Da\User\Filter\AccessRuleFilter;
use Da\User\Model\Profile; use Da\User\Model\Profile;
use Da\User\Model\User; use Da\User\Model\User;
use Da\User\Query\UserQuery; use Da\User\Query\UserQuery;
use Da\User\Search\SessionHistorySearch;
use Da\User\Search\UserSearch; use Da\User\Search\UserSearch;
use Da\User\Service\PasswordExpireService; use Da\User\Service\PasswordExpireService;
use Da\User\Service\PasswordRecoveryService; use Da\User\Service\PasswordRecoveryService;
use Da\User\Service\SessionHistory\TerminateUserSessionsService;
use Da\User\Service\SwitchIdentityService; use Da\User\Service\SwitchIdentityService;
use Da\User\Service\UserBlockService; use Da\User\Service\UserBlockService;
use Da\User\Service\UserConfirmationService; use Da\User\Service\UserConfirmationService;
@ -66,7 +68,7 @@ class AdminController extends Controller
*/ */
public function beforeAction($action) public function beforeAction($action)
{ {
if (in_array($action->id, ['index', 'update', 'update-profile', 'info', 'assignments'], true)) { if (in_array($action->id, ['index', 'update', 'update-profile', 'info', 'assignments', 'session-history'], true)) {
Url::remember('', 'actions-redirect'); Url::remember('', 'actions-redirect');
} }
@ -88,6 +90,7 @@ class AdminController extends Controller
'switch-identity' => ['post'], 'switch-identity' => ['post'],
'password-reset' => ['post'], 'password-reset' => ['post'],
'force-password-change' => ['post'], 'force-password-change' => ['post'],
'terminate-sessions' => ['post'],
], ],
], ],
'access' => [ 'access' => [
@ -101,6 +104,11 @@ class AdminController extends Controller
'actions' => ['switch-identity'], 'actions' => ['switch-identity'],
'roles' => ['@'], 'roles' => ['@'],
], ],
[
'allow' => $this->getModule()->enableSessionHistory,
'actions' => ['session-history', 'terminate-sessions'],
'roles' => ['admin'],
],
[ [
'allow' => true, 'allow' => true,
'roles' => ['admin'], 'roles' => ['admin'],
@ -346,4 +354,33 @@ class AdminController extends Controller
} }
$this->redirect(['index']); $this->redirect(['index']);
} }
/**
* Display list session history
*/
public function actionSessionHistory($id)
{
$searchModel = new SessionHistorySearch([
'user_id' => $id,
]);
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
$user = $this->userQuery->where(['id' => $id])->one();
return $this->render('_session-history', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
'user' => $user,
]);
}
/**
* Terminate all session user
*/
public function actionTerminateSessions($id)
{
$this->make(TerminateUserSessionsService::class, [$id])->run();
return $this->redirect(Url::previous('actions-redirect'));
}
} }

View File

@ -110,13 +110,13 @@ class RegistrationController extends Controller
// Create a temporay $user so we can get the attributes, then get // Create a temporay $user so we can get the attributes, then get
// the intersection between the $form fields and the $user fields. // the intersection between the $form fields and the $user fields.
$user = $this->make(User::class, [] ); $user = $this->make(User::class, []);
$fields = array_intersect_key($form->attributes, $user->attributes); $fields = array_intersect_key($form->attributes, $user->attributes);
// Becomes password_hash // Becomes password_hash
$fields['password'] = $form['password']; $fields['password'] = $form['password'];
$user = $this->make(User::class, [], $fields ); $user = $this->make(User::class, [], $fields);
$user->setScenario('register'); $user->setScenario('register');
$mailService = MailFactory::makeWelcomeMailerService($user); $mailService = MailFactory::makeWelcomeMailerService($user);

View File

@ -1,6 +1,6 @@
<?php <?php
/* /**
* This file is part of the 2amigos/yii2-usuario project. * This file is part of the 2amigos/yii2-usuario project.
* *
* (c) 2amigOS! <http://2amigos.us/> * (c) 2amigOS! <http://2amigos.us/>
@ -116,19 +116,21 @@ class SecurityController extends Controller
return $this->goHome(); return $this->goHome();
} }
/** @var LoginForm $form */ /**
* @var LoginForm $form
*/
$form = $this->make(LoginForm::class); $form = $this->make(LoginForm::class);
/** @var FormEvent $event */ /**
* @var FormEvent $event
*/
$event = $this->make(FormEvent::class, [$form]); $event = $this->make(FormEvent::class, [$form]);
if (Yii::$app->request->isAjax && $form->load(Yii::$app->request->post())) { if (Yii::$app->request->isAjax && $form->load(Yii::$app->request->post())) {
Yii::$app->response->format = Response::FORMAT_JSON; Yii::$app->response->format = Response::FORMAT_JSON;
$this->trigger(FormEvent::EVENT_BEFORE_LOGIN, $event);
$errors = ActiveForm::validate($form); $errors = ActiveForm::validate($form);
if(empty($errors)) { if (empty($errors)) {
$this->trigger(FormEvent::EVENT_AFTER_LOGIN, $event);
return $errors; return $errors;
} }
$this->trigger(FormEvent::EVENT_FAILED_LOGIN, $event); $this->trigger(FormEvent::EVENT_FAILED_LOGIN, $event);
@ -137,9 +139,10 @@ class SecurityController extends Controller
if ($form->load(Yii::$app->request->post())) { if ($form->load(Yii::$app->request->post())) {
if ($this->module->enableTwoFactorAuthentication && $form->validate()) { if ($this->module->enableTwoFactorAuthentication && $form->validate()) {
if ($form->getUser()->auth_tf_enabled) { $user = $form->getUser();
Yii::$app->session->set('credentials', ['login' => $form->login, 'pwd' => $form->password]);
if ($user->auth_tf_enabled) {
Yii::$app->session->set('credentials', ['login' => $form->login, 'pwd' => $form->password]);
return $this->redirect(['confirm']); return $this->redirect(['confirm']);
} }
} }
@ -155,10 +158,7 @@ class SecurityController extends Controller
return $this->goBack(); return $this->goBack();
} }
else $this->trigger(FormEvent::EVENT_FAILED_LOGIN, $event);
{
$this->trigger(FormEvent::EVENT_FAILED_LOGIN, $event);
}
} }
return $this->render( return $this->render(
@ -181,13 +181,17 @@ class SecurityController extends Controller
} }
$credentials = Yii::$app->session->get('credentials'); $credentials = Yii::$app->session->get('credentials');
/** @var LoginForm $form */ /**
* @var LoginForm $form
*/
$form = $this->make(LoginForm::class); $form = $this->make(LoginForm::class);
$form->login = $credentials['login']; $form->login = $credentials['login'];
$form->password = $credentials['pwd']; $form->password = $credentials['pwd'];
$form->setScenario('2fa'); $form->setScenario('2fa');
/** @var FormEvent $event */ /**
* @var FormEvent $event
*/
$event = $this->make(FormEvent::class, [$form]); $event = $this->make(FormEvent::class, [$form]);
if (Yii::$app->request->isAjax && $form->load(Yii::$app->request->post())) { if (Yii::$app->request->isAjax && $form->load(Yii::$app->request->post())) {
@ -247,4 +251,5 @@ class SecurityController extends Controller
$this->make(SocialNetworkAccountConnectService::class, [$this, $client])->run(); $this->make(SocialNetworkAccountConnectService::class, [$this, $client])->run();
} }
} }

142
src/User/Controller/SettingsController.php Normal file → Executable file
View File

@ -1,6 +1,6 @@
<?php <?php
/* /**
* This file is part of the 2amigos/yii2-usuario project. * This file is part of the 2amigos/yii2-usuario project.
* *
* (c) 2amigOS! <http://2amigos.us/> * (c) 2amigOS! <http://2amigos.us/>
@ -26,7 +26,9 @@ use Da\User\Module;
use Da\User\Query\ProfileQuery; use Da\User\Query\ProfileQuery;
use Da\User\Query\SocialNetworkAccountQuery; use Da\User\Query\SocialNetworkAccountQuery;
use Da\User\Query\UserQuery; use Da\User\Query\UserQuery;
use Da\User\Search\SessionHistorySearch;
use Da\User\Service\EmailChangeService; use Da\User\Service\EmailChangeService;
use Da\User\Service\SessionHistory\TerminateUserSessionsService;
use Da\User\Service\TwoFactorQrCodeUriGeneratorService; use Da\User\Service\TwoFactorQrCodeUriGeneratorService;
use Da\User\Traits\ContainerAwareTrait; use Da\User\Traits\ContainerAwareTrait;
use Da\User\Traits\ModuleAwareTrait; use Da\User\Traits\ModuleAwareTrait;
@ -91,7 +93,8 @@ class SettingsController extends Controller
'actions' => [ 'actions' => [
'disconnect' => ['post'], 'disconnect' => ['post'],
'delete' => ['post'], 'delete' => ['post'],
'two-factor-disable' => ['post'] 'two-factor-disable' => ['post'],
'terminate-sessions' => ['post'],
], ],
], ],
'access' => [ 'access' => [
@ -111,7 +114,7 @@ class SettingsController extends Controller
'delete', 'delete',
'two-factor', 'two-factor',
'two-factor-enable', 'two-factor-enable',
'two-factor-disable' 'two-factor-disable',
], ],
'roles' => ['@'], 'roles' => ['@'],
], ],
@ -120,6 +123,11 @@ class SettingsController extends Controller
'actions' => ['confirm'], 'actions' => ['confirm'],
'roles' => ['?', '@'], 'roles' => ['?', '@'],
], ],
[
'allow' => $this->getModule()->enableSessionHistory,
'actions' => ['session-history', 'terminate-sessions'],
'roles' => ['@'],
],
], ],
], ],
]; ];
@ -138,7 +146,11 @@ class SettingsController extends Controller
$profile->link('user', Yii::$app->user->identity); $profile->link('user', Yii::$app->user->identity);
} }
/** @var ProfileEvent $event */ /**
*
*
* @var ProfileEvent $event
*/
$event = $this->make(ProfileEvent::class, [$profile]); $event = $this->make(ProfileEvent::class, [$profile]);
$this->make(AjaxRequestModelValidator::class, [$profile])->validate(); $this->make(AjaxRequestModelValidator::class, [$profile])->validate();
@ -170,9 +182,12 @@ class SettingsController extends Controller
if (!$this->module->enableGdprCompliance) { if (!$this->module->enableGdprCompliance) {
throw new NotFoundHttpException(); throw new NotFoundHttpException();
} }
return $this->render('privacy', [ return $this->render(
'privacy',
[
'module' => $this->module 'module' => $this->module
]); ]
);
} }
/** /**
@ -189,7 +204,11 @@ class SettingsController extends Controller
if (!$this->module->enableGdprCompliance) { if (!$this->module->enableGdprCompliance) {
throw new NotFoundHttpException(); throw new NotFoundHttpException();
} }
/** @var GdprDeleteForm $form */ /**
*
*
* @var GdprDeleteForm $form
*/
$form = $this->make(GdprDeleteForm::class); $form = $this->make(GdprDeleteForm::class);
$user = $form->getUser(); $user = $form->getUser();
@ -211,21 +230,25 @@ class SettingsController extends Controller
$security = $this->make(SecurityHelper::class); $security = $this->make(SecurityHelper::class);
$anonymReplacement = $this->module->gdprAnonymizePrefix . $user->id; $anonymReplacement = $this->module->gdprAnonymizePrefix . $user->id;
$user->updateAttributes([ $user->updateAttributes(
[
'email' => $anonymReplacement . "@example.com", 'email' => $anonymReplacement . "@example.com",
'username' => $anonymReplacement, 'username' => $anonymReplacement,
'gdpr_deleted' => 1, 'gdpr_deleted' => 1,
'blocked_at' => time(), 'blocked_at' => time(),
'auth_key' => $security->generateRandomString() 'auth_key' => $security->generateRandomString()
]); ]
$user->profile->updateAttributes([ );
$user->profile->updateAttributes(
[
'public_email' => $anonymReplacement . "@example.com", 'public_email' => $anonymReplacement . "@example.com",
'name' => $anonymReplacement, 'name' => $anonymReplacement,
'gravatar_email' => $anonymReplacement . "@example.com", 'gravatar_email' => $anonymReplacement . "@example.com",
'location' => $anonymReplacement, 'location' => $anonymReplacement,
'website' => $anonymReplacement . ".tld", 'website' => $anonymReplacement . ".tld",
'bio' => Yii::t('usuario', 'Deleted by GDPR request') 'bio' => Yii::t('usuario', 'Deleted by GDPR request')
]); ]
);
} }
$this->trigger(GdprEvent::EVENT_AFTER_DELETE, $event); $this->trigger(GdprEvent::EVENT_AFTER_DELETE, $event);
@ -234,14 +257,21 @@ class SettingsController extends Controller
return $this->goHome(); return $this->goHome();
} }
return $this->render('gdpr-delete', [ return $this->render(
'gdpr-delete',
[
'model' => $form, 'model' => $form,
]); ]
);
} }
public function actionGdprConsent() public function actionGdprConsent()
{ {
/** @var User $user */ /**
*
*
* @var User $user
*/
$user = Yii::$app->user->identity; $user = Yii::$app->user->identity;
if ($user->gdpr_consent) { if ($user->gdpr_consent) {
return $this->redirect(['profile']); return $this->redirect(['profile']);
@ -249,30 +279,40 @@ class SettingsController extends Controller
$model = new DynamicModel(['gdpr_consent']); $model = new DynamicModel(['gdpr_consent']);
$model->addRule('gdpr_consent', 'boolean'); $model->addRule('gdpr_consent', 'boolean');
$model->addRule('gdpr_consent', 'default', ['value' => 0, 'skipOnEmpty' => false]); $model->addRule('gdpr_consent', 'default', ['value' => 0, 'skipOnEmpty' => false]);
$model->addRule('gdpr_consent', 'compare', [ $model->addRule(
'gdpr_consent',
'compare',
[
'compareValue' => true, 'compareValue' => true,
'message' => Yii::t('usuario', 'Your consent is required to work with this site'), 'message' => Yii::t('usuario', 'Your consent is required to work with this site'),
'when' => function () { 'when' => function () {
return $this->module->enableGdprCompliance; return $this->module->enableGdprCompliance;
}, },
]); ]
);
if ($model->load(Yii::$app->request->post()) && $model->validate()) { if ($model->load(Yii::$app->request->post()) && $model->validate()) {
$user->updateAttributes([ $user->updateAttributes(
[
'gdpr_consent' => 1, 'gdpr_consent' => 1,
'gdpr_consent_date' => time(), 'gdpr_consent_date' => time(),
]); ]
);
return $this->redirect(['profile']); return $this->redirect(['profile']);
} }
return $this->render('gdpr-consent', [ return $this->render(
'gdpr-consent',
[
'model' => $model, 'model' => $model,
'gdpr_consent_hint' => $this->module->getConsentMessage(), 'gdpr_consent_hint' => $this->module->getConsentMessage(),
]); ]
);
} }
/** /**
* Exports the data from the current user in a mechanical readable format (csv). Properties exported can be defined * Exports the data from the current user in a mechanical readable format (csv). Properties exported can be defined
* in the module configuration. * in the module configuration.
*
* @throws NotFoundHttpException if gdpr compliance is not enabled * @throws NotFoundHttpException if gdpr compliance is not enabled
* @throws \Exception * @throws \Exception
* @throws \Throwable * @throws \Throwable
@ -317,7 +357,11 @@ class SettingsController extends Controller
public function actionAccount() public function actionAccount()
{ {
/** @var SettingsForm $form */ /**
*
*
* @var SettingsForm $form
*/
$form = $this->make(SettingsForm::class); $form = $this->make(SettingsForm::class);
$event = $this->make(UserEvent::class, [$form->getUser()]); $event = $this->make(UserEvent::class, [$form->getUser()]);
@ -384,7 +428,11 @@ class SettingsController extends Controller
throw new NotFoundHttpException(Yii::t('usuario', 'Not found')); throw new NotFoundHttpException(Yii::t('usuario', 'Not found'));
} }
/** @var User $user */ /**
*
*
* @var User $user
*/
$user = Yii::$app->user->identity; $user = Yii::$app->user->identity;
$event = $this->make(UserEvent::class, [$user]); $event = $this->make(UserEvent::class, [$user]);
Yii::$app->user->logout(); Yii::$app->user->logout();
@ -400,7 +448,11 @@ class SettingsController extends Controller
public function actionTwoFactor($id) public function actionTwoFactor($id)
{ {
/** @var User $user */ /**
*
*
* @var User $user
*/
$user = $this->userQuery->whereId($id)->one(); $user = $this->userQuery->whereId($id)->one();
if (null === $user) { if (null === $user) {
@ -416,7 +468,11 @@ class SettingsController extends Controller
{ {
Yii::$app->response->format = Response::FORMAT_JSON; Yii::$app->response->format = Response::FORMAT_JSON;
/** @var User $user */ /**
*
*
* @var User $user
*/
$user = $this->userQuery->whereId($id)->one(); $user = $this->userQuery->whereId($id)->one();
if (null === $user) { if (null === $user) {
@ -443,7 +499,11 @@ class SettingsController extends Controller
public function actionTwoFactorDisable($id) public function actionTwoFactorDisable($id)
{ {
/** @var User $user */ /**
*
*
* @var User $user
*/
$user = $this->userQuery->whereId($id)->one(); $user = $this->userQuery->whereId($id)->one();
if (null === $user) { if (null === $user) {
@ -463,6 +523,32 @@ class SettingsController extends Controller
$this->redirect(['account']); $this->redirect(['account']);
} }
/**
* Display list session history.
*/
public function actionSessionHistory()
{
$searchModel = new SessionHistorySearch([
'user_id' => Yii::$app->user->id,
]);
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('session-history', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
/**
* Terminate all session user
*/
public function actionTerminateSessions()
{
$this->make(TerminateUserSessionsService::class, [Yii::$app->user->id])->run();
return $this->redirect(['session-history']);
}
/** /**
* @param $id * @param $id
* @throws ForbiddenHttpException * @throws ForbiddenHttpException
@ -473,7 +559,11 @@ class SettingsController extends Controller
*/ */
protected function disconnectSocialNetwork($id) protected function disconnectSocialNetwork($id)
{ {
/** @var SocialNetworkAccount $account */ /**
*
*
* @var SocialNetworkAccount $account
*/
$account = $this->socialNetworkAccountQuery->whereId($id)->one(); $account = $this->socialNetworkAccountQuery->whereId($id)->one();
if ($account === null) { if ($account === null) {

View File

@ -19,7 +19,7 @@ use yii\base\Event;
* @property-read Token $token * @property-read Token $token
* @property-read RecoveryForm $form * @property-read RecoveryForm $form
*/ */
class ResetPasswordEvent extends Event final class ResetPasswordEvent extends Event
{ {
const EVENT_BEFORE_TOKEN_VALIDATE = 'beforeTokenValidate'; const EVENT_BEFORE_TOKEN_VALIDATE = 'beforeTokenValidate';
const EVENT_AFTER_TOKEN_VALIDATE = 'afterTokenValidate'; const EVENT_AFTER_TOKEN_VALIDATE = 'afterTokenValidate';

37
src/User/Event/SessionEvent.php Executable file
View File

@ -0,0 +1,37 @@
<?php
/*
* This file is part of the 2amigos/yii2-usuario project.
*
* (c) 2amigOS! <http://2amigos.us/>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Da\User\Event;
use Da\User\Model\User;
use yii\base\Event;
/**
* @property-read User $user
*/
class SessionEvent extends Event
{
const EVENT_BEFORE_TERMINATE_USER_SESSIONS = 'beforeTerminateUserSessions';
const EVENT_AFTER_TERMINATE_USER_SESSIONS = 'afterTerminateUserSessions';
protected $user;
public function __construct(User $user, array $config = [])
{
$this->user = $user;
parent::__construct($config);
}
public function getUser()
{
return $this->user;
}
}

View File

@ -23,8 +23,8 @@ class UserEvent extends Event
const EVENT_AFTER_CREATE = 'afterCreate'; const EVENT_AFTER_CREATE = 'afterCreate';
const EVENT_BEFORE_DELETE = 'beforeDelete'; const EVENT_BEFORE_DELETE = 'beforeDelete';
const EVENT_AFTER_DELETE = 'afterDelete'; const EVENT_AFTER_DELETE = 'afterDelete';
const EVENT_BEFORE_REGISTER = 'beforeRegister'; const EVENT_BEFORE_REGISTER = 'beforeRegistration';
const EVENT_AFTER_REGISTER = 'afterRegister'; const EVENT_AFTER_REGISTER = 'afterRegistration';
const EVENT_BEFORE_ACCOUNT_UPDATE = 'beforeAccountUpdate'; const EVENT_BEFORE_ACCOUNT_UPDATE = 'beforeAccountUpdate';
const EVENT_AFTER_ACCOUNT_UPDATE = 'afterAccountUpdate'; const EVENT_AFTER_ACCOUNT_UPDATE = 'afterAccountUpdate';
const EVENT_BEFORE_PROFILE_UPDATE = 'beforeProfileUpdate'; const EVENT_BEFORE_PROFILE_UPDATE = 'beforeProfileUpdate';

View File

@ -37,7 +37,7 @@ class AccessRuleFilter extends AccessRule
/** @var User $identity */ /** @var User $identity */
$identity = $user->identity; $identity = $user->identity;
if (!$identity->gdpr_consent) { if (!$identity->gdpr_consent) {
Yii::$app->response->redirect([ "/$consentAction"])->send(); Yii::$app->response->redirect(["/{$consentAction}"])->send();
} }
} }
} }

View File

@ -0,0 +1,50 @@
<?php
/*
* This file is part of the 2amigos/yii2-usuario project.
*
* (c) 2amigOS! <http://2amigos.us/>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Da\User\Filter;
use Da\User\Model\User;
use Da\User\Module;
use Yii;
use yii\base\ActionFilter;
use Da\User\Traits\AuthManagerAwareTrait;
class TwoFactorAuthenticationEnforceFilter extends ActionFilter
{
use AuthManagerAwareTrait;
public function beforeAction($action)
{
/** @var Module $module */
$module = Yii::$app->getModule('user');
$enableTwoFactorAuthentication = $module->enableTwoFactorAuthentication;
// If enableTwoFactorAuthentication is set to false do nothing
if (!$enableTwoFactorAuthentication) {
return parent::beforeAction($action);
}
if (Yii::$app->user->isGuest) {
// Not our business
return parent::beforeAction($action);
}
$permissions = $module->twoFactorAuthenticationForcedPermissions;
$itemsByUser = array_keys($this->getAuthManager()->getItemsByUser(Yii::$app->user->identity->id));
if(!empty(array_intersect($permissions, $itemsByUser))){
Yii::$app->session->setFlash('warning', Yii::t('usuario', 'Your role requires 2FA, you won\'t be able to use the application until you enable it'));
return Yii::$app->response->redirect(['/user/settings/account'])->send();
}
return parent::beforeAction($action);
}
}

View File

@ -13,8 +13,8 @@ namespace Da\User\Helper;
use Yii; use Yii;
use yii\base\Exception; use yii\base\Exception;
use yii\base\Security;
use yii\base\InvalidConfigException; use yii\base\InvalidConfigException;
use yii\base\Security;
class SecurityHelper class SecurityHelper
{ {
@ -76,8 +76,7 @@ class SecurityHelper
if (!isset($minPasswordRequirements)) { if (!isset($minPasswordRequirements)) {
if (isset(Yii::$app->getModule('user')->minPasswordRequirements)) { if (isset(Yii::$app->getModule('user')->minPasswordRequirements)) {
$minPasswordRequirements = Yii::$app->getModule('user')->minPasswordRequirements; $minPasswordRequirements = Yii::$app->getModule('user')->minPasswordRequirements;
} } else {
else {
$minPasswordRequirements = [ $minPasswordRequirements = [
'lower' => 1, 'lower' => 1,
'digit' => 1, 'digit' => 1,

View File

@ -0,0 +1,73 @@
<?php
/*
* This file is part of the 2amigos/yii2-usuario project.
*
* (c) 2amigOS! <http://2amigos.us/>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Da\User\Migration\Session;
use Da\User\Helper\MigrationHelper;
use yii\db\Migration;
class m000000_000001_create_session_history_table extends Migration
{
const SESSION_HISTORY_TABLE = '{{%session_history}}';
const USER_TABLE = '{{%user}}';
/**
* {@inheritdoc}
*/
public function safeUp()
{
$this->createTable(self::SESSION_HISTORY_TABLE, [
'user_id' => $this->integer(),
'session_id' => $this->string()->null(),
'user_agent' => $this->string()->notNull(),
'ip' => $this->string(45)->notNull(),
'created_at' => $this->integer()->notNull(),
'updated_at' => $this->integer()->notNull(),
]);
$this->createIndex(
'{{%session_history_user_id}}',
self::SESSION_HISTORY_TABLE,
['user_id']
);
$this->createIndex(
'{{%session_history_session_id}}',
self::SESSION_HISTORY_TABLE,
['session_id']
);
$this->createIndex(
'{{%session_history_updated_at}}',
self::SESSION_HISTORY_TABLE,
['updated_at']
);
$this->addForeignKey(
'{{%fk_user_session_history}}',
self::SESSION_HISTORY_TABLE,
'user_id',
self::USER_TABLE,
'id',
'CASCADE',
MigrationHelper::isMicrosoftSQLServer($this->db->driverName) ? 'NO ACTION' : 'RESTRICT'
);
}
/**
* {@inheritdoc}
*/
public function safeDown()
{
$this->dropTable(self::SESSION_HISTORY_TABLE);
}
}

View File

@ -97,7 +97,7 @@ abstract class AbstractAuthItem extends Model
return [ return [
['itemName', 'safe'], ['itemName', 'safe'],
['name', 'required'], ['name', 'required'],
['name', 'match', 'pattern' => '/^\w[\w.:\-]+\w$/'], ['name', 'match', 'pattern' => '/^\w[\w.:\-]+\w$/u'],
[['name', 'description', 'rule'], 'trim'], [['name', 'description', 'rule'], 'trim'],
[ [
'name', 'name',

View File

@ -25,7 +25,7 @@ use yii\base\InvalidParamException;
use yii\db\ActiveRecord; use yii\db\ActiveRecord;
/** /**
* @property int $user_id * @property int $user_id
* @property string $name * @property string $name
* @property string $public_email * @property string $public_email
* @property string $gravatar_email * @property string $gravatar_email
@ -34,7 +34,7 @@ use yii\db\ActiveRecord;
* @property string $website * @property string $website
* @property string $bio * @property string $bio
* @property string $timezone * @property string $timezone
* @property User $user * @property User $user
*/ */
class Profile extends ActiveRecord class Profile extends ActiveRecord
{ {

110
src/User/Model/SessionHistory.php Executable file
View File

@ -0,0 +1,110 @@
<?php
/*
* This file is part of the 2amigos/yii2-usuario project.
*
* (c) 2amigOS! <http://2amigos.us/>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Da\User\Model;
use Da\User\Module;
use Da\User\Query\SessionHistoryQuery;
use Da\User\Traits\ModuleAwareTrait;
use Yii;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;
use yii\db\ActiveQuery;
/**
* @property int $user_id
* @property string $session_id
* @property string $user_agent
* @property string $ip
* @property int $created_at
* @property int $updated_at
*
* @property User $user
* @property bool $isActive
*
* Dependencies:
* @property-read Module $module
*/
class SessionHistory extends ActiveRecord
{
use ModuleAwareTrait;
/**
* {@inheritdoc}
*/
public static function tableName()
{
return '{{%session_history}}';
}
/** @inheritdoc */
public function behaviors()
{
return [
[
'class' => TimestampBehavior::class,
'updatedAtAttribute' => false,
]
];
}
/**
* {@inheritdoc}
*/
public function attributeLabels()
{
return [
'user_id' => Yii::t('usuario', 'User ID'),
'session_id' => Yii::t('usuario', 'Session ID'),
'user_agent' => Yii::t('usuario', 'User agent'),
'ip' => Yii::t('usuario', 'IP'),
'created_at' => Yii::t('usuario', 'Created at'),
'updated_at' => Yii::t('usuario', 'Last activity'),
];
}
/**
* @return bool Whether the session is an active or not.
*/
public function getIsActive()
{
return isset($this->session_id) && $this->updated_at + $this->getModule()->rememberLoginLifespan > time();
}
/**
* @return ActiveQuery
*/
public function getUser()
{
return $this->hasOne($this->module->classMap['User'], ['id' => 'user_id']);
}
/** @inheritdoc */
public function beforeSave($insert)
{
if ($insert && empty($this->session_id)) {
$this->setAttribute('session_id', Yii::$app->session->getId());
}
return parent::beforeSave($insert);
}
/** @inheritdoc */
public static function primaryKey()
{
return ['user_id', 'session_id'];
}
public static function find()
{
return new SessionHistoryQuery(static::class);
}
}

View File

@ -22,17 +22,17 @@ use yii\helpers\Url;
/** /**
* /** * /**
* @property int $id Id * @property int $id Id
* @property int $user_id User id, null if account is not bind to user * @property int $user_id User id, null if account is not bind to user
* @property string $provider Name of service * @property string $provider Name of service
* @property string $client_id Account id * @property string $client_id Account id
* @property string $data Account properties returned by social network (json encoded) * @property string $data Account properties returned by social network (json encoded)
* @property string $decodedData Json-decoded properties * @property string $decodedData Json-decoded properties
* @property string $code * @property string $code
* @property string $email * @property string $email
* @property string $username * @property string $username
* @property int $created_at * @property int $created_at
* @property User $user User that this account is connected for * @property User $user User that this account is connected for
*/ */
class SocialNetworkAccount extends ActiveRecord class SocialNetworkAccount extends ActiveRecord
{ {

View File

@ -24,13 +24,13 @@ use yii\helpers\Url;
/** /**
* Token Active Record model. * Token Active Record model.
* *
* @property int $user_id * @property int $user_id
* @property string $code * @property string $code
* @property int $type * @property int $type
* @property string $url * @property string $url
* @property bool $isExpired * @property bool $isExpired
* @property int $created_at * @property int $created_at
* @property User $user * @property User $user
*/ */
class Token extends ActiveRecord class Token extends ActiveRecord
{ {

View File

@ -31,33 +31,33 @@ use yii\web\IdentityInterface;
* *
* @property bool $isAdmin * @property bool $isAdmin
* @property bool $isBlocked * @property bool $isBlocked
* @property bool $isConfirmed whether user account has been confirmed or not * @property bool $isConfirmed whether user account has been confirmed or not
* @property bool $gdpr_deleted whether user requested deletion of his account * @property bool $gdpr_deleted whether user requested deletion of his account
* @property bool $gdpr_consent whether user has consent personal data processing * @property bool $gdpr_consent whether user has consent personal data processing
* *
* Database fields: * Database fields:
* @property int $id * @property int $id
* @property string $username * @property string $username
* @property string $email * @property string $email
* @property string $unconfirmed_email * @property string $unconfirmed_email
* @property string $password_hash * @property string $password_hash
* @property string $auth_key * @property string $auth_key
* @property string $auth_tf_key * @property string $auth_tf_key
* @property int $auth_tf_enabled * @property int $auth_tf_enabled
* @property string $registration_ip * @property string $registration_ip
* @property int $confirmed_at * @property int $confirmed_at
* @property int $blocked_at * @property int $blocked_at
* @property int $flags * @property int $flags
* @property int $created_at * @property int $created_at
* @property int $updated_at * @property int $updated_at
* @property int $last_login_at * @property int $last_login_at
* @property int $gdpr_consent_date date of agreement of data processing * @property int $gdpr_consent_date date of agreement of data processing
* @property string $last_login_ip * @property string $last_login_ip
* @property int $password_changed_at * @property int $password_changed_at
* @property int $password_age * @property int $password_age
* Defined relations: * Defined relations:
* @property SocialNetworkAccount[] $socialNetworkAccounts * @property SocialNetworkAccount[] $socialNetworkAccounts
* @property Profile $profile * @property Profile $profile
*/ */
class User extends ActiveRecord implements IdentityInterface class User extends ActiveRecord implements IdentityInterface
{ {

37
src/User/Module.php Normal file → Executable file
View File

@ -22,6 +22,21 @@ use yii\helpers\Html;
*/ */
class Module extends BaseModule class Module extends BaseModule
{ {
/**
* @var bool Enable the 'session history' function
* Using with {@see SessionHistoryDecorator}
*/
public $enableSessionHistory = false;
/**
* @var int|bool The number of 'session history' records will be stored for user
* if equals false records will not be deleted
*/
public $numberSessionHistory = false;
/**
* @var int|bool The time after which the expired 'session history' will be deleted
* if equals false records will not be deleted
*/
public $timeoutSessionHistory = false;
/** /**
* @var bool whether to enable european G.D.P.R. compliance. * @var bool whether to enable european G.D.P.R. compliance.
* This will add a few elements to comply with european general data protection regulation. * This will add a few elements to comply with european general data protection regulation.
@ -81,6 +96,10 @@ class Module extends BaseModule
* @var bool whether to enable two factor authentication or not * @var bool whether to enable two factor authentication or not
*/ */
public $enableTwoFactorAuthentication = false; public $enableTwoFactorAuthentication = false;
/**
* @var array list of permissions for which two factor authentication is mandatory
*/
public $twoFactorAuthenticationForcedPermissions = [];
/** /**
* @var int cycles of key generation are set on 30 sec. To avoid sync issues, increased validity up to 60 sec. * @var int cycles of key generation are set on 30 sec. To avoid sync issues, increased validity up to 60 sec.
* @see http://2fa-library.readthedocs.io/en/latest/ * @see http://2fa-library.readthedocs.io/en/latest/
@ -213,7 +232,7 @@ class Module extends BaseModule
/** /**
* @var array Minimum requirements when a new password is automatically generated. * @var array Minimum requirements when a new password is automatically generated.
* Array structure: `requirement => minimum number characters`. * Array structure: `requirement => minimum number characters`.
* *
* Possible array keys: * Possible array keys:
* - lower: minimum number of lowercase characters; * - lower: minimum number of lowercase characters;
@ -247,4 +266,20 @@ class Module extends BaseModule
return $this->gdprConsentMessage ?: $defaultConsentMessage; return $this->gdprConsentMessage ?: $defaultConsentMessage;
} }
/**
* @return bool
*/
public function hasNumberSessionHistory()
{
return $this->numberSessionHistory !== false && $this->numberSessionHistory > 0;
}
/**
* @return bool
*/
public function hasTimeoutSessionHistory()
{
return $this->timeoutSessionHistory !== false && $this->timeoutSessionHistory > 0;
}
} }

View File

@ -0,0 +1,158 @@
<?php
/*
* This file is part of the 2amigos/yii2-usuario project.
*
* (c) 2amigOS! <http://2amigos.us/>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Da\User\Query;
use Da\User\Traits\ModuleAwareTrait;
use yii\web\Session;
use Yii;
class SessionHistoryCondition
{
use ModuleAwareTrait;
private $session;
public function __construct(Session $session)
{
$this->session = $session;
}
public function unbindSession()
{
return ['session_id' => null];
}
public function bySession($sessionId)
{
return ['session_id' => $sessionId];
}
public function byUser($userId)
{
return [
'user_id' => $userId,
];
}
public function byUserSession($userId, $sessionId)
{
return [
'user_id' => $userId,
'session_id' => $sessionId,
];
}
public function inactive($userId = null)
{
$where = [
'AND',
['session_id' => null]
];
if (isset($userId)) {
$where[] = $this->byUser($userId);
}
return $where;
}
public function expired($userId = null)
{
$where = [
'AND',
['<', 'updated_at', $this->getExpiredTime()]
];
if (isset($userId)) {
$where[] = $this->byUser($userId);
}
return $where;
}
public function expiredInactive($userId = null)
{
return [
'OR',
$this->expired($userId),
$this->inactive($userId),
];
}
public function shouldDeleteBefore($updatedAt, $userId)
{
$condition = ['<', 'updated_at', $updatedAt];
if ($updatedAt > $this->getExpiredTime()) {
$condition = [
'OR',
[
'AND',
$this->inactive(),
$condition,
],
$this->expired()
];
}
return [
'AND',
$this->byUser($userId),
$condition,
];
}
/**
* @return int
*/
public function getExpiredTime()
{
$module = $this->getModule();
$time = time() - max($module->rememberLoginLifespan, $this->session->getTimeout());
if (false === $module->hasTimeoutSessionHistory()) {
return $time;
}
return $time - $module->timeoutSessionHistory;
}
public function inactiveData()
{
return [
'session_id' => null,
];
}
/**
* @return array
*/
public function currentUserData()
{
return [
'user_id' => Yii::$app->user->id,
'session_id' => Yii::$app->session->getId(),
'user_agent' => Yii::$app->request->userAgent,
'ip' => Yii::$app->request->userIP,
];
}
/**
* @return array
*/
public function currentUserCondition()
{
return [
'user_id' => Yii::$app->user->id,
'session_id' => Yii::$app->session->getId(),
'user_agent' => Yii::$app->request->userAgent,
];
}
}

View File

@ -0,0 +1,82 @@
<?php
/*
* This file is part of the 2amigos/yii2-usuario project.
*
* (c) 2amigOS! <http://2amigos.us/>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Da\User\Query;
use Da\User\Traits\ModuleAwareTrait;
use yii\db\ActiveQuery;
use Yii;
class SessionHistoryQuery extends ActiveQuery
{
use ModuleAwareTrait;
public function whereUserId($userId)
{
return $this->andWhere($this->getCondition()->byUser($userId));
}
public function whereActive()
{
return $this->andWhere(['IS NOT', 'session_id', null]);
}
public function whereInActive($userId)
{
return $this->andWhere($this->getCondition()->inactive($userId));
}
public function whereExpired($userId)
{
return $this->andWhere($this->getCondition()->expired($userId));
}
public function whereExpiredInActive($userId)
{
return $this->andWhere($this->getCondition()->expiredInactive($userId));
}
public function selectSessionId()
{
return $this->select(['session_id']);
}
public function whereUserSession($userId, $sessionId)
{
return $this->andWhere($this->getCondition()->byUserSession(
$userId,
$sessionId
));
}
public function whereCurrentUser()
{
return $this->andWhere($this->getCondition()->currentUserCondition());
}
public function oldestUpdatedTimeActiveSession($userId)
{
return $this->whereExpiredInActive($userId)
->select(['updated_at'])
->limit(1)
->offset($this->getModule()->numberSessionHistory)
->orderBy(['updated_at' => SORT_DESC])->scalar();
}
/**
* @return SessionHistoryCondition
*/
protected function getCondition()
{
return Yii::$container->get(SessionHistoryCondition::class);
}
}

View File

@ -0,0 +1,74 @@
<?php
/*
* This file is part of the 2amigos/yii2-usuario project.
*
* (c) 2amigOS! <http://2amigos.us/>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Da\User\Search;
use Da\User\Model\SessionHistory;
use Da\User\Traits\ContainerAwareTrait;
use yii\base\InvalidConfigException;
use yii\base\InvalidParamException;
use yii\data\ActiveDataProvider;
class SessionHistorySearch extends SessionHistory
{
use ContainerAwareTrait;
/**
* {@inheritdoc}
*/
public function rules()
{
return [
[['user_agent', 'ip'], 'safe'],
];
}
/**
* @param array $params
*
* @throws InvalidConfigException
* @throws InvalidParamException
*
* @return ActiveDataProvider
*/
public function search($params)
{
$query = SessionHistory::find()->andWhere([
'user_id' => $this->user_id,
]);
/** @var ActiveDataProvider $dataProvider */
$dataProvider = $this->make(
ActiveDataProvider::class,
[],
[
'query' => $query,
'sort' => [
'defaultOrder' => [
'updated_at' => SORT_DESC
],
]
]
);
$this->load($params);
if (!$this->validate()) {
return $dataProvider;
}
$query->andFilterWhere(['like', 'user_agent', $this->user_agent])
->andFilterWhere(['like', 'ip', $this->ip]);
return $dataProvider;
}
}

View File

@ -0,0 +1,43 @@
<?php
/*
* This file is part of the 2amigos/yii2-usuario project.
*
* (c) 2amigOS! <http://2amigos.us/>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Da\User\Service\SessionHistory;
use yii\web\DbSession;
class DBTerminateSessionsService implements TerminateSessionsServiceInterface
{
protected $sessionIds;
protected $dbSession;
protected $fieldName;
public function __construct(array $sessionIds, DbSession $dbSession, $fieldName = 'id')
{
$this->sessionIds = $sessionIds;
$this->dbSession = $dbSession;
$this->fieldName = $fieldName;
}
public function run()
{
if (in_array(session_id(), $this->sessionIds)) {
session_write_close();
}
$this->dbSession->db->createCommand()->delete(
$this->dbSession->sessionTable,
[$this->fieldName => $this->sessionIds]
)->execute();
return true;
}
}

View File

@ -0,0 +1,461 @@
<?php
/*
* This file is part of the 2amigos/yii2-usuario project.
*
* (c) 2amigOS! <http://2amigos.us/>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Da\User\Service\SessionHistory;
use Da\User\Model\SessionHistory;
use Da\User\Query\SessionHistoryCondition;
use Da\User\Query\SessionHistoryQuery;
use Da\User\Traits\ModuleAwareTrait;
use Yii;
use yii\db\Exception;
use yii\web\Session;
use yii\base\InvalidArgumentException as BaseInvalidArgumentException;
/**
* Decorator for the {@see Session} class for storing the 'session history'
*
* Not decorated methods:
* {@see Session::open()}
* {@see Session::close()}
* {@see Session::destroy()}
* {@see Session::get()}
* {@see Session::set()}
*/
class SessionHistoryDecorator extends Session
{
use ModuleAwareTrait;
public $sessionHistoryTable = '{{%session_history}}';
/**
* @var Session
*/
public $session;
public $condition;
public function __construct(
Session $session,
SessionHistoryCondition $historyCondition,
$config = []
) {
$this->session = $session;
$this->condition = $historyCondition;
parent::__construct($config);
}
/** @inheritdoc */
public function getUseCustomStorage()
{
return $this->session->getUseCustomStorage();
}
/** @inheritdoc */
public function getIsActive()
{
return $this->session->getIsActive();
}
/** @inheritdoc */
public function getHasSessionId()
{
return $this->session->getHasSessionId();
}
/** @inheritdoc */
public function setHasSessionId($value)
{
return $this->session->setHasSessionId($value);
}
/** @inheritdoc */
public function getId()
{
return $this->session->getId();
}
/** @inheritdoc */
public function setId($value)
{
return $this->session->setId($value);
}
/** @inheritdoc */
public function regenerateID($deleteOldSession = false)
{
return $this->getDb()->transaction(function () use ($deleteOldSession) {
$oldSid = session_id();
if (false === $this->session->regenerateID($deleteOldSession)) {
return false;
}
if (false === $this->getModule()->enableSessionHistory) {
return true;
}
$user = Yii::$app->user;
if ($user->getIsGuest()) {
$this->unbindSessionHistory($oldSid);
} else {
$this->getDB()->createCommand()
->delete(
$this->sessionHistoryTable,
$this->condition->byUserSession($user->getId(), $oldSid)
)->execute();
}
return true;
});
}
/** @inheritdoc */
public function getName()
{
return $this->session->getName();
}
/** @inheritdoc */
public function setName($value)
{
return $this->session->setName($value);
}
/** @inheritdoc */
public function getSavePath()
{
return $this->session->getSavePath();
}
/** @inheritdoc */
public function setSavePath($value)
{
return $this->session->setSavePath($value);
}
/** @inheritdoc */
public function getCookieParams()
{
return $this->session->getCookieParams();
}
/** @inheritdoc */
public function setCookieParams(array $value)
{
return $this->session->setCookieParams($value);
}
/** @inheritdoc */
public function getUseCookies()
{
return $this->session->getUseCookies();
}
/** @inheritdoc */
public function setUseCookies($value)
{
return $this->session->setUseCookies($value);
}
/** @inheritdoc */
public function getGCProbability()
{
return $this->session->getGCProbability();
}
/** @inheritdoc */
public function setGCProbability($value)
{
return $this->session->setGCProbability($value);
}
/** @inheritdoc */
public function getUseTransparentSessionID()
{
return $this->session->getUseTransparentSessionID();
}
/** @inheritdoc */
public function setUseTransparentSessionID($value)
{
return $this->session->setUseTransparentSessionID($value);
}
/** @inheritdoc */
public function getTimeout()
{
return $this->session->getTimeout();
}
/** @inheritdoc */
public function setTimeout($value)
{
return $this->session->setTimeout($value);
}
/** @inheritdoc */
public function openSession($savePath, $sessionName)
{
return $this->session->openSession($savePath, $sessionName);
}
/** @inheritdoc */
public function closeSession()
{
return $this->session->closeSession();
}
/** @inheritdoc */
public function readSession($id)
{
return $this->session->readSession($id);
}
/** @inheritdoc */
public function writeSession($id, $data)
{
return $this->session->writeSession($id, $data) &&
(
false === $this->getModule()->enableSessionHistory ||
$this->getDb()->transaction(function () use ($id, $data) {
if (Yii::$app->user->getIsGuest()) {
return true;
}
$updatedAt = ['updated_at' => time()];
$model = $this->getHistoryQuery()
->whereCurrentUser()
->one();
if (isset($model)) {
$model->updateAttributes($updatedAt);
$result = true;
} else {
$model = Yii::createObject([
'class' => SessionHistory::class,
] + $this->condition->currentUserData() + $updatedAt);
if (!$result = $model->save()) {
throw new BaseInvalidArgumentException(
print_r($model->errors, 1)
);
}
$this->displacementHistory($model->user_id);
}
return $result;
})
);
}
/** @inheritdoc */
public function destroySession($id)
{
return $this->session->destroySession($id) &&
(
false === $this->getModule()->enableSessionHistory ||
$this->getDb()->transaction(function () use ($id) {
$this->unbindSessionHistory($id);
return true;
})
);
}
/** @inheritdoc */
public function gcSession($maxLifetime)
{
return $this->session->gcSession($maxLifetime) &&
(
false === $this->getModule()->enableSessionHistory ||
$this->getDb()->transaction(function () use ($maxLifetime) {
$this->getDb()->createCommand()->update(
$this->sessionHistoryTable,
$this->condition->inactiveData(),
$this->condition->expired()
)->execute();
return true;
})
);
}
/** @inheritdoc */
public function getIterator()
{
return $this->session->getIterator();
}
/** @inheritdoc */
public function getCount()
{
return $this->session->getCount();
}
/** @inheritdoc */
public function count()
{
return $this->session->count();
}
/** @inheritdoc */
public function remove($key)
{
return $this->session->remove($key);
}
/** @inheritdoc */
public function removeAll()
{
return $this->session->removeAll();
}
/** @inheritdoc */
public function has($key)
{
return $this->session->has($key);
}
/** @inheritdoc */
public function getFlash($key, $defaultValue = null, $delete = false)
{
return $this->session->getFlash($key, $defaultValue, $delete);
}
/** @inheritdoc */
public function getAllFlashes($delete = false)
{
return $this->session->getAllFlashes($delete);
}
/** @inheritdoc */
public function setFlash($key, $value = true, $removeAfterAccess = true)
{
return $this->session->setFlash($key, $value, $removeAfterAccess);
}
/** @inheritdoc */
public function addFlash($key, $value = true, $removeAfterAccess = true)
{
return $this->session->addFlash($key, $value, $removeAfterAccess);
}
/** @inheritdoc */
public function removeFlash($key)
{
return $this->session->removeFlash($key);
}
/** @inheritdoc */
public function removeAllFlashes()
{
return $this->session->removeAllFlashes();
}
/** @inheritdoc */
public function hasFlash($key)
{
return $this->session->hasFlash($key);
}
/** @inheritdoc */
public function offsetExists($offset)
{
return $this->session->offsetExists($offset);
}
/** @inheritdoc */
public function offsetGet($offset)
{
return $this->session->offsetGet($offset);
}
/** @inheritdoc */
public function offsetSet($offset, $item)
{
return $this->session->offsetSet($offset, $item);
}
/** @inheritdoc */
public function offsetUnset($offset)
{
return $this->session->offsetUnset($offset);
}
/** @inheritdoc */
public function setCacheLimiter($cacheLimiter)
{
return $this->session->setCacheLimiter($cacheLimiter);
}
/** @inheritdoc */
public function getCacheLimiter()
{
return $this->session->getCacheLimiter();
}
/**
* @param string $id
* @return bool
* @throws Exception
*/
protected function unbindSessionHistory($id)
{
return (bool)$this->getDb()->createCommand()->update(
$this->sessionHistoryTable,
$this->condition->unbindSession(),
$this->condition->bySession($id)
)->execute();
}
/**
*
* @param int $userId
* @return bool
* @throws Exception
*/
protected function displacementHistory($userId)
{
$module = $this->getModule();
if (false === $module->hasNumberSessionHistory()) {
return true;
}
$updatedAt = $this->getHistoryQuery()
->oldestUpdatedTimeActiveSession($userId);
if (!$updatedAt) {
return true;
}
$this->getDB()->createCommand()->delete(
$this->sessionHistoryTable,
$this->condition->shouldDeleteBefore(intval($updatedAt), $userId)
)->execute();
return true;
}
/**
* @return SessionHistoryQuery
*/
protected function getHistoryQuery()
{
return Yii::$container->get(SessionHistoryQuery::class);
}
protected function getDb()
{
return Yii::$app->getDb();
}
}

View File

@ -0,0 +1,48 @@
<?php
/*
* This file is part of the 2amigos/yii2-usuario project.
*
* (c) 2amigOS! <http://2amigos.us/>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Da\User\Service\SessionHistory;
class TerminateSessionsService implements TerminateSessionsServiceInterface
{
protected $sessionIds;
public function __construct(array $sessionIds)
{
$this->sessionIds = $sessionIds;
}
public function run()
{
$currentSessionId = session_id();
if (session_status() === PHP_SESSION_ACTIVE) {
session_write_close();
}
foreach ($this->sessionIds as $sessionId) {
if ($sessionId === $currentSessionId) {
$currentSessionId = null;
}
session_id($sessionId);
session_start();
session_destroy();
}
if ($currentSessionId) {
session_id($currentSessionId);
}
session_start();
return true;
}
}

View File

@ -0,0 +1,19 @@
<?php
/*
* This file is part of the 2amigos/yii2-usuario project.
*
* (c) 2amigOS! <http://2amigos.us/>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Da\User\Service\SessionHistory;
use Da\User\Contracts\ServiceInterface;
interface TerminateSessionsServiceInterface extends ServiceInterface
{
}

View File

@ -0,0 +1,105 @@
<?php
/*
* This file is part of the 2amigos/yii2-usuario project.
*
* (c) 2amigOS! <http://2amigos.us/>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Da\User\Service\SessionHistory;
use Da\User\Contracts\ServiceInterface;
use Da\User\Event\SessionEvent;
use Da\User\Model\SessionHistory;
use Da\User\Model\User;
use Da\User\Traits\ContainerAwareTrait;
use Da\User\Traits\ModuleAwareTrait;
use yii\web\Session;
use Yii;
class TerminateUserSessionsService implements ServiceInterface
{
use ContainerAwareTrait;
use ModuleAwareTrait;
protected $userId;
protected $session;
protected $excludeCurrentSession;
public function __construct($userId, Session $session, $excludeCurrentSession = true)
{
$this->userId = intval($userId);
$this->session = $session;
$this->excludeCurrentSession = $excludeCurrentSession;
}
public function run()
{
$user = $this->getUser($this->userId);
$sessionIds = $this->getSessionIds($user->id);
Yii::$app->db->transaction(function () use ($sessionIds, $user) {
/** @var SessionEvent $event */
$event = $this->make(SessionEvent::class, [$user]);
$user->trigger(SessionEvent::EVENT_BEFORE_TERMINATE_USER_SESSIONS, $event);
$this->make(TerminateSessionsServiceInterface::class, [$sessionIds])->run();
$user->updateAttributes([
'auth_key' => Yii::$app->security->generateRandomString(),
]);
if ($this->excludeCurrentUser()) {
Yii::$app->user->switchIdentity(
$user,
$this->getModule()->rememberLoginLifespan
);
}
$user->trigger(SessionEvent::EVENT_AFTER_TERMINATE_USER_SESSIONS, $event);
});
return true;
}
/**
* @param int $userId
* @return User
*/
protected function getUser($userId)
{
return ($this->make(User::class))::findOne($userId);
}
/**
* @param $userId
* @return int[]
*/
protected function getSessionIds($userId)
{
/** @var SessionHistory $sessionHistory */
$sessionHistory = $this->make(SessionHistory::class);
$sessionIds = $sessionHistory::find()->whereUserId($userId)->whereActive()->selectSessionId()->column();
if ($this->excludeCurrentUser()) {
foreach ($sessionIds as $key => $sessionId) {
if ($sessionId === $this->session->id) {
unset($sessionIds[$key]);
break;
}
}
}
return $sessionIds;
}
protected function excludeCurrentUser()
{
return $this->excludeCurrentSession && $this->userId === Yii::$app->user->id;
}
}

View File

@ -67,6 +67,7 @@ class SocialNetworkAuthenticateService implements ServiceInterface
$event = Yii::createObject(SocialNetworkAuthEvent::class, [$account, $this->client]); $event = Yii::createObject(SocialNetworkAuthEvent::class, [$account, $this->client]);
$this->controller->trigger(SocialNetworkAuthEvent::EVENT_BEFORE_AUTHENTICATE, $event); $this->controller->trigger(SocialNetworkAuthEvent::EVENT_BEFORE_AUTHENTICATE, $event);
$result = false;
if ($account->user instanceof User) { if ($account->user instanceof User) {
if ($account->user->getIsBlocked()) { if ($account->user->getIsBlocked()) {
@ -75,12 +76,15 @@ class SocialNetworkAuthenticateService implements ServiceInterface
} else { } else {
Yii::$app->user->login($account->user, $this->controller->module->rememberLoginLifespan); Yii::$app->user->login($account->user, $this->controller->module->rememberLoginLifespan);
$this->authAction->setSuccessUrl(Yii::$app->getUser()->getReturnUrl()); $this->authAction->setSuccessUrl(Yii::$app->getUser()->getReturnUrl());
$result = true;
} }
} else { } else {
$this->authAction->setSuccessUrl($account->getConnectionUrl()); $this->authAction->setSuccessUrl($account->getConnectionUrl());
$result = true;
} }
$this->controller->trigger(SocialNetworkAuthEvent::EVENT_AFTER_AUTHENTICATE, $event); $this->controller->trigger(SocialNetworkAuthEvent::EVENT_AFTER_AUTHENTICATE, $event);
return $result;
} }
protected function createAccount() protected function createAccount()

View File

@ -65,5 +65,6 @@ class SwitchIdentityService implements ServiceInterface
/** @var IdentityInterface $user */ /** @var IdentityInterface $user */
Yii::$app->user->switchIdentity($user, $session->timeout); Yii::$app->user->switchIdentity($user, $session->timeout);
$this->controller->trigger(UserEvent::EVENT_AFTER_SWITCH_IDENTITY, $event); $this->controller->trigger(UserEvent::EVENT_AFTER_SWITCH_IDENTITY, $event);
return true;
} }
} }

View File

@ -57,7 +57,7 @@ class UserCreateService implements ServiceInterface
$model->confirmed_at = time(); $model->confirmed_at = time();
$model->password = !empty($model->password) $model->password = !empty($model->password)
? $model->password ? $model->password
: $this->securityHelper->generatePassword(8, $this->getModule('user')->minPasswordRequirements); : $this->securityHelper->generatePassword(8, $this->getModule()->minPasswordRequirements);
/** @var UserEvent $event */ /** @var UserEvent $event */
$event = $this->make(UserEvent::class, [$model]); $event = $this->make(UserEvent::class, [$model]);
@ -75,15 +75,15 @@ class UserCreateService implements ServiceInterface
'Error sending welcome message to "{email}". Please try again later.', 'Error sending welcome message to "{email}". Please try again later.',
['email' => $model->email] ['email' => $model->email]
); );
// from web generate a flash message // from web display a flash message (if enabled)
if (is_a(Yii::$app, yii\web\Application::class)) { if ($this->getModule()->enableFlashMessages === true && is_a(Yii::$app, yii\web\Application::class)) {
Yii::$app->session->setFlash( Yii::$app->session->setFlash(
'warning', 'warning',
$error_msg $error_msg
); );
} }
// if we're from console add an error to the model in order to return an error message // if we're from console add an error to the model in order to return an error message
if (is_a(Yii::$app, yii\console\Application::class)) { if (is_a(Yii::$app, "yii\console\Application")) {
$model->addError('username', $error_msg); $model->addError('username', $error_msg);
} }
$transaction->rollBack(); $transaction->rollBack();

View File

@ -51,7 +51,7 @@ class UserRegisterService implements ServiceInterface
try { try {
$model->confirmed_at = $this->getModule()->enableEmailConfirmation ? null : time(); $model->confirmed_at = $this->getModule()->enableEmailConfirmation ? null : time();
$model->password = $this->getModule()->generatePasswords $model->password = $this->getModule()->generatePasswords
? $this->securityHelper->generatePassword(8, $this->getModule('user')->minPasswordRequirements) ? $this->securityHelper->generatePassword(8, $this->getModule()->minPasswordRequirements)
: $model->password; : $model->password;
$event = $this->make(UserEvent::class, [$model]); $event = $this->make(UserEvent::class, [$model]);

View File

@ -32,9 +32,12 @@ class AjaxRequestModelValidator implements ValidatorInterface
if ($request->getIsAjax() && $this->model->load($request->post())) { if ($request->getIsAjax() && $this->model->load($request->post())) {
Yii::$app->response->format = Response::FORMAT_JSON; Yii::$app->response->format = Response::FORMAT_JSON;
Yii::$app->response->data = ActiveForm::validate($this->model); $result = ActiveForm::validate($this->model);
Yii::$app->response->data = $result;
Yii::$app->response->send(); Yii::$app->response->send();
Yii::$app->end(); Yii::$app->end();
return $result;
} }
return false;
} }
} }

View File

@ -0,0 +1,85 @@
<?php
/*
* This file is part of the 2amigos/yii2-usuario project.
*
* (c) 2amigOS! <http://2amigos.us/>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Da\User\Widget;
use Da\User\Model\SessionHistory;
use Da\User\Traits\ContainerAwareTrait;
use Yii;
use yii\base\InvalidConfigException;
use yii\base\InvalidParamException;
use yii\base\Widget;
use yii\helpers\ArrayHelper;
class SessionStatusWidget extends Widget
{
use ContainerAwareTrait;
/**
* @var SessionHistory
*/
public $model;
/**
* {@inheritdoc}
*
* @throws InvalidConfigException
*/
public function init()
{
parent::init();
if (!$this->model instanceof SessionHistory) {
throw new InvalidConfigException(
__CLASS__ . '::$userId should be instanceof ' . SessionHistory::class
);
}
}
/**
* {@inheritdoc}
*
* @throws InvalidParamException
*/
public function run()
{
if ($this->model->getIsActive()) {
if ($this->model->session_id === Yii::$app->session->id) {
$value = Yii::t('usuario', 'Current');
} else {
$value = Yii::t('usuario', 'Active');
}
} else {
$value = Yii::t('usuario', 'Inactive');
}
return $value;
}
/**
* Returns available auth items to be attached to the user.
*
* @param int|null type of auth items or null to return all
*
* @return array
*/
protected function getAvailableItems($type = null)
{
return ArrayHelper::map(
$this->getAuthManager()->getItems($type),
'name',
function ($item) {
return empty($item->description)
? $item->name
: $item->name . ' (' . $item->description . ')';
}
);
}
}

View File

@ -28,6 +28,7 @@ return [
'Account details' => '', 'Account details' => '',
'Account details have been updated' => '', 'Account details have been updated' => '',
'Account settings' => '', 'Account settings' => '',
'Active' => '',
'Already registered? Sign in!' => '', 'Already registered? Sign in!' => '',
'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '', 'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '',
'An error occurred processing your request' => '', 'An error occurred processing your request' => '',
@ -81,6 +82,7 @@ return [
'Create new rule' => '', 'Create new rule' => '',
'Created at' => '', 'Created at' => '',
'Credentials will be sent to the user by email' => '', 'Credentials will be sent to the user by email' => '',
'Current' => '',
'Current password' => '', 'Current password' => '',
'Current password is not valid' => '', 'Current password is not valid' => '',
'Data privacy' => '', 'Data privacy' => '',
@ -112,13 +114,17 @@ return [
'Gravatar email' => '', 'Gravatar email' => '',
'Hello' => '', 'Hello' => '',
'Here you can download your personal data in a comma separated values format.' => '', 'Here you can download your personal data in a comma separated values format.' => '',
'I agree processing of my personal data and the use of cookies to facilitate the operation of this site. For more information read our {privacyPolicy}' => '',
'IP' => '',
'If you already registered, sign in and connect this account on settings page' => '', 'If you already registered, sign in and connect this account on settings page' => '',
'If you cannot click the link, please try pasting the text into your browser' => '', 'If you cannot click the link, please try pasting the text into your browser' => '',
'If you did not make this request you can ignore this email' => '', 'If you did not make this request you can ignore this email' => '',
'If you haven\'t received a password, you can reset it at' => '',
'Impersonate this user' => '', 'Impersonate this user' => '',
'In order to complete your registration, please click the link below' => '', 'In order to complete your registration, please click the link below' => '',
'In order to complete your request, please click the link below' => '', 'In order to complete your request, please click the link below' => '',
'In order to finish your registration, we need you to enter following fields' => '', 'In order to finish your registration, we need you to enter following fields' => '',
'Inactive' => '',
'Information' => '', 'Information' => '',
'Invalid login or password' => '', 'Invalid login or password' => '',
'Invalid or expired link' => '', 'Invalid or expired link' => '',
@ -128,6 +134,7 @@ return [
'It will be deleted forever' => '', 'It will be deleted forever' => '',
'Items' => '', 'Items' => '',
'Joined on {0, date}' => '', 'Joined on {0, date}' => '',
'Last activity' => '',
'Last login IP' => '', 'Last login IP' => '',
'Last login time' => '', 'Last login time' => '',
'Last password change' => '', 'Last password change' => '',
@ -186,11 +193,15 @@ return [
'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => '', 'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => '',
'Select rule...' => '', 'Select rule...' => '',
'Send password recovery email' => '', 'Send password recovery email' => '',
'Session ID' => '',
'Session history' => '',
'Sign in' => '', 'Sign in' => '',
'Sign up' => '', 'Sign up' => '',
'Something went wrong' => '', 'Something went wrong' => '',
'Status' => '',
'Submit' => '', 'Submit' => '',
'Switch identities is disabled.' => '', 'Switch identities is disabled.' => '',
'Terminate all sessions' => '',
'Thank you for signing up on {0}' => '', 'Thank you for signing up on {0}' => '',
'Thank you, registration is now complete.' => '', 'Thank you, registration is now complete.' => '',
'The "recaptcha" component must be configured.' => '', 'The "recaptcha" component must be configured.' => '',
@ -232,7 +243,9 @@ return [
'Update rule' => '', 'Update rule' => '',
'Update user account' => '', 'Update user account' => '',
'Updated at' => '', 'Updated at' => '',
'User ID' => '',
'User account could not be created.' => '', 'User account could not be created.' => '',
'User agent' => '',
'User block status has been updated.' => '', 'User block status has been updated.' => '',
'User could not be registered.' => '', 'User could not be registered.' => '',
'User has been confirmed' => '', 'User has been confirmed' => '',
@ -258,6 +271,7 @@ return [
'You can connect multiple accounts to be able to log in using them' => '', 'You can connect multiple accounts to be able to log in using them' => '',
'You cannot remove your own account' => '', 'You cannot remove your own account' => '',
'You need to confirm your email address' => '', 'You need to confirm your email address' => '',
'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}' => '',
'Your account details have been updated' => '', 'Your account details have been updated' => '',
'Your account has been blocked' => '', 'Your account has been blocked' => '',
'Your account has been blocked.' => '', 'Your account has been blocked.' => '',
@ -273,6 +287,9 @@ return [
'Your password has expired, you must change it now' => '', 'Your password has expired, you must change it now' => '',
'Your personal information has been removed' => '', 'Your personal information has been removed' => '',
'Your profile has been updated' => '', 'Your profile has been updated' => '',
'Your role requires 2FA, you won\'t be able to use the application until you enable it' => '',
'privacy policy' => '',
'{0, date, MMM dd, YYYY HH:mm}' => '',
'{0, date, MMMM dd, YYYY HH:mm}' => '', '{0, date, MMMM dd, YYYY HH:mm}' => '',
'{0} cannot be blank.' => '', '{0} cannot be blank.' => '',
]; ];

View File

@ -28,6 +28,7 @@ return [
'Account details' => '', 'Account details' => '',
'Account details have been updated' => '', 'Account details have been updated' => '',
'Account settings' => '', 'Account settings' => '',
'Active' => '',
'Already registered? Sign in!' => '', 'Already registered? Sign in!' => '',
'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '', 'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '',
'An error occurred processing your request' => '', 'An error occurred processing your request' => '',
@ -81,6 +82,7 @@ return [
'Create new rule' => '', 'Create new rule' => '',
'Created at' => '', 'Created at' => '',
'Credentials will be sent to the user by email' => '', 'Credentials will be sent to the user by email' => '',
'Current' => '',
'Current password' => '', 'Current password' => '',
'Current password is not valid' => '', 'Current password is not valid' => '',
'Data privacy' => '', 'Data privacy' => '',
@ -112,13 +114,17 @@ return [
'Gravatar email' => '', 'Gravatar email' => '',
'Hello' => '', 'Hello' => '',
'Here you can download your personal data in a comma separated values format.' => '', 'Here you can download your personal data in a comma separated values format.' => '',
'IP' => '',
'I agree processing of my personal data and the use of cookies to facilitate the operation of this site. For more information read our {privacyPolicy}' => '',
'If you already registered, sign in and connect this account on settings page' => '', 'If you already registered, sign in and connect this account on settings page' => '',
'If you cannot click the link, please try pasting the text into your browser' => '', 'If you cannot click the link, please try pasting the text into your browser' => '',
'If you did not make this request you can ignore this email' => '', 'If you did not make this request you can ignore this email' => '',
'If you haven\'t received a password, you can reset it at' => '',
'Impersonate this user' => '', 'Impersonate this user' => '',
'In order to complete your registration, please click the link below' => '', 'In order to complete your registration, please click the link below' => '',
'In order to complete your request, please click the link below' => '', 'In order to complete your request, please click the link below' => '',
'In order to finish your registration, we need you to enter following fields' => '', 'In order to finish your registration, we need you to enter following fields' => '',
'Inactive' => '',
'Information' => '', 'Information' => '',
'Invalid login or password' => '', 'Invalid login or password' => '',
'Invalid or expired link' => '', 'Invalid or expired link' => '',
@ -128,6 +134,7 @@ return [
'It will be deleted forever' => '', 'It will be deleted forever' => '',
'Items' => '', 'Items' => '',
'Joined on {0, date}' => '', 'Joined on {0, date}' => '',
'Last activity' => '',
'Last login IP' => '', 'Last login IP' => '',
'Last login time' => '', 'Last login time' => '',
'Last password change' => '', 'Last password change' => '',
@ -186,11 +193,15 @@ return [
'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => '', 'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => '',
'Select rule...' => '', 'Select rule...' => '',
'Send password recovery email' => '', 'Send password recovery email' => '',
'Session ID' => '',
'Session history' => '',
'Sign in' => '', 'Sign in' => '',
'Sign up' => '', 'Sign up' => '',
'Something went wrong' => '', 'Something went wrong' => '',
'Status' => '',
'Submit' => '', 'Submit' => '',
'Switch identities is disabled.' => '', 'Switch identities is disabled.' => '',
'Terminate all sessions' => '',
'Thank you for signing up on {0}' => '', 'Thank you for signing up on {0}' => '',
'Thank you, registration is now complete.' => '', 'Thank you, registration is now complete.' => '',
'The "recaptcha" component must be configured.' => '', 'The "recaptcha" component must be configured.' => '',
@ -232,7 +243,9 @@ return [
'Update rule' => '', 'Update rule' => '',
'Update user account' => '', 'Update user account' => '',
'Updated at' => '', 'Updated at' => '',
'User ID' => '',
'User account could not be created.' => '', 'User account could not be created.' => '',
'User agent' => '',
'User block status has been updated.' => '', 'User block status has been updated.' => '',
'User could not be registered.' => '', 'User could not be registered.' => '',
'User has been confirmed' => '', 'User has been confirmed' => '',
@ -258,6 +271,7 @@ return [
'You can connect multiple accounts to be able to log in using them' => '', 'You can connect multiple accounts to be able to log in using them' => '',
'You cannot remove your own account' => '', 'You cannot remove your own account' => '',
'You need to confirm your email address' => '', 'You need to confirm your email address' => '',
'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}' => '',
'Your account details have been updated' => '', 'Your account details have been updated' => '',
'Your account has been blocked' => '', 'Your account has been blocked' => '',
'Your account has been blocked.' => '', 'Your account has been blocked.' => '',
@ -273,6 +287,9 @@ return [
'Your password has expired, you must change it now' => '', 'Your password has expired, you must change it now' => '',
'Your personal information has been removed' => '', 'Your personal information has been removed' => '',
'Your profile has been updated' => '', 'Your profile has been updated' => '',
'Your role requires 2FA, you won\'t be able to use the application until you enable it' => '',
'privacy policy' => '',
'{0, date, MMM dd, YYYY HH:mm}' => '',
'{0, date, MMMM dd, YYYY HH:mm}' => '', '{0, date, MMMM dd, YYYY HH:mm}' => '',
'{0} cannot be blank.' => '', '{0} cannot be blank.' => '',
]; ];

View File

@ -275,8 +275,30 @@ return [
'{0} cannot be blank.' => '{0} darf nicht leer sein.', '{0} cannot be blank.' => '{0} darf nicht leer sein.',
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '', 'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'Data privacy' => '', 'Data privacy' => '',
'If you haven\'t received a password, you can reset it at' => '',
'Submit' => '', 'Submit' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '', 'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}' => '',
'Your consent is required to work with this site' => '',
'Your role requires 2FA, you won\'t be able to use the application until you enable it' => '',
'A message has been sent to your email address. ' => '@@Eine Nachricht wurde an Deine E-Mail Adresse gesendet@@',
'Every user having your role has two factor authentication mandatory, you must enable it' => '@@@@',
'Now you can resume the login process' => '@@@@',
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'Active' => '',
'Current' => '',
'Data privacy' => '',
'IP' => '',
'Inactive' => '',
'Last activity' => '',
'Session ID' => '',
'Session history' => '',
'Status' => '',
'Submit' => '',
'Terminate all sessions' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'User ID' => '',
'User agent' => '',
'Your consent is required to work with this site' => '', 'Your consent is required to work with this site' => '',
'A message has been sent to your email address. ' => '@@Eine Nachricht wurde an Deine E-Mail Adresse gesendet@@', 'A message has been sent to your email address. ' => '@@Eine Nachricht wurde an Deine E-Mail Adresse gesendet@@',
]; ];

View File

@ -22,6 +22,7 @@ return [
'A message has been sent to your email address. It contains a confirmation link that you must click to complete registration.' => 'Eine Nachricht wurde an Ihre E-Mail-Adresse gesendet. Sie enthält einen Bestätigungslink, den Sie anklicken müssen, um die Registrierung abzuschließen.', 'A message has been sent to your email address. It contains a confirmation link that you must click to complete registration.' => 'Eine Nachricht wurde an Ihre E-Mail-Adresse gesendet. Sie enthält einen Bestätigungslink, den Sie anklicken müssen, um die Registrierung abzuschließen.',
'A new confirmation link has been sent' => 'Ein neuer Bestätigungslink wurde versendet', 'A new confirmation link has been sent' => 'Ein neuer Bestätigungslink wurde versendet',
'A password will be generated automatically if not provided' => 'Leer lassen, um automatisch ein Passwort zu generieren', 'A password will be generated automatically if not provided' => 'Leer lassen, um automatisch ein Passwort zu generieren',
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => 'Gemäß der europäischen Datenschutzgrundverordnung (DSGVO) benötigen wir Ihre Zustimmung, um mit Ihren personenbezogenen Daten zu arbeiten.',
'Account' => 'Konto', 'Account' => 'Konto',
'Account confirmation' => 'Kontobestätigung', 'Account confirmation' => 'Kontobestätigung',
'Account details' => 'Kontodetails', 'Account details' => 'Kontodetails',
@ -82,6 +83,7 @@ return [
'Credentials will be sent to the user by email' => 'Die Zugangsdaten werden dem Nutzer per E-Mail versendet', 'Credentials will be sent to the user by email' => 'Die Zugangsdaten werden dem Nutzer per E-Mail versendet',
'Current password' => 'Aktuelles Passwort', 'Current password' => 'Aktuelles Passwort',
'Current password is not valid' => 'Das aktuelle Passwort ist nicht korrekt', 'Current password is not valid' => 'Das aktuelle Passwort ist nicht korrekt',
'Data privacy' => 'Datenschutz',
'Data processing consent' => 'Zustimmung zur Datenverarbeitung', 'Data processing consent' => 'Zustimmung zur Datenverarbeitung',
'Delete' => 'Löschen', 'Delete' => 'Löschen',
'Delete account' => 'Konto Löschen', 'Delete account' => 'Konto Löschen',
@ -187,6 +189,7 @@ return [
'Sign in' => 'Anmelden', 'Sign in' => 'Anmelden',
'Sign up' => 'Registrieren', 'Sign up' => 'Registrieren',
'Something went wrong' => 'Etwas ist schief gelaufen', 'Something went wrong' => 'Etwas ist schief gelaufen',
'Submit' => 'Absenden',
'Switch identities is disabled.' => 'Identitäten wechseln ist deaktiviert.', 'Switch identities is disabled.' => 'Identitäten wechseln ist deaktiviert.',
'Thank you for signing up on {0}' => 'Danke für ihre Registrierung auf {0}', 'Thank you for signing up on {0}' => 'Danke für ihre Registrierung auf {0}',
'Thank you, registration is now complete.' => 'Danke, ihre Registrierung ist nun abgeschlossen.', 'Thank you, registration is now complete.' => 'Danke, ihre Registrierung ist nun abgeschlossen.',
@ -221,6 +224,7 @@ return [
'Unable to update block status.' => 'Konnte den Block-Status nicht ändern', 'Unable to update block status.' => 'Konnte den Block-Status nicht ändern',
'Unblock' => 'Freischalten', 'Unblock' => 'Freischalten',
'Unconfirmed' => 'Unbestätigt', 'Unconfirmed' => 'Unbestätigt',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => 'Leider können Sie nicht mit dieser Seite arbeiten, ohne uns die Zustimmung zur Verarbeitung Ihrer Daten zu geben.',
'Update' => 'Bearbeiten', 'Update' => 'Bearbeiten',
'Update assignments' => 'Zuweisung ändern', 'Update assignments' => 'Zuweisung ändern',
'Update permission' => 'Berechtigung ändern', 'Update permission' => 'Berechtigung ändern',
@ -264,6 +268,7 @@ return [
'Your account on {0} has been created' => 'Ihr Konto auf {0} wurde erstellt', 'Your account on {0} has been created' => 'Ihr Konto auf {0} wurde erstellt',
'Your confirmation token is invalid or expired' => 'Ihr Bestätigungstoken ist falsch oder abgelaufen', 'Your confirmation token is invalid or expired' => 'Ihr Bestätigungstoken ist falsch oder abgelaufen',
'Your consent is required to register' => 'Sie müssen Ihre Zustimmung registrieren', 'Your consent is required to register' => 'Sie müssen Ihre Zustimmung registrieren',
'Your consent is required to work with this site' => 'Ihre Zustimmung ist erforderlich, um mit dieser Website zu arbeiten',
'Your email address has been changed' => 'Ihre E-Mail-Adresse wurde geändert', 'Your email address has been changed' => 'Ihre E-Mail-Adresse wurde geändert',
'Your password has expired, you must change it now' => 'Ihr Passwort ist abgelaufen, Sie müssen es jetzt ändern', 'Your password has expired, you must change it now' => 'Ihr Passwort ist abgelaufen, Sie müssen es jetzt ändern',
'Your personal information has been removed' => 'Ihre persönlichen Daten wurden gelöscht', 'Your personal information has been removed' => 'Ihre persönlichen Daten wurden gelöscht',
@ -272,9 +277,25 @@ return [
'{0, date, MMM dd, YYYY HH:mm}' => '{0, date, dd. MMM YYYY, HH:mm}', '{0, date, MMM dd, YYYY HH:mm}' => '{0, date, dd. MMM YYYY, HH:mm}',
'{0, date, MMMM dd, YYYY HH:mm}' => '{0, date, dd. MMMM YYYY, HH:mm}', '{0, date, MMMM dd, YYYY HH:mm}' => '{0, date, dd. MMMM YYYY, HH:mm}',
'{0} cannot be blank.' => '{0} darf nicht leer sein.', '{0} cannot be blank.' => '{0} darf nicht leer sein.',
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => 'Gemäß der europäischen Datenschutzgrundverordnung (DSGVO) benötigen wir Ihre Zustimmung, um mit Ihren personenbezogenen Daten zu arbeiten.', 'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'Data privacy' => 'Datenschutz', 'Active' => '',
'Submit' => 'Absenden', 'Current' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => 'Leider können Sie nicht mit dieser Seite arbeiten, ohne uns die Zustimmung zur Verarbeitung Ihrer Daten zu geben.', 'Data privacy' => '',
'Your consent is required to work with this site' => 'Ihre Zustimmung ist erforderlich, um mit dieser Website zu arbeiten', 'IP' => '',
'Inactive' => '',
'Last activity' => '',
'Session ID' => '',
'Session history' => '',
'Status' => '',
'Submit' => '',
'Terminate all sessions' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'User ID' => '',
'User agent' => '',
'Your consent is required to work with this site' => '',
'Information' => '',
'Your role requires 2FA, you won\'t be able to use the application until you enable it' => '',
'If you haven\'t received a password, you can reset it at' => '',
'Information' => '',
'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}' => '',
]; ];

View File

@ -276,7 +276,21 @@ return [
'privacy policy' => 'política de privacidad', 'privacy policy' => 'política de privacidad',
'{0, date, MMMM dd, YYYY HH:mm}' => '{0, date, dd MMMM, YYYY HH:mm}', '{0, date, MMMM dd, YYYY HH:mm}' => '{0, date, dd MMMM, YYYY HH:mm}',
'{0} cannot be blank.' => '{0} no puede estar vacío.', '{0} cannot be blank.' => '{0} no puede estar vacío.',
'If you haven\'t received a password, you can reset it at' => '',
'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}' => '',
'Active' => '',
'Current' => '',
'IP' => '',
'Inactive' => '',
'Last activity' => '',
'Session ID' => '',
'Session history' => '',
'Status' => '',
'Terminate all sessions' => '',
'User ID' => '',
'User agent' => '',
'Your consent is required to work with this site' => '', 'Your consent is required to work with this site' => '',
'Your role requires 2FA, you won\'t be able to use the application until you enable it' => '',
'{0, date, MMM dd, YYYY HH:mm}' => '', '{0, date, MMM dd, YYYY HH:mm}' => '',
'An email has been sent with instructions for resetting your password' => '@@Se ha enviado un correo electrónico con instrucciones para restablecer su contraseña@@', 'An email has been sent with instructions for resetting your password' => '@@Se ha enviado un correo electrónico con instrucciones para restablecer su contraseña@@',
'Two factor authentication protects you against stolen credentials' => '@@La autenticación de dos factores le protege del robo de credenciales@@', 'Two factor authentication protects you against stolen credentials' => '@@La autenticación de dos factores le protege del robo de credenciales@@',

View File

@ -109,6 +109,7 @@ return [
'Gravatar email' => 'Gravatari e-posti aadress', 'Gravatar email' => 'Gravatari e-posti aadress',
'Hello' => 'Tere', 'Hello' => 'Tere',
'Here you can download your personal data in a comma separated values format.' => 'Siit saad alla laadida sinuga seotud andmed CSV formaadis.', 'Here you can download your personal data in a comma separated values format.' => 'Siit saad alla laadida sinuga seotud andmed CSV formaadis.',
'I agree processing of my personal data and the use of cookies to facilitate the operation of this site. For more information read our {privacyPolicy}' => 'Nõusutn oma isikuandmete töötlemise ning küpsiste kasutamisega, et selle lehe kasutamiset hõlbustada. Lisainfot loe lehelt {privacyPolicy}.',
'If you already registered, sign in and connect this account on settings page' => 'Kui oled juba registreerunud, logi sisse ja ühenda see konto oma seadete lehel', 'If you already registered, sign in and connect this account on settings page' => 'Kui oled juba registreerunud, logi sisse ja ühenda see konto oma seadete lehel',
'If you cannot click the link, please try pasting the text into your browser' => 'Kui sa ei saa lingil klikkida, proovi see kleepida oma brausri aadressireale', 'If you cannot click the link, please try pasting the text into your browser' => 'Kui sa ei saa lingil klikkida, proovi see kleepida oma brausri aadressireale',
'If you did not make this request you can ignore this email' => 'Kui sa ei ole seda päringut tellinud, siis võid seda kirja ignoreerida', 'If you did not make this request you can ignore this email' => 'Kui sa ei ole seda päringut tellinud, siis võid seda kirja ignoreerida',
@ -264,18 +265,31 @@ return [
'Your password has expired, you must change it now' => 'Sinu parool on aegunud, pead seda uuendama.', 'Your password has expired, you must change it now' => 'Sinu parool on aegunud, pead seda uuendama.',
'Your personal information has been removed' => 'Sinu isiklikud andmed on kustutatud', 'Your personal information has been removed' => 'Sinu isiklikud andmed on kustutatud',
'Your profile has been updated' => 'Sinu profiil on uuendatud', 'Your profile has been updated' => 'Sinu profiil on uuendatud',
'privacy policy' => 'privaatsuspoliitika',
'{0} cannot be blank.' => '{0} ei või olla tühi.', '{0} cannot be blank.' => '{0} ei või olla tühi.',
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '', 'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'Active' => '',
'Authentication rule class {0} can not be instantiated' => '', 'Authentication rule class {0} can not be instantiated' => '',
'Current' => '',
'Data privacy' => '', 'Data privacy' => '',
'IP' => '',
'Inactive' => '',
'Last activity' => '',
'If you haven\'t received a password, you can reset it at' => '',
'Rule class must extend "yii\\rbac\\Rule".' => '', 'Rule class must extend "yii\\rbac\\Rule".' => '',
'Session ID' => '',
'Session history' => '',
'Status' => '',
'Submit' => '', 'Submit' => '',
'Terminate all sessions' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '', 'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'User ID' => '',
'User agent' => '',
'VKontakte' => '', 'VKontakte' => '',
'Yandex' => '', 'Yandex' => '',
'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}' => '',
'Your consent is required to work with this site' => '', 'Your consent is required to work with this site' => '',
'Your role requires 2FA, you won\'t be able to use the application until you enable it' => '',
'{0, date, MMM dd, YYYY HH:mm}' => '', '{0, date, MMM dd, YYYY HH:mm}' => '',
'{0, date, MMMM dd, YYYY HH:mm}' => '', '{0, date, MMMM dd, YYYY HH:mm}' => '',
'I agree processing of my personal data and the use of cookies to facilitate the operation of this site. For more information read our {privacyPolicy}' => 'Nõusutn oma isikuandmete töötlemise ning küpsiste kasutamisega, et selle lehe kasutamiset hõlbustada. Lisainfot loe lehelt {privacyPolicy}.',
'privacy policy' => 'privaatsuspoliitika',
]; ];

View File

@ -151,6 +151,13 @@ return [
'Your profile has been updated' => 'پروفایل شما بروز شد', 'Your profile has been updated' => 'پروفایل شما بروز شد',
'{0, date, MMMM dd, YYYY HH:mm}' => '{0, date, dd MMMM, YYYY HH:mm}', '{0, date, MMMM dd, YYYY HH:mm}' => '{0, date, dd MMMM, YYYY HH:mm}',
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '', 'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'Account' => '',
'Account confirmation' => '',
'Account details' => '',
'Account details have been updated' => '',
'Account settings' => '',
'Active' => '',
'Already registered? Sign in!' => '',
'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '', 'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '',
'Are you sure you want to switch to this user for the rest of this Session?' => '', 'Are you sure you want to switch to this user for the rest of this Session?' => '',
'Are you sure you wish the user to change their password at next login?' => '', 'Are you sure you wish the user to change their password at next login?' => '',
@ -193,13 +200,24 @@ return [
'Export my data' => '', 'Export my data' => '',
'Force password change at next login' => '', 'Force password change at next login' => '',
'Here you can download your personal data in a comma separated values format.' => '', 'Here you can download your personal data in a comma separated values format.' => '',
'I agree processing of my personal data and the use of cookies to facilitate the operation of this site. For more information read our {privacyPolicy}' => '',
'IP' => '',
'If you already registered, sign in and connect this account on settings page' => '',
'If you cannot click the link, please try pasting the text into your browser' => '',
'If you did not make this request you can ignore this email' => '',
'Impersonate this user' => '', 'Impersonate this user' => '',
'In order to finish your registration, we need you to enter following fields' => '', 'In order to finish your registration, we need you to enter following fields' => '',
'Inactive' => '',
'Information' => '',
'Invalid login or password' => '',
'Invalid or expired link' => '',
'Invalid password' => '', 'Invalid password' => '',
'Invalid two factor authentication code' => '', 'Invalid two factor authentication code' => '',
'Invalid value' => '', 'Invalid value' => '',
'It will be deleted forever' => '', 'It will be deleted forever' => '',
'Items' => '', 'Items' => '',
'Joined on {0, date}' => '',
'Last activity' => '',
'Last login IP' => '', 'Last login IP' => '',
'Last login time' => '', 'Last login time' => '',
'Last password change' => '', 'Last password change' => '',
@ -227,6 +245,9 @@ return [
'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => '', 'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => '',
'Select rule...' => '', 'Select rule...' => '',
'Send password recovery email' => '', 'Send password recovery email' => '',
'Sign in' => '',
'Sign up' => '',
'Something went wrong' => '',
'Submit' => '', 'Submit' => '',
'Switch identities is disabled.' => '', 'Switch identities is disabled.' => '',
'The "recaptcha" component must be configured.' => '', 'The "recaptcha" component must be configured.' => '',
@ -258,7 +279,9 @@ return [
'Update role' => '', 'Update role' => '',
'Update rule' => '', 'Update rule' => '',
'Updated at' => '', 'Updated at' => '',
'User ID' => '',
'User account could not be created.' => '', 'User account could not be created.' => '',
'User agent' => '',
'User block status has been updated.' => '', 'User block status has been updated.' => '',
'User could not be registered.' => '', 'User could not be registered.' => '',
'User will be required to change password at next login' => '', 'User will be required to change password at next login' => '',
@ -269,12 +292,14 @@ return [
'We have sent confirmation links to both old and new email addresses. You must click both links to complete your request.' => '', 'We have sent confirmation links to both old and new email addresses. You must click both links to complete your request.' => '',
'You are about to delete all your personal data from this site.' => '', 'You are about to delete all your personal data from this site.' => '',
'You cannot remove your own account' => '', 'You cannot remove your own account' => '',
'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}' => '',
'Your account has been completely deleted' => '', 'Your account has been completely deleted' => '',
'Your consent is required to register' => '', 'Your consent is required to register' => '',
'Your consent is required to work with this site' => '', 'Your consent is required to work with this site' => '',
'Your password has expired, you must change it now' => '', 'Your password has expired, you must change it now' => '',
'Your personal information has been removed' => '', 'Your personal information has been removed' => '',
'Your role requires 2FA, you won\'t be able to use the application until you enable it' => '',
'privacy policy' => '',
'{0, date, MMM dd, YYYY HH:mm}' => '',
'{0} cannot be blank.' => '', '{0} cannot be blank.' => '',
'An email has been sent with instructions for resetting your password' => '@@ایمیلی حاوی راهنمایی برای تنظیم مجدد رمز عبور به شما ارسال شد@@',
'Registration ip' => '@@ای پی ثبت نام@@',
]; ];

View File

@ -28,6 +28,7 @@ return [
'Account details' => '', 'Account details' => '',
'Account details have been updated' => '', 'Account details have been updated' => '',
'Account settings' => '', 'Account settings' => '',
'Active' => '',
'Already registered? Sign in!' => '', 'Already registered? Sign in!' => '',
'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '', 'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '',
'An error occurred processing your request' => '', 'An error occurred processing your request' => '',
@ -81,6 +82,7 @@ return [
'Create new rule' => '', 'Create new rule' => '',
'Created at' => '', 'Created at' => '',
'Credentials will be sent to the user by email' => '', 'Credentials will be sent to the user by email' => '',
'Current' => '',
'Current password' => '', 'Current password' => '',
'Current password is not valid' => '', 'Current password is not valid' => '',
'Data privacy' => '', 'Data privacy' => '',
@ -112,13 +114,17 @@ return [
'Gravatar email' => '', 'Gravatar email' => '',
'Hello' => '', 'Hello' => '',
'Here you can download your personal data in a comma separated values format.' => '', 'Here you can download your personal data in a comma separated values format.' => '',
'I agree processing of my personal data and the use of cookies to facilitate the operation of this site. For more information read our {privacyPolicy}' => '',
'IP' => '',
'If you already registered, sign in and connect this account on settings page' => '', 'If you already registered, sign in and connect this account on settings page' => '',
'If you cannot click the link, please try pasting the text into your browser' => '', 'If you cannot click the link, please try pasting the text into your browser' => '',
'If you did not make this request you can ignore this email' => '', 'If you did not make this request you can ignore this email' => '',
'If you haven\'t received a password, you can reset it at' => '',
'Impersonate this user' => '', 'Impersonate this user' => '',
'In order to complete your registration, please click the link below' => '', 'In order to complete your registration, please click the link below' => '',
'In order to complete your request, please click the link below' => '', 'In order to complete your request, please click the link below' => '',
'In order to finish your registration, we need you to enter following fields' => '', 'In order to finish your registration, we need you to enter following fields' => '',
'Inactive' => '',
'Information' => '', 'Information' => '',
'Invalid login or password' => '', 'Invalid login or password' => '',
'Invalid or expired link' => '', 'Invalid or expired link' => '',
@ -128,6 +134,7 @@ return [
'It will be deleted forever' => '', 'It will be deleted forever' => '',
'Items' => '', 'Items' => '',
'Joined on {0, date}' => '', 'Joined on {0, date}' => '',
'Last activity' => '',
'Last login IP' => '', 'Last login IP' => '',
'Last login time' => '', 'Last login time' => '',
'Last password change' => '', 'Last password change' => '',
@ -186,11 +193,15 @@ return [
'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => '', 'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => '',
'Select rule...' => '', 'Select rule...' => '',
'Send password recovery email' => '', 'Send password recovery email' => '',
'Session ID' => '',
'Session history' => '',
'Sign in' => '', 'Sign in' => '',
'Sign up' => '', 'Sign up' => '',
'Something went wrong' => '', 'Something went wrong' => '',
'Status' => '',
'Submit' => '', 'Submit' => '',
'Switch identities is disabled.' => '', 'Switch identities is disabled.' => '',
'Terminate all sessions' => '',
'Thank you for signing up on {0}' => '', 'Thank you for signing up on {0}' => '',
'Thank you, registration is now complete.' => '', 'Thank you, registration is now complete.' => '',
'The "recaptcha" component must be configured.' => '', 'The "recaptcha" component must be configured.' => '',
@ -232,7 +243,9 @@ return [
'Update rule' => '', 'Update rule' => '',
'Update user account' => '', 'Update user account' => '',
'Updated at' => '', 'Updated at' => '',
'User ID' => '',
'User account could not be created.' => '', 'User account could not be created.' => '',
'User agent' => '',
'User block status has been updated.' => '', 'User block status has been updated.' => '',
'User could not be registered.' => '', 'User could not be registered.' => '',
'User has been confirmed' => '', 'User has been confirmed' => '',
@ -258,6 +271,7 @@ return [
'You can connect multiple accounts to be able to log in using them' => '', 'You can connect multiple accounts to be able to log in using them' => '',
'You cannot remove your own account' => '', 'You cannot remove your own account' => '',
'You need to confirm your email address' => '', 'You need to confirm your email address' => '',
'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}' => '',
'Your account details have been updated' => '', 'Your account details have been updated' => '',
'Your account has been blocked' => '', 'Your account has been blocked' => '',
'Your account has been blocked.' => '', 'Your account has been blocked.' => '',
@ -273,6 +287,9 @@ return [
'Your password has expired, you must change it now' => '', 'Your password has expired, you must change it now' => '',
'Your personal information has been removed' => '', 'Your personal information has been removed' => '',
'Your profile has been updated' => '', 'Your profile has been updated' => '',
'Your role requires 2FA, you won\'t be able to use the application until you enable it' => '',
'privacy policy' => '',
'{0, date, MMM dd, YYYY HH:mm}' => '',
'{0, date, MMMM dd, YYYY HH:mm}' => '', '{0, date, MMMM dd, YYYY HH:mm}' => '',
'{0} cannot be blank.' => '', '{0} cannot be blank.' => '',
]; ];

View File

@ -110,6 +110,7 @@ return [
'Gravatar email' => 'Email gravatar', 'Gravatar email' => 'Email gravatar',
'Hello' => 'Bonjour', 'Hello' => 'Bonjour',
'Here you can download your personal data in a comma separated values format.' => 'Ici vous pouvez télécharger vos données personnelles dans un format avec les données séparées par des virgules', 'Here you can download your personal data in a comma separated values format.' => 'Ici vous pouvez télécharger vos données personnelles dans un format avec les données séparées par des virgules',
'I agree processing of my personal data and the use of cookies to facilitate the operation of this site. For more information read our {privacyPolicy}' => 'J\'accepte le traitement de mes données personnelles et l\'utilisation de cookies pour faciliter le fonctionnement de ce site. Pour plus d\'information, lisez notre {privacyPolicy}',
'If you already registered, sign in and connect this account on settings page' => 'Si vous êtes déjà inscrit, connectez-vous et liez ce compte dans la page des réglages', 'If you already registered, sign in and connect this account on settings page' => 'Si vous êtes déjà inscrit, connectez-vous et liez ce compte dans la page des réglages',
'If you cannot click the link, please try pasting the text into your browser' => 'Si vous ne parvenez pas à cliquer sur le lien, veuillez essayer de coller le texte dans votre navigateur', 'If you cannot click the link, please try pasting the text into your browser' => 'Si vous ne parvenez pas à cliquer sur le lien, veuillez essayer de coller le texte dans votre navigateur',
'If you did not make this request you can ignore this email' => 'Si vous n\'avez pas fait cette demande, vous pouvez ignorer cet email', 'If you did not make this request you can ignore this email' => 'Si vous n\'avez pas fait cette demande, vous pouvez ignorer cet email',
@ -268,14 +269,26 @@ return [
'Your password has expired, you must change it now' => 'Votre mot de passe a expiré, vous devez le renouveler maintenant', 'Your password has expired, you must change it now' => 'Votre mot de passe a expiré, vous devez le renouveler maintenant',
'Your personal information has been removed' => 'Vos données personnelles ont été supprimées', 'Your personal information has been removed' => 'Vos données personnelles ont été supprimées',
'Your profile has been updated' => 'Votre profil a été mis à jour', 'Your profile has been updated' => 'Votre profil a été mis à jour',
'privacy policy' => 'politique de confidentialité',
'{0, date, MMMM dd, YYYY HH:mm}' => '{0, date, dd MMMM YYYY HH:mm}', '{0, date, MMMM dd, YYYY HH:mm}' => '{0, date, dd MMMM YYYY HH:mm}',
'{0} cannot be blank.' => '{0} ne peut être vide.', '{0} cannot be blank.' => '{0} ne peut être vide.',
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '', 'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'Active' => '',
'Current' => '',
'Data privacy' => '', 'Data privacy' => '',
'If you haven\'t received a password, you can reset it at' => '',
'IP' => '',
'Inactive' => '',
'Last activity' => '',
'Session ID' => '',
'Session history' => '',
'Status' => '',
'Submit' => '', 'Submit' => '',
'Terminate all sessions' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '', 'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'User ID' => '',
'User agent' => '',
'Your consent is required to work with this site' => '', 'Your consent is required to work with this site' => '',
'Your role requires 2FA, you won\'t be able to use the application until you enable it' => '',
'{0, date, MMM dd, YYYY HH:mm}' => '', '{0, date, MMM dd, YYYY HH:mm}' => '',
'I agree processing of my personal data and the use of cookies to facilitate the operation of this site. For more information read our {privacyPolicy}' => 'J\'accepte le traitement de mes données personnelles et l\'utilisation de cookies pour faciliter le fonctionnement de ce site. Pour plus d\'information, lisez notre {privacyPolicy}',
'privacy policy' => 'politique de confidentialité',
]; ];

View File

@ -28,6 +28,7 @@ return [
'Account details' => '', 'Account details' => '',
'Account details have been updated' => '', 'Account details have been updated' => '',
'Account settings' => '', 'Account settings' => '',
'Active' => '',
'Already registered? Sign in!' => '', 'Already registered? Sign in!' => '',
'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '', 'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '',
'An error occurred processing your request' => '', 'An error occurred processing your request' => '',
@ -81,6 +82,7 @@ return [
'Create new rule' => '', 'Create new rule' => '',
'Created at' => '', 'Created at' => '',
'Credentials will be sent to the user by email' => '', 'Credentials will be sent to the user by email' => '',
'Current' => '',
'Current password' => '', 'Current password' => '',
'Current password is not valid' => '', 'Current password is not valid' => '',
'Data privacy' => '', 'Data privacy' => '',
@ -112,13 +114,17 @@ return [
'Gravatar email' => '', 'Gravatar email' => '',
'Hello' => '', 'Hello' => '',
'Here you can download your personal data in a comma separated values format.' => '', 'Here you can download your personal data in a comma separated values format.' => '',
'IP' => '',
'I agree processing of my personal data and the use of cookies to facilitate the operation of this site. For more information read our {privacyPolicy}' => '',
'If you already registered, sign in and connect this account on settings page' => '', 'If you already registered, sign in and connect this account on settings page' => '',
'If you cannot click the link, please try pasting the text into your browser' => '', 'If you cannot click the link, please try pasting the text into your browser' => '',
'If you did not make this request you can ignore this email' => '', 'If you did not make this request you can ignore this email' => '',
'If you haven\'t received a password, you can reset it at' => '',
'Impersonate this user' => '', 'Impersonate this user' => '',
'In order to complete your registration, please click the link below' => '', 'In order to complete your registration, please click the link below' => '',
'In order to complete your request, please click the link below' => '', 'In order to complete your request, please click the link below' => '',
'In order to finish your registration, we need you to enter following fields' => '', 'In order to finish your registration, we need you to enter following fields' => '',
'Inactive' => '',
'Information' => '', 'Information' => '',
'Invalid login or password' => '', 'Invalid login or password' => '',
'Invalid or expired link' => '', 'Invalid or expired link' => '',
@ -128,6 +134,7 @@ return [
'It will be deleted forever' => '', 'It will be deleted forever' => '',
'Items' => '', 'Items' => '',
'Joined on {0, date}' => '', 'Joined on {0, date}' => '',
'Last activity' => '',
'Last login IP' => '', 'Last login IP' => '',
'Last login time' => '', 'Last login time' => '',
'Last password change' => '', 'Last password change' => '',
@ -186,11 +193,15 @@ return [
'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => '', 'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => '',
'Select rule...' => '', 'Select rule...' => '',
'Send password recovery email' => '', 'Send password recovery email' => '',
'Session ID' => '',
'Session history' => '',
'Sign in' => '', 'Sign in' => '',
'Sign up' => '', 'Sign up' => '',
'Something went wrong' => '', 'Something went wrong' => '',
'Status' => '',
'Submit' => '', 'Submit' => '',
'Switch identities is disabled.' => '', 'Switch identities is disabled.' => '',
'Terminate all sessions' => '',
'Thank you for signing up on {0}' => '', 'Thank you for signing up on {0}' => '',
'Thank you, registration is now complete.' => '', 'Thank you, registration is now complete.' => '',
'The "recaptcha" component must be configured.' => '', 'The "recaptcha" component must be configured.' => '',
@ -232,7 +243,9 @@ return [
'Update rule' => '', 'Update rule' => '',
'Update user account' => '', 'Update user account' => '',
'Updated at' => '', 'Updated at' => '',
'User ID' => '',
'User account could not be created.' => '', 'User account could not be created.' => '',
'User agent' => '',
'User block status has been updated.' => '', 'User block status has been updated.' => '',
'User could not be registered.' => '', 'User could not be registered.' => '',
'User has been confirmed' => '', 'User has been confirmed' => '',
@ -258,6 +271,7 @@ return [
'You can connect multiple accounts to be able to log in using them' => '', 'You can connect multiple accounts to be able to log in using them' => '',
'You cannot remove your own account' => '', 'You cannot remove your own account' => '',
'You need to confirm your email address' => '', 'You need to confirm your email address' => '',
'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}' => '',
'Your account details have been updated' => '', 'Your account details have been updated' => '',
'Your account has been blocked' => '', 'Your account has been blocked' => '',
'Your account has been blocked.' => '', 'Your account has been blocked.' => '',
@ -273,6 +287,9 @@ return [
'Your password has expired, you must change it now' => '', 'Your password has expired, you must change it now' => '',
'Your personal information has been removed' => '', 'Your personal information has been removed' => '',
'Your profile has been updated' => '', 'Your profile has been updated' => '',
'Your role requires 2FA, you won\'t be able to use the application until you enable it' => '',
'privacy policy' => '',
'{0, date, MMM dd, YYYY HH:mm}' => '',
'{0, date, MMMM dd, YYYY HH:mm}' => '', '{0, date, MMMM dd, YYYY HH:mm}' => '',
'{0} cannot be blank.' => '', '{0} cannot be blank.' => '',
]; ];

View File

@ -270,32 +270,26 @@ return [
'{0, date, MMMM dd, YYYY HH:mm}' => '{0, dátum, MMMM dd, ÉÉÉÉ HH: mm}', '{0, date, MMMM dd, YYYY HH:mm}' => '{0, dátum, MMMM dd, ÉÉÉÉ HH: mm}',
'{0} cannot be blank.' => '{0} nem lehet üres.', '{0} cannot be blank.' => '{0} nem lehet üres.',
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '', 'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'Active' => '',
'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '', 'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '',
'Current' => '',
'Data privacy' => '', 'Data privacy' => '',
'IP' => '',
'Inactive' => '',
'Last activity' => '',
'If you haven\'t received a password, you can reset it at' => '',
'Rule class name' => '', 'Rule class name' => '',
'Select rule...' => '', 'Select rule...' => '',
'Session ID' => '',
'Session history' => '',
'Status' => '',
'Submit' => '', 'Submit' => '',
'Terminate all sessions' => '',
'Two factor authentication protects you in case of stolen credentials' => '', 'Two factor authentication protects you in case of stolen credentials' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '', 'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'User ID' => '',
'User agent' => '',
'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}' => '',
'Your consent is required to work with this site' => '', 'Your consent is required to work with this site' => '',
'A message has been sent to your email address. ' => '@@Üzenet érkezett az e-mail címedre.@@', 'Your role requires 2FA, you won\'t be able to use the application until you enable it' => '',
'An email has been sent with instructions for resetting your password' => '@@E-mailt küldtek a jelszó visszaállításával kapcsolatos utasításokkal@@',
'Awesome, almost there. ' => '@@Hurrá, majdnem kész.@@',
'Disable Two-Factor Auth' => '@@Letiltja a kétütemű hitelesítést@@',
'Enable Two-factor auth' => '@@Engedélyezze a kétütemű hitelesítést@@',
'I aggree processing of my personal data and the use of cookies to facilitate the operation of this site. For more information read our {privacyPolicy}' => '@@Aggregálom a személyes adataim feldolgozását és a cookie-k használatát a webhely működésének megkönnyítése érdekében. További információért olvassa el a {privacyPolicy}@@',
'Invalid two-factor code' => '@@Érvénytelen kétütemű kód@@',
'Last login' => '@@Utolsó bejelentkezés@@',
'This will disable two-factor auth. Are you sure?' => '@@Ez letiltja a kétütemű hitelesítést. biztos vagy ebben?@@',
'Two Factor Authentication' => '@@Két tényező hitelesítés@@',
'Two factor authentication protects you against stolen credentials' => '@@Két tényező-hitelesítés megvédi az ellopott hitelesítő adatokat@@',
'Two factor successfully enabled.' => '@@Két tényező sikeresen bekapcsolt.@@',
'Two-Factor Authentication' => '@@Két faktoros hitelesítés@@',
'Two-factor auth protects you against stolen credentials' => '@@A kétütemű auth védelmet nyújt az ellopott hitelesítő adatok ellen@@',
'Two-factor authentication code' => '@@Kétszeres hitelesítési kód@@',
'Two-factor authorization has been disabled.' => '@@A kétütemű engedélyezés le van tiltva.@@',
'Two-factor code' => '@@Kétszámjegyű kód@@',
'Unable to disable two-factor authorization.' => '@@Nem sikerült letiltani a kétütemű engedélyezést.@@',
'We couldn\'t re-send the mail to confirm your address. ' => '@@A cím megerősítéséhez nem tudtuk újra elküldeni az e-mailt.@@',
'We have sent confirmation links to both old and new email addresses. ' => '@@Megerősítő linkeket küldtünk régi és új e-mail címekre.@@',
]; ];

View File

@ -209,7 +209,7 @@ return [
'Two Factor Authentication (2FA)' => 'Autenticazione a due fattori (2FA)', 'Two Factor Authentication (2FA)' => 'Autenticazione a due fattori (2FA)',
'Two factor authentication code' => 'Codice di autenticazione a due fattori', 'Two factor authentication code' => 'Codice di autenticazione a due fattori',
'Two factor authentication has been disabled.' => 'Autenticazione a due fattori disabilitata.', 'Two factor authentication has been disabled.' => 'Autenticazione a due fattori disabilitata.',
'Two factor authentication protects you in case of stolen credentials' => 'L\'autenticazione a due fattura ti protegge in caso di furto di credenziali', 'Two factor authentication protects you in case of stolen credentials' => 'L\'autenticazione a due fattori ti protegge in caso di furto di credenziali',
'Two factor authentication successfully enabled.' => 'Autenticazione a due fattori abilitata con successo.', 'Two factor authentication successfully enabled.' => 'Autenticazione a due fattori abilitata con successo.',
'Unable to confirm user. Please, try again.' => 'Impossibile confermare l\'utente, per favore ritenta.', 'Unable to confirm user. Please, try again.' => 'Impossibile confermare l\'utente, per favore ritenta.',
'Unable to create an account.' => 'Impossibile creare l\'account.', 'Unable to create an account.' => 'Impossibile creare l\'account.',
@ -274,9 +274,29 @@ return [
'Your password has expired, you must change it now' => 'La tua password è scaduta, devi cambiarla', 'Your password has expired, you must change it now' => 'La tua password è scaduta, devi cambiarla',
'Your personal information has been removed' => 'I tuoi dati personali sono stati rimossi', 'Your personal information has been removed' => 'I tuoi dati personali sono stati rimossi',
'Your profile has been updated' => 'Il tuo profilo è stato aggiornato', 'Your profile has been updated' => 'Il tuo profilo è stato aggiornato',
'Your role requires 2FA, you won\'t be able to use the application until you enable it' => 'Il tuo ruolo richiede l\'autenticazione a due fattori, non potrai usare l\'applicazione finché non l\'avrai abilitata',
'privacy policy' => 'politica della privacy', 'privacy policy' => 'politica della privacy',
'{0, date, MMM dd, YYYY HH:mm}' => '{0, date, MMM dd, YYYY HH:mm}', '{0, date, MMM dd, YYYY HH:mm}' => '{0, date, MMM dd, YYYY HH:mm}',
'{0, date, MMMM dd, YYYY HH:mm}' => '{0, date, dd MMMM YYYY HH:mm}', '{0, date, MMMM dd, YYYY HH:mm}' => '{0, date, dd MMMM YYYY HH:mm}',
'{0} cannot be blank.' => '{0} non può essere vuoto.', '{0} cannot be blank.' => '{0} non può essere vuoto.',
'An email has been sent with instructions for resetting your password' => '@@È stata inviata un\'email con le istruzioni per azzerare la tua password@@', 'If you haven\'t received a password, you can reset it at' => '',
'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}' => '',
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'Active' => '',
'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '',
'Current' => '',
'Data privacy' => '',
'IP' => '',
'Inactive' => '',
'Last activity' => '',
'Session ID' => '',
'Session history' => '',
'Status' => '',
'Submit' => '',
'Terminate all sessions' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'User ID' => '',
'User agent' => '',
'Your consent is required to work with this site' => '',
'{0, date, MMM dd, YYYY HH:mm}' => '',
]; ];

View File

@ -28,6 +28,7 @@ return [
'Account details' => '', 'Account details' => '',
'Account details have been updated' => '', 'Account details have been updated' => '',
'Account settings' => '', 'Account settings' => '',
'Active' => '',
'Already registered? Sign in!' => '', 'Already registered? Sign in!' => '',
'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '', 'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '',
'An error occurred processing your request' => '', 'An error occurred processing your request' => '',
@ -81,6 +82,7 @@ return [
'Create new rule' => '', 'Create new rule' => '',
'Created at' => '', 'Created at' => '',
'Credentials will be sent to the user by email' => '', 'Credentials will be sent to the user by email' => '',
'Current' => '',
'Current password' => '', 'Current password' => '',
'Current password is not valid' => '', 'Current password is not valid' => '',
'Data privacy' => '', 'Data privacy' => '',
@ -112,13 +114,18 @@ return [
'Gravatar email' => '', 'Gravatar email' => '',
'Hello' => '', 'Hello' => '',
'Here you can download your personal data in a comma separated values format.' => '', 'Here you can download your personal data in a comma separated values format.' => '',
'IP' => '',
'I agree processing of my personal data and the use of cookies to facilitate the operation of this site. For more information read our {privacyPolicy}' => '',
'I agree processing of my personal data and the use of cookies to facilitate the operation of this site. For more information read our {privacyPolicy}' => '',
'If you already registered, sign in and connect this account on settings page' => '', 'If you already registered, sign in and connect this account on settings page' => '',
'If you cannot click the link, please try pasting the text into your browser' => '', 'If you cannot click the link, please try pasting the text into your browser' => '',
'If you did not make this request you can ignore this email' => '', 'If you did not make this request you can ignore this email' => '',
'If you haven\'t received a password, you can reset it at' => '',
'Impersonate this user' => '', 'Impersonate this user' => '',
'In order to complete your registration, please click the link below' => '', 'In order to complete your registration, please click the link below' => '',
'In order to complete your request, please click the link below' => '', 'In order to complete your request, please click the link below' => '',
'In order to finish your registration, we need you to enter following fields' => '', 'In order to finish your registration, we need you to enter following fields' => '',
'Inactive' => '',
'Information' => '', 'Information' => '',
'Invalid login or password' => '', 'Invalid login or password' => '',
'Invalid or expired link' => '', 'Invalid or expired link' => '',
@ -128,6 +135,7 @@ return [
'It will be deleted forever' => '', 'It will be deleted forever' => '',
'Items' => '', 'Items' => '',
'Joined on {0, date}' => '', 'Joined on {0, date}' => '',
'Last activity' => '',
'Last login IP' => '', 'Last login IP' => '',
'Last login time' => '', 'Last login time' => '',
'Last password change' => '', 'Last password change' => '',
@ -186,11 +194,15 @@ return [
'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => '', 'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => '',
'Select rule...' => '', 'Select rule...' => '',
'Send password recovery email' => '', 'Send password recovery email' => '',
'Session ID' => '',
'Session history' => '',
'Sign in' => '', 'Sign in' => '',
'Sign up' => '', 'Sign up' => '',
'Something went wrong' => '', 'Something went wrong' => '',
'Status' => '',
'Submit' => '', 'Submit' => '',
'Switch identities is disabled.' => '', 'Switch identities is disabled.' => '',
'Terminate all sessions' => '',
'Thank you for signing up on {0}' => '', 'Thank you for signing up on {0}' => '',
'Thank you, registration is now complete.' => '', 'Thank you, registration is now complete.' => '',
'The "recaptcha" component must be configured.' => '', 'The "recaptcha" component must be configured.' => '',
@ -232,7 +244,9 @@ return [
'Update rule' => '', 'Update rule' => '',
'Update user account' => '', 'Update user account' => '',
'Updated at' => '', 'Updated at' => '',
'User ID' => '',
'User account could not be created.' => '', 'User account could not be created.' => '',
'User agent' => '',
'User block status has been updated.' => '', 'User block status has been updated.' => '',
'User could not be registered.' => '', 'User could not be registered.' => '',
'User has been confirmed' => '', 'User has been confirmed' => '',
@ -258,6 +272,7 @@ return [
'You can connect multiple accounts to be able to log in using them' => '', 'You can connect multiple accounts to be able to log in using them' => '',
'You cannot remove your own account' => '', 'You cannot remove your own account' => '',
'You need to confirm your email address' => '', 'You need to confirm your email address' => '',
'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}' => '',
'Your account details have been updated' => '', 'Your account details have been updated' => '',
'Your account has been blocked' => '', 'Your account has been blocked' => '',
'Your account has been blocked.' => '', 'Your account has been blocked.' => '',
@ -273,6 +288,9 @@ return [
'Your password has expired, you must change it now' => '', 'Your password has expired, you must change it now' => '',
'Your personal information has been removed' => '', 'Your personal information has been removed' => '',
'Your profile has been updated' => '', 'Your profile has been updated' => '',
'Your role requires 2FA, you won\'t be able to use the application until you enable it' => '',
'privacy policy' => '',
'{0, date, MMM dd, YYYY HH:mm}' => '',
'{0, date, MMMM dd, YYYY HH:mm}' => '', '{0, date, MMMM dd, YYYY HH:mm}' => '',
'{0} cannot be blank.' => '', '{0} cannot be blank.' => '',
]; ];

View File

@ -28,6 +28,7 @@ return [
'Account details' => '', 'Account details' => '',
'Account details have been updated' => '', 'Account details have been updated' => '',
'Account settings' => '', 'Account settings' => '',
'Active' => '',
'Already registered? Sign in!' => '', 'Already registered? Sign in!' => '',
'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '', 'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '',
'An error occurred processing your request' => '', 'An error occurred processing your request' => '',
@ -81,6 +82,7 @@ return [
'Create new rule' => '', 'Create new rule' => '',
'Created at' => '', 'Created at' => '',
'Credentials will be sent to the user by email' => '', 'Credentials will be sent to the user by email' => '',
'Current' => '',
'Current password' => '', 'Current password' => '',
'Current password is not valid' => '', 'Current password is not valid' => '',
'Data privacy' => '', 'Data privacy' => '',
@ -112,13 +114,17 @@ return [
'Gravatar email' => '', 'Gravatar email' => '',
'Hello' => '', 'Hello' => '',
'Here you can download your personal data in a comma separated values format.' => '', 'Here you can download your personal data in a comma separated values format.' => '',
'I agree processing of my personal data and the use of cookies to facilitate the operation of this site. For more information read our {privacyPolicy}' => '',
'IP' => '',
'If you already registered, sign in and connect this account on settings page' => '', 'If you already registered, sign in and connect this account on settings page' => '',
'If you cannot click the link, please try pasting the text into your browser' => '', 'If you cannot click the link, please try pasting the text into your browser' => '',
'If you did not make this request you can ignore this email' => '', 'If you did not make this request you can ignore this email' => '',
'If you haven\'t received a password, you can reset it at' => '',
'Impersonate this user' => '', 'Impersonate this user' => '',
'In order to complete your registration, please click the link below' => '', 'In order to complete your registration, please click the link below' => '',
'In order to complete your request, please click the link below' => '', 'In order to complete your request, please click the link below' => '',
'In order to finish your registration, we need you to enter following fields' => '', 'In order to finish your registration, we need you to enter following fields' => '',
'Inactive' => '',
'Information' => '', 'Information' => '',
'Invalid login or password' => '', 'Invalid login or password' => '',
'Invalid or expired link' => '', 'Invalid or expired link' => '',
@ -128,6 +134,7 @@ return [
'It will be deleted forever' => '', 'It will be deleted forever' => '',
'Items' => '', 'Items' => '',
'Joined on {0, date}' => '', 'Joined on {0, date}' => '',
'Last activity' => '',
'Last login IP' => '', 'Last login IP' => '',
'Last login time' => '', 'Last login time' => '',
'Last password change' => '', 'Last password change' => '',
@ -186,11 +193,15 @@ return [
'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => '', 'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => '',
'Select rule...' => '', 'Select rule...' => '',
'Send password recovery email' => '', 'Send password recovery email' => '',
'Session ID' => '',
'Session history' => '',
'Sign in' => '', 'Sign in' => '',
'Sign up' => '', 'Sign up' => '',
'Something went wrong' => '', 'Something went wrong' => '',
'Status' => '',
'Submit' => '', 'Submit' => '',
'Switch identities is disabled.' => '', 'Switch identities is disabled.' => '',
'Terminate all sessions' => '',
'Thank you for signing up on {0}' => '', 'Thank you for signing up on {0}' => '',
'Thank you, registration is now complete.' => '', 'Thank you, registration is now complete.' => '',
'The "recaptcha" component must be configured.' => '', 'The "recaptcha" component must be configured.' => '',
@ -232,7 +243,9 @@ return [
'Update rule' => '', 'Update rule' => '',
'Update user account' => '', 'Update user account' => '',
'Updated at' => '', 'Updated at' => '',
'User ID' => '',
'User account could not be created.' => '', 'User account could not be created.' => '',
'User agent' => '',
'User block status has been updated.' => '', 'User block status has been updated.' => '',
'User could not be registered.' => '', 'User could not be registered.' => '',
'User has been confirmed' => '', 'User has been confirmed' => '',
@ -258,6 +271,7 @@ return [
'You can connect multiple accounts to be able to log in using them' => '', 'You can connect multiple accounts to be able to log in using them' => '',
'You cannot remove your own account' => '', 'You cannot remove your own account' => '',
'You need to confirm your email address' => '', 'You need to confirm your email address' => '',
'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}' => '',
'Your account details have been updated' => '', 'Your account details have been updated' => '',
'Your account has been blocked' => '', 'Your account has been blocked' => '',
'Your account has been blocked.' => '', 'Your account has been blocked.' => '',
@ -273,6 +287,9 @@ return [
'Your password has expired, you must change it now' => '', 'Your password has expired, you must change it now' => '',
'Your personal information has been removed' => '', 'Your personal information has been removed' => '',
'Your profile has been updated' => '', 'Your profile has been updated' => '',
'Your role requires 2FA, you won\'t be able to use the application until you enable it' => '',
'privacy policy' => '',
'{0, date, MMM dd, YYYY HH:mm}' => '',
'{0, date, MMMM dd, YYYY HH:mm}' => '', '{0, date, MMMM dd, YYYY HH:mm}' => '',
'{0} cannot be blank.' => '', '{0} cannot be blank.' => '',
]; ];

View File

@ -270,38 +270,25 @@ return [
'{0, date, MMMM dd, YYYY HH:mm}' => '{0, date, MMMM dd, YYYY HH:mm}\'', '{0, date, MMMM dd, YYYY HH:mm}' => '{0, date, MMMM dd, YYYY HH:mm}\'',
'{0} cannot be blank.' => '{0} kan niet leeg zijn.', '{0} cannot be blank.' => '{0} kan niet leeg zijn.',
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '', 'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'Active' => '',
'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '', 'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '',
'Current' => '',
'Data privacy' => '', 'Data privacy' => '',
'IP' => '',
'Inactive' => '',
'Last activity' => '',
'If you haven\'t received a password, you can reset it at' => '',
'Rule class name' => '', 'Rule class name' => '',
'Select rule...' => '', 'Select rule...' => '',
'Session ID' => '',
'Session history' => '',
'Status' => '',
'Submit' => '', 'Submit' => '',
'Terminate all sessions' => '',
'Two factor authentication protects you in case of stolen credentials' => '', 'Two factor authentication protects you in case of stolen credentials' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '', 'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'User ID' => '',
'User agent' => '',
'Your consent is required to work with this site' => '', 'Your consent is required to work with this site' => '',
'A message has been sent to your email address. ' => '@@Een bericht werd naar jouw emailadres verzonden@@', 'Your role requires 2FA, you won\'t be able to use the application until you enable it' => '',
'An email has been sent with instructions for resetting your password' => '@@Er werd een email verstuurd met instructies om jouw wachtwoord te resetten@@',
'Awesome, almost there. ' => '@@Super, bijna klaar.@@',
'Class "{0}" does not exist' => '@@Class "{0} bestaat niet@@',
'Disable Two-Factor Auth' => '@@Tweetraps authenticatie uitschakelen@@',
'Enable Two-factor auth' => '@@Tweetraps authenticatie inschakelen@@',
'I aggree processing of my personal data and the use of cookies
to facilitate the operation of this site. For more information read our {privacyPolicy}' => '@@Ik ga akkoord dat mijn persoonlijke data en cookies worden verwerkt voor het gebruik van deze website. Voor meer informatie lees onze {privacyPolicy}@@',
'I aggree processing of my personal data and the use of cookies to facilitate the operation of this site. For more information read our {privacyPolicy}' => '@@Ik ga akkoord dat mijn persoonlijke data en cookies worden verwerkt voor het gebruik van deze website. Voor meer informatie lees onze {privacyPolicy}@@',
'Invalid two-factor code' => '@@Ongeldige tweetraps authenticatie code@@',
'Last login' => '@@Laatste login@@',
'Registration ip' => '@@Registratie IP@@',
'Rule class can not be instantiated' => '@@Registratie IP@@',
'Rule class must extend "yii\\rbac\\Rule"' => '@@Regel klasse moet worden uitgebreid met "yii\\rbac\\Rule"@@',
'This will disable two-factor auth. Are you sure?' => '@@Dit zal de tweetraps authenticatie uitschakelen. Ben je zeker?@@',
'Two Factor Authentication' => '@@Tweetraps authenticatie@@',
'Two factor authentication protects you against stolen credentials' => '@@Tweetraps authenticatie beschermt je tegen gestolen inloggegevens@@',
'Two factor successfully enabled.' => '@@Tweetraps authenticatie ingeschakeld@@',
'Two-Factor Authentication' => '@@Tweetraps authenticatie@@',
'Two-factor auth protects you against stolen credentials' => '@@Tweetraps authenticatie beschermt je tegen gestolen authenticatie gegevens@@',
'Two-factor authentication code' => '@@Tweetraps authenticatie code@@',
'Two-factor authorization has been disabled.' => '@@Tweetraps authenticatie werd uitgeschakeld.@@',
'Two-factor code' => '@@Tweetraps authenticatie code@@',
'Unable to disable two-factor authorization.' => '@@Tweetraps authenticatie kon niet worden uitgeschakeld@@',
'We couldn\'t re-send the mail to confirm your address. ' => '@@Wij konden de email bevestigingsmail niet opnieuw naar jouw adres verzenden.@@',
'We have sent confirmation links to both old and new email addresses. ' => '@@We hebben de bevestigingsmail naar zowel jouw oud als nieuw emailadres verzonden.@@',
]; ];

View File

@ -1,273 +0,0 @@
<?php
/**
* Message translations.
*
* This file is automatically generated by 'yii message/extract' command.
* It contains the localizable messages extracted from source code.
* You may modify this file by translating the extracted messages.
*
* Each array element represents the translation (value) of a message (key).
* If the value is empty, the message is considered as not translated.
* Messages that no longer need translation will have their translations
* enclosed between a pair of '@@' marks.
*
* Message string can be used with plural forms format. Check i18n section
* of the guide for details.
*
* NOTE: this file must be saved in UTF-8 encoding.
*/
return [
'(not set)' => '-',
'A confirmation message has been sent to your new email address' => 'Een bevestigingsbericht is verzonden naar je nieuwe e-mailadres',
'A message has been sent to your email address. It contains a confirmation link that you must click to complete registration.' => 'Een email met een bevestigingslink werd verzonden naar je emailadres. Klik op de link om de registratie te voltooien.',
'A new confirmation link has been sent' => 'Een nieuwe bevestigingslink is verzonden',
'A password will be generated automatically if not provided' => 'Een wachtwoord wordt automatisch gegenereerd als er dit niet wordt opgegeven',
'Account' => 'Account',
'Account confirmation' => 'Accountbevestiging',
'Account details' => 'Accountdetails',
'Account details have been updated' => 'Accountdetails werden bijgewerkt',
'Account settings' => 'Account-instellingen',
'Already registered? Sign in!' => 'AL geregistreerd? Log in!',
'An email has been sent with instructions for resetting your password' => 'Er is een email verstuurd met instructies om je wachtwoord te herstellen',
'An error occurred processing your request' => 'Er is een fout opgetreden bij het verwerken van je aanvraag',
'Are you sure you want to block this user?' => 'Weet je zeker dat je deze gebruiker wil blokkeren?',
'Are you sure you want to confirm this user?' => 'Weet je zeker dat je deze gebruiker wil bevestigen?',
'Are you sure you want to delete this user?' => 'Wet je zeker dat je deze gebrukiker wil verwijderen?',
'Are you sure you want to switch to this user for the rest of this Session?' => 'Weet je zeker dat je als deze gebruiker wil verder gaan voor deze sessie?',
'Are you sure you want to unblock this user?' => 'Weet je zeker dat je deze gebruiker wil activeren?',
'Are you sure you wish the user to change their password at next login?' => 'Weet je zeker dat de gebruiker zijn wachtwoord moet wijzigen bij de volgende keer dat deze inlogt?',
'Are you sure you wish to send a password recovery email to this user?' => 'Weet je zeker dat je een wachtwoord herstel-email naar deze gebruiker wil verzenden?',
'Are you sure? Deleted user can not be restored' => 'Weet je het zeker? Een verwijderde gebruiker kan niet worden hersteld!',
'Are you sure? There is no going back' => 'Weet je het zeker? Dit kan niet ongedaan gemaakt worden!',
'Assignments' => 'Toewijzingen',
'Assignments have been updated' => 'Toewijzingen zijn bijgewerkt',
'Auth item with such name already exists' => 'Auth item met deze naam bestaat al',
'Authentication rule class {0} can not be instantiated' => 'Authenticatie regel klasse {0} kan niet worden geïnstantieerd',
'Authorization item successfully created.' => 'Authorisatie item met succes aangemaakt',
'Authorization item successfully removed.' => 'Authorisatie item met succes verwijderd',
'Authorization item successfully updated.' => 'Authorisatie item met succes geüpdatet',
'Authorization rule has been added.' => 'Authorisatie regel werd toegevoegd',
'Authorization rule has been removed.' => 'Authorisatie regel werd verwijderd',
'Authorization rule has been updated.' => 'Authorisatie regel werd geüpdatet',
'Awesome, almost there. Now you need to click the confirmation link sent to your new email address.' => 'Super, bijna klaar. Open alleen nog de bevestigingslink in de mail die naar jouw nieuwe emailadres gestuurd is',
'Awesome, almost there. Now you need to click the confirmation link sent to your old email address.' => 'Super, bijna klaar. Open alleen nog de bevestigingslink in de mail die naar jouw oude emailadres gestuurd is',
'Back to privacy settings' => 'Terug naar privcay settings',
'Bio' => 'Biografie',
'Block' => 'Blokkeer',
'Block status' => 'Blokkering',
'Blocked at {0, date, MMMM dd, YYYY HH:mm}' => 'Geblokkeerd op {0, date, MMMM dd, YYYY HH:mm}',
'Cancel' => 'Annuleren',
'Cannot assign role \'{0}\' as the AuthManager is not configured on your console application.' => 'Kan rol {0} niet toewijzen doordat de AuthManager niet geconfigureerd is op de console-applicatie',
'Change your avatar at Gravatar.com' => 'Wijzig je avatar op Gravatar.com',
'Children' => 'Kinderen',
'Class' => 'Klasse',
'Close' => 'Sluiten',
'Complete password reset on {0}' => 'Voltooi het herstellen van je wachtwoord op {0}',
'Confirm' => 'Bevestig',
'Confirm account on {0}' => 'Bevestig account op {0}',
'Confirm email change on {0}' => 'Bevestig email-wijziging op {0}',
'Confirmation' => 'Bevestiging',
'Confirmation status' => 'Bevestigingsstatus',
'Confirmation time' => 'Tijdstip bevestiging',
'Confirmed' => 'Bevestigd',
'Confirmed at {0, date, MMMM dd, YYYY HH:mm}' => 'Bevestigd op {0, date, MMMM dd, YYYY HH:mm}',
'Connect' => 'Verbinden',
'Continue' => 'Verder',
'Create' => 'Maak aan',
'Create a user account' => 'Maak een gebruikersaccount aan',
'Create new permission' => 'Maak een nieuwe permissie aan',
'Create new role' => 'Maak een nieuw rol aan',
'Create new rule' => 'maak een nieuwe regel aan',
'Created at' => 'Gemaakt op',
'Credentials will be sent to the user by email' => 'Inloggevens worden via mail naar de gebruiker verzonden',
'Current password' => 'Huidig wachtwoord',
'Current password is not valid' => 'Huidig wachtwoord is niet geldig',
'Data processing consent' => 'Toestemming gegevensverwerking',
'Delete' => 'Verwijder',
'Delete account' => 'Verwijder account',
'Delete my account' => 'Verwijder mijn account',
'Delete personal data' => 'Verwijder mijn persoonlijke gegevens',
'Deleted by GDPR request' => 'Verwijderd vanwege mijn AVG verzoek',
'Description' => 'Omschrijving',
'Didn\'t receive confirmation message?' => 'Geen bevestigings-email ontvangen?',
'Disable two factor authentication' => '2 traps authenticatie uitschakelen',
'Disconnect' => 'Verbreek verbindig',
'Don\'t have an account? Sign up!' => 'Geen account? Meld je aan',
'Download my data' => 'Download mijn gegevens',
'Email' => 'Email',
'Email (public)' => 'Email (publiek)',
'Enable' => 'Schakel in',
'Enable two factor authentication' => 'Schakel 2 traps authenticatie in',
'Error occurred while changing password' => 'Fout bij wijzigen van het wachtwoord',
'Error occurred while confirming user' => 'Fout bij bevestigen van de gebruiker',
'Error occurred while deleting user' => 'Fout bij verwijderen van de gebruiker',
'Error sending registration message to \'{email}\'. Please try again later.' => 'Er is een fout opgetreden bij verzenden van de registratie-email naar \'{email}\'. Probeer later nog eens.',
'Error sending welcome message to \'{email}\'. Please try again later.' => 'Er is een fout opgetreden bij verzenden van de welkomst-email naar \'{email}\'. Probeer later nog eens.',
'Export my data' => 'Exporteer mijn gegevens',
'Finish' => 'beëindig',
'Force password change at next login' => 'Forceer wachtwoord-herstel bij volgende login',
'Forgot password?' => 'Wachtwoord vergeten?',
'Gravatar email' => 'Gravatar email',
'Hello' => 'Hallo',
'Here you can download your personal data in a comma separated values format.' => 'Hier kan je al jouw persoonlijke data downloaden in een komma-gescheiden formaat.',
'I agree processing of my personal data and the use of cookies to facilitate the operation of this site. For more information read our {privacyPolicy}' => 'Ik ga akkoord met het verwerken van mijn persoonlijke data en het gebruik van cookies om de werking van deze website te vergemakkelijken. Voor meer, lees onze {privacyPolicy}',
'If you already registered, sign in and connect this account on settings page' => 'Als je al geregistreerd bent, meldt je aan en verbind deze account via de instellingen pagina',
'If you cannot click the link, please try pasting the text into your browser' => 'Kopieer en plak deze tekst in jouw browser als je niet op deze link kan klikken',
'If you did not make this request you can ignore this email' => 'Als je deze aanvraag niet hebt gedaan kan je deze email negeren',
'Impersonate this user' => 'Ga verder als deze gebruiker',
'In order to complete your registration, please click the link below' => 'Klik op onderstaande link om je registratie te voltooien',
'In order to complete your request, please click the link below' => 'Klik op onderstaande link om je registratie te voltooien',
'In order to finish your registration, we need you to enter following fields' => 'De volgende velden moeten verplicht worden ingevuld voor je registrate',
'Information' => 'Informatie',
'Invalid login or password' => 'Ongeldige login of wachtwoord',
'Invalid or expired link' => 'Ongeldige of vervallen link',
'Invalid password' => 'Ongeldig wachtwoord',
'Invalid two factor authentication code' => 'Ongeldige 2 traps authenticatie code',
'Invalid value' => 'Ongeldige waarde',
'It will be deleted forever' => 'Het zal voor altijd verwijderd worden',
'Items' => 'Items',
'Joined on {0, date}' => 'Aangemeld op {0, date}',
'Last login IP' => 'Laatste login IP',
'Last login time' => 'Laatste login',
'Last password change' => 'Laatste wachtwoordwijziging',
'Location' => 'Locatie',
'Login' => 'Log in',
'Logout' => 'Log uit',
'Manage users' => 'Beheer gebruikers',
'Name' => 'Naam',
'Networks' => 'Netwerken',
'Never' => 'Nooit',
'New email' => 'Nieuwe email',
'New password' => 'Nieuw wachtwoord',
'New permission' => 'Nieuwe permissies',
'New role' => 'Nieuwe rol',
'New rule' => 'Nieuwe regel',
'New user' => 'Nieuwe gebruiker',
'Not blocked' => 'Niet geblokkeerd',
'Not found' => 'Niet gevonden',
'Once you delete your account, there is no going back' => 'Als je jouw account verwijdert kan dit niet ongedaan gemaakt worden',
'Once you have deleted your data, you will not longer be able to sign in with this account.' => 'Als je jouw data verwijdert is inloggen met deze account niet meer mogelijk.',
'Password' => 'Wachtwoord',
'Password age' => 'Ouderdeom wachtwoord',
'Password has been changed' => 'Wachtwoord is gewijzigd',
'Permissions' => 'Machtigingen',
'Please be certain' => 'Weet je het zeker?',
'Please click the link below to complete your password reset' => 'Klik op onderstaande link om je wachtwoordherstel te voltooien',
'Please fix following errors:' => 'Los de volgende fouten op:',
'Privacy' => 'Privacy',
'Privacy settings' => 'Privacy-instellingen',
'Profile' => 'Profiel',
'Profile details' => 'Profieldetails',
'Profile details have been updated' => 'Profieldetails werden geüpdatet',
'Profile settings' => 'Profiel-instellingen',
'Recover your password' => 'Herstel je wachtwoord',
'Recovery link is invalid or expired. Please try requesting a new one.' => 'Herstel-link is ongeldig of vervallen. Vraag een nieuwe aan',
'Recovery message sent' => 'Herstelbericht is verzonden',
'Registration IP' => 'Registratie IP',
'Registration on this website is disabled' => 'Registratie is gedeactiveerd op deze website',
'Registration time' => 'Registratietijdstip',
'Remember me next time' => 'Onthoud mij',
'Request new confirmation message' => 'Vraag een nieuw bevestigingsbericht aan',
'Required \'key\' cannot be empty.' => 'Verplicht veld \'key\' kan niet leeg zijn.',
'Required \'secret\' cannot be empty.' => 'Verplicht veld \'geheim\' kan niet leeg zijn.',
'Reset your password' => 'Reset jouw wachtwoord',
'Role \'{0}\' not found. Creating it.' => 'Rol \'{0}\' kan niet worden gevonden. Het wordt aangemaakt',
'Roles' => 'Rollen',
'Rule' => 'Regel',
'Rule class must extend \'yii\rbac\Rule\'.' => 'Regel class moet \'yii\rbac\Rule\' extenden.',
'Rule name' => 'Regel naam',
'Rule name {0} is already in use' => 'Regel met naam \'{0}\' is al in gebruik',
'Rule {0} does not exists' => 'Regel {0} bestaat niet',
'Rule {0} not found.' => 'Regel {0} werd niet gevonden',
'Rules' => 'Regels',
'Save' => 'Opslaan',
'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => 'Scan de QR coe met Google Authenticator (of vergelijkbare app), voer de tijdelijke code in en klik op verzenden.',
'Send password recovery email' => 'Verzend wachtwoord herstel-email',
'Sign in' => 'Aanmelden',
'Sign up' => 'Registreren',
'Something went wrong' => 'Er ging iets mis',
'Switch identities is disabled.' => 'Identiteit-wisselen is niet ingeschakeld',
'Thank you for signing up on {0}' => 'Bedankt voor je registratie op {0}',
'Thank you, registration is now complete.' => 'Bedankt, je registratie is voltooid.',
'The \'recaptcha\' component must be configured.' => 'De \'recaptcha\' component moet worden geconfigureerd.',
'The confirmation link is invalid or expired. Please try requesting a new one.' => 'De bevestigingslink is ongeldig of verlopen. Vraag een nieuwe aan.',
'The verification code is incorrect.' => 'De bevestigingscode is ongeldig',
'There is neither role nor permission with name \'{0}\'' => 'Er is geen rol of machtiging met de naam \'{0}\'',
'There was an error in saving user' => 'Er was een fout bij het opslaan van de gebruiker',
'This account has already been connected to another user' => 'Dit account is al verbonden met een andere gebruiker',
'This email address has already been taken' => 'Dit emailadres is al in gebruik',
'This username has already been taken' => 'Deze gebruikersnaam is al in gebruik',
'This will disable two factor authentication. Are you sure?' => 'Dit zal de 2 traps authenticatie uitschakelen. Ben je zeker?',
'This will remove your personal data from this site. You will no longer be able to sign in.' => 'Dit zal jouw persoonlijke data van de website wissen. Je zal niet langer kunnen inloggen.',
'Time zone' => 'Tijdzone',
'Time zone is not valid' => 'Tijdzone is niet geldig',
'Two Factor Authentication (2FA)' => '2 traps authenticatie (2FA)',
'Two factor authentication code' => '2 traps authenticatie code',
'Two factor authentication has been disabled.' => '2 traps authenticatie is uitgeschakeld',
'Two factor authentication protects you against stolen credentials' => '2 traps authenticatie beschermt je tegen gestolen inloggegevens',
'Two factor authentication successfully enabled.' => '2 traps authenticatie met succes ingeschakeld',
'Unable to confirm user. Please, try again.' => 'Kan de gebruiker niet bevestigen. Probeer opnieuw.',
'Unable to create an account.' => 'Kan geen account aanmaken.',
'Unable to create authorization item.' => 'Kan geen authorisatie-item aanmaken',
'Unable to create new authorization rule.' => 'Kan geen authorisatieregel aanmaken',
'Unable to delete user. Please, try again later.' => 'Kan de gebruiker niet wissen. Probeer later opnieuw.',
'Unable to disable Two factor authentication.' => 'Kan de 2 traps authenticatie niet uitschakelen.',
'Unable to remove authorization item.' => 'Kan het authorisatie item niet wissen.',
'Unable to send confirmation link' => 'Kan de bevestigingsmail niet versturen',
'Unable to send recovery message to the user' => 'Kan de herstel-mail niet naar de gebruiker versturen',
'Unable to update authorization item.' => 'Kan het authorisatie-item niet aanpassen.',
'Unable to update authorization rule.' => 'Kan de authorisatieregel niet aanpassen.',
'Unable to update block status.' => 'Kan de geblokkeerstatus niet aanpassen',
'Unblock' => 'Maak actief',
'Unconfirmed' => 'Niet bevestigd',
'Update' => 'Update',
'Update assignments' => 'Update toewijzingen',
'Update permission' => 'Update machtigingen',
'Update role' => 'Update rol',
'Update rule' => 'Update regel',
'Update user account' => 'Update gebruikersaccount',
'Updated at' => 'geüpdatet op',
'User account could not be created.' => 'Gebruikers-account kan niet worden aangemaakt.',
'User block status has been updated.' => 'Blokkering gebruiker is aangepast.',
'User could not be registered.' => 'Gebruiker kan niet worden geregistreerd.',
'User has been confirmed' => 'Gebruiker is bevestigd',
'User has been created' => 'Gebruiker is aangemaakt',
'User has been deleted' => 'Gebruiker is verwijderd',
'User is not found' => 'Gebruiker niet gevonden',
'User not found.' => 'Gebruiker niet gevonden',
'User will be required to change password at next login' => 'Gebruiker zal verplicht worden zijn wachtwoord aan te passen bij volgende login',
'Username' => 'Gebruikersnaam',
'Users' => 'Gebruikers',
'VKontakte' => 'VKontakte',
'Verification failed. Please, enter new code.' => 'Bevestiging mislukt. Geef een nieuwe code op.',
'We couldn\'t re-send the mail to confirm your address. Please, verify is the correct email or if it has been confirmed already.' => 'Het was niet mogelijk een email te sturen om je adres te bevestigen. Controleer het email-adres en controleer of het niet al bevestigd is.',
'We have generated a password for you' => 'Er is een wachtwoord voor je ingesteld',
'We have received a request to change the email address for your account on {0}' => 'We ontvingen een aanvraag om het email-adres te wijzigen voor je account op {0}',
'We have received a request to reset the password for your account on {0}' => 'Wij ontvingen een aanvraag om je wachtwoord te herstellen voor je account op {0}',
'We have sent confirmation links to both old and new email addresses. You must click both links to complete your request.' => 'Er is een bevestigingslink naar zowel je oude als je nieuwe email adres gestuurd. Je moet beiden links openen om de aanvraag te voltooien.',
'Website' => 'Website',
'Welcome to {0}' => 'Welkom bij {0}',
'Yandex' => 'Yandex',
'You are about to delete all your personal data from this site.' => 'Je staat op het punt om al je persoonlijke gegevens te wissen van deze website',
'You can assign multiple roles or permissions to user by using the form below' => 'Je kan meerdere rollen of machtigingen toewijzen aan de gebruiker doormiddel van onderstaand formulier',
'You can connect multiple accounts to be able to log in using them' => 'Je kan meerdere accounts verbinden om met deze accounts in te loggen',
'You cannot remove your own account' => 'Je kan je eigen account niet verwijderen.',
'You need to confirm your email address' => 'Je moet je email-adres nog bevestigen',
'Your account details have been updated' => 'Je account-details werden bijgewerkt',
'Your account has been blocked' => 'Je account is geblokkeerd',
'Your account has been blocked.' => 'Je account is geblokkeerd.',
'Your account has been completely deleted' => 'Je account is volledig verwijderd',
'Your account has been connected' => 'Je account is verbonden',
'Your account has been created' => 'Je account is aangemaakt',
'Your account has been created and a message with further instructions has been sent to your email' => 'Je account is aangemaakt en een bericht met verdere instructies is naar je e-mailadres verzonden',
'Your account on {0} has been created' => 'Je account op {0} is aangemaakt',
'Your confirmation token is invalid or expired' => 'Je bevestigingscode is ongeldig of verlopen',
'Your consent is required to register' => 'Je moet akkoord gaan met je toestemming om te registreren',
'Your email address has been changed' => 'Je email adres werd gewijzigd',
'Your password has expired, you must change it now' => 'Je wachtwoord is verlopen. Het moet nu gewijzigd worden',
'Your personal information has been removed' => 'Je persoonlijke gegevens zijn verwijderd',
'Your profile has been updated' => 'Je profiel is bijgewerkt',
'privacy policy' => 'privacy policy',
'{0, date, MMMM dd, YYYY HH:mm}' => '{0, date, dd MMMM, YYYY HH:mm}',
'{0} cannot be blank.' => '{0} kan niet leeg zijn.',
];

View File

@ -270,27 +270,26 @@ return [
'{0, date, MMMM dd, YYYY HH:mm}' => '{0, date, dd MMMM YYYY, HH:mm}', '{0, date, MMMM dd, YYYY HH:mm}' => '{0, date, dd MMMM YYYY, HH:mm}',
'{0} cannot be blank.' => '{0} nie może pozostać bez wartości', '{0} cannot be blank.' => '{0} nie może pozostać bez wartości',
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '', 'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'Active' => '',
'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '', 'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '',
'Current' => '',
'Data privacy' => '', 'Data privacy' => '',
'IP' => '',
'Inactive' => '',
'Last activity' => '',
'If you haven\'t received a password, you can reset it at' => '',
'Rule class name' => '', 'Rule class name' => '',
'Select rule...' => '', 'Select rule...' => '',
'Session ID' => '',
'Session history' => '',
'Status' => '',
'Submit' => '', 'Submit' => '',
'Terminate all sessions' => '',
'Two factor authentication protects you in case of stolen credentials' => '', 'Two factor authentication protects you in case of stolen credentials' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '', 'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'User ID' => '',
'User agent' => '',
'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}' => '',
'Your consent is required to work with this site' => '', 'Your consent is required to work with this site' => '',
'An email has been sent with instructions for resetting your password' => '@@Email z instrukcją resetowania hasła został wysłany@@', 'Your role requires 2FA, you won\'t be able to use the application until you enable it' => '',
'Disable Two-Factor Auth' => '@@Wyłącz uwierzytelnianie dwuetapowe@@',
'Enable Two-factor auth' => '@@Włącz uwierzytelnianie dwuetapowe@@',
'Invalid two-factor code' => '@@Nieprawidłowy kod uwierzytelniania dwuetapowego@@',
'Last login' => '@@Data ostatniego logowania@@',
'This will disable two-factor auth. Are you sure?' => '@@To wyłączy uwierzytelnianie dwuetapowe. Czy jesteś pewny?@@',
'Two Factor Authentication' => '@@Uwierzytelnianie dwuetapowe@@',
'Two factor authentication protects you against stolen credentials' => '@@Uwierzytelnianie dwuetapowe chroni Cię przed kradzieżą danych logowania@@',
'Two factor successfully enabled.' => '@@Dwuetapowe uwierzytelnianie poprawnie włączone.@@',
'Two-Factor Authentication' => '@@Uwierzytelnianie dwuetapowe@@',
'Two-factor auth protects you against stolen credentials' => '@@Uwierzytelnianie dwuetapowe chroni Cię przed kradzieżą danych logowania@@',
'Two-factor authentication code' => '@@Kod uwierzytelniania dwuetapowego@@',
'Two-factor authorization has been disabled.' => '@@Dwuetapowa autoryzacja została wyłączona.@@',
'Two-factor code' => '@@Kod dwuetapowy@@',
'Unable to disable two-factor authorization.' => '@@Nie można wyłączyć dwuetapowej autoryzacji.@@',
]; ];

View File

@ -270,38 +270,26 @@ return [
'{0, date, MMMM dd, YYYY HH:mm}' => '{0, date, MMMM dd, YYYY HH:mm}', '{0, date, MMMM dd, YYYY HH:mm}' => '{0, date, MMMM dd, YYYY HH:mm}',
'{0} cannot be blank.' => '{0} não pode estar em branco', '{0} cannot be blank.' => '{0} não pode estar em branco',
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '', 'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'Active' => '',
'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '', 'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '',
'Current' => '',
'Data privacy' => '', 'Data privacy' => '',
'IP' => '',
'Inactive' => '',
'Last activity' => '',
'If you haven\'t received a password, you can reset it at' => '',
'Rule class name' => '', 'Rule class name' => '',
'Select rule...' => '', 'Select rule...' => '',
'Session ID' => '',
'Session history' => '',
'Status' => '',
'Submit' => '', 'Submit' => '',
'Terminate all sessions' => '',
'Two factor authentication protects you in case of stolen credentials' => '', 'Two factor authentication protects you in case of stolen credentials' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '', 'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'User ID' => '',
'User agent' => '',
'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}' => '',
'Your consent is required to work with this site' => '', 'Your consent is required to work with this site' => '',
'A message has been sent to your email address. ' => '@@Uma mensagem foi enviada para o seu endereço de e-mail.@@', 'Your role requires 2FA, you won\'t be able to use the application until you enable it' => '',
'An email has been sent with instructions for resetting your password' => '@@Um e-mail foi enviado com instruções para redefinir sua senha@@',
'Awesome, almost there. ' => '@@Incrível, quase lá.@@',
'Class "{0}" does not exist' => '@@A classe "{0}" não existe@@',
'Disable Two-Factor Auth' => '@@Desabilitar autenticação em dois fatores@@',
'Enable Two-factor auth' => '@@Habilitar autenticação em dois fatores@@',
'I aggree processing of my personal data and the use of cookies
to facilitate the operation of this site. For more information read our {privacyPolicy}' => '@@Concordo com o processamento de meus dados pessoais e o uso de cookies para facilitar a operação deste site. Para mais informações, leia nosso {privacyPolicy}@@',
'I aggree processing of my personal data and the use of cookies to facilitate the operation of this site. For more information read our {privacyPolicy}' => '@@Concordo com o processamento de meus dados pessoais e o uso de cookies para facilitar a operação deste site. Para mais informações, leia nosso {privacyPolicy}@@',
'Invalid two-factor code' => '@@Código de dois fatores inválido@@',
'Last login' => '@@Último login@@',
'Registration ip' => '@@IP de registro@@',
'Rule class can not be instantiated' => '@@A classe de regras não pode ser instanciada@@',
'Rule class must extend "yii\\rbac\\Rule"' => '@@A classe de regras deve estender de "yii\\rbac\\Rule"@@',
'This will disable two-factor auth. Are you sure?' => '@@Isso desativará a autenticação de dois fatores. Você tem certeza?@@',
'Two Factor Authentication' => '@@Autenticação de dois fatores@@',
'Two factor authentication protects you against stolen credentials' => '@@A autenticação de dois fatores protege você contra credenciais roubadas@@',
'Two factor successfully enabled.' => '@@Dois fatores habilitados com sucesso.@@',
'Two-Factor Authentication' => '@@Autenticação de dois fatores@@',
'Two-factor auth protects you against stolen credentials' => '@@Autenticação de dois fatores protege você contra credenciais roubadas@@',
'Two-factor authentication code' => '@@Código de autenticação de dois fatores@@',
'Two-factor authorization has been disabled.' => '@@A autorização de dois fatores foi desabilitada.@@',
'Two-factor code' => '@@Código de dois fatores@@',
'Unable to disable two-factor authorization.' => '@@Não é possível desabilitar a autorização de dois fatores.@@',
'We couldn\'t re-send the mail to confirm your address. ' => '@@Não poderíamos re-enviar o correio para confirmar o seu endereço.@@',
'We have sent confirmation links to both old and new email addresses. ' => '@@Enviamos links de confirmação para endereços de e-mail antigo e novo.@@',
]; ];

View File

@ -257,24 +257,39 @@ return [
'privacy policy' => 'politica de privacidade', 'privacy policy' => 'politica de privacidade',
'{0} cannot be blank.' => '{0} não pode ficar vazio.', '{0} cannot be blank.' => '{0} não pode ficar vazio.',
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '', 'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'Active' => '',
'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '', 'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '',
'Awesome, almost there. Now you need to click the confirmation link sent to your new email address.' => '', 'Awesome, almost there. Now you need to click the confirmation link sent to your new email address.' => '',
'Awesome, almost there. Now you need to click the confirmation link sent to your old email address.' => '', 'Awesome, almost there. Now you need to click the confirmation link sent to your old email address.' => '',
'Children' => '', 'Children' => '',
'Class' => '', 'Class' => '',
'Current' => '',
'Data privacy' => '', 'Data privacy' => '',
'Email' => '', 'Email' => '',
'Gravatar email' => '', 'Gravatar email' => '',
'If you haven\'t received a password, you can reset it at' => '',
'IP' => '',
'Inactive' => '',
'Items' => '', 'Items' => '',
'Last activity' => '',
'Password' => '', 'Password' => '',
'Rule class name' => '', 'Rule class name' => '',
'Select rule...' => '', 'Select rule...' => '',
'Session ID' => '',
'Session history' => '',
'Status' => '',
'Submit' => '', 'Submit' => '',
'Terminate all sessions' => '',
'Two factor authentication protects you in case of stolen credentials' => '', 'Two factor authentication protects you in case of stolen credentials' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '', 'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'User ID' => '',
'User agent' => '',
'VKontakte' => '', 'VKontakte' => '',
'Website' => '', 'Website' => '',
'Yandex' => '', 'Yandex' => '',
'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}' => '',
'Your consent is required to work with this site' => '', 'Your consent is required to work with this site' => '',
'Your role requires 2FA, you won\'t be able to use the application until you enable it' => '',
'{0, date, MMM dd, YYYY HH:mm}' => '',
'{0, date, MMMM dd, YYYY HH:mm}' => '', '{0, date, MMMM dd, YYYY HH:mm}' => '',
]; ];

View File

@ -270,34 +270,26 @@ return [
'{0, date, MMMM dd, YYYY HH:mm}' => '{0, data, MMMM dd, AAAA HH: mm}', '{0, date, MMMM dd, YYYY HH:mm}' => '{0, data, MMMM dd, AAAA HH: mm}',
'{0} cannot be blank.' => '{0} nu poate fi gol.', '{0} cannot be blank.' => '{0} nu poate fi gol.',
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '', 'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'Active' => '',
'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '', 'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '',
'Current' => '',
'Data privacy' => '', 'Data privacy' => '',
'IP' => '',
'Inactive' => '',
'Last activity' => '',
'If you haven\'t received a password, you can reset it at' => '',
'Rule class name' => '', 'Rule class name' => '',
'Select rule...' => '', 'Select rule...' => '',
'Session ID' => '',
'Session history' => '',
'Status' => '',
'Submit' => '', 'Submit' => '',
'Terminate all sessions' => '',
'Two factor authentication protects you in case of stolen credentials' => '', 'Two factor authentication protects you in case of stolen credentials' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '', 'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'User ID' => '',
'User agent' => '',
'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}' => '',
'Your consent is required to work with this site' => '', 'Your consent is required to work with this site' => '',
'A message has been sent to your email address. ' => '@@A fost trimis un mesaj la adresa dvs. de e-mail.@@', 'Your role requires 2FA, you won\'t be able to use the application until you enable it' => '',
'An email has been sent with instructions for resetting your password' => '@@A fost trimis un e-mail cu instrucțiuni pentru resetarea parolei@@',
'Awesome, almost there. ' => '@@Minunat, aproape gata.@@',
'Disable Two-Factor Auth' => '@@Dezactivați autentificarea cu două factori@@',
'Enable Two-factor auth' => '@@Activați Auth@@',
'I aggree processing of my personal data and the use of cookies
to facilitate the operation of this site. For more information read our {privacyPolicy}' => '@@Am agregat prelucrarea datelor mele personale și utilizarea cookie-urilor pentru a facilita funcționarea acestui site. Pentru mai multe informații, citiți {privacyPolicy}@@',
'I aggree processing of my personal data and the use of cookies to facilitate the operation of this site. For more information read our {privacyPolicy}' => '@@Am agregat prelucrarea datelor mele personale și utilizarea cookie-urilor pentru a facilita funcționarea acestui site. Pentru mai multe informații, citiți {privacyPolicy}@@',
'Invalid two-factor code' => '@@Cod de două factori nevalid@@',
'Last login' => '@@Ultima logare@@',
'This will disable two-factor auth. Are you sure?' => '@@Aceasta va dezactiva auth-ul cu două factori. Esti sigur?@@',
'Two Factor Authentication' => '@@Două autentificare cu factori@@',
'Two factor authentication protects you against stolen credentials' => '@@Autentificarea cu două factori vă protejează împotriva acreditărilor furate@@',
'Two factor successfully enabled.' => '@@Doi factori activat cu succes.@@',
'Two-Factor Authentication' => '@@Două factori de autentificare@@',
'Two-factor auth protects you against stolen credentials' => '@@Autostradă cu două factori vă protejează împotriva acreditărilor furate@@',
'Two-factor authentication code' => '@@Cod de autentificare cu două factori@@',
'Two-factor authorization has been disabled.' => '@@A fost dezactivată autorizația cu două factori.@@',
'Two-factor code' => '@@Cod de două factori@@',
'Unable to disable two-factor authorization.' => '@@Imposibil de dezactivat autorizația cu două factori.@@',
'We couldn\'t re-send the mail to confirm your address. ' => '@@Nu am putut retrimite mesajul pentru a vă confirma adresa.@@',
'We have sent confirmation links to both old and new email addresses. ' => '@@Am trimis legături de confirmare adreselor de e-mail vechi și noi.@@',
]; ];

18
src/User/resources/i18n/ru/usuario.php Normal file → Executable file
View File

@ -27,6 +27,7 @@ return [
'Account details' => 'Детали аккаунта', 'Account details' => 'Детали аккаунта',
'Account details have been updated' => 'Аккаунт был обновлен', 'Account details have been updated' => 'Аккаунт был обновлен',
'Account settings' => 'Настройки аккаунта', 'Account settings' => 'Настройки аккаунта',
'Active' => 'Активно',
'Already registered? Sign in!' => 'Уже зарегистрированы? Войдите!', 'Already registered? Sign in!' => 'Уже зарегистрированы? Войдите!',
'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => 'Письмо с инструкциями по созданию нового пароля было выслано на {email}, в случае если данный адрес связан с {appName} аккаунтом', 'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => 'Письмо с инструкциями по созданию нового пароля было выслано на {email}, в случае если данный адрес связан с {appName} аккаунтом',
'An error occurred processing your request' => 'Во время выполнения запроса произошла ошибка', 'An error occurred processing your request' => 'Во время выполнения запроса произошла ошибка',
@ -80,6 +81,7 @@ return [
'Create new rule' => 'Создать правило', 'Create new rule' => 'Создать правило',
'Created at' => 'Дата создания', 'Created at' => 'Дата создания',
'Credentials will be sent to the user by email' => 'Данные для входа будут отправлены пользователю на почту', 'Credentials will be sent to the user by email' => 'Данные для входа будут отправлены пользователю на почту',
'Current' => 'Текущий',
'Current password' => 'Текущий пароль', 'Current password' => 'Текущий пароль',
'Current password is not valid' => 'Текущий пароль введён неправильно', 'Current password is not valid' => 'Текущий пароль введён неправильно',
'Data processing consent' => 'Cогласие на обработку данных', 'Data processing consent' => 'Cогласие на обработку данных',
@ -111,6 +113,7 @@ return [
'Hello' => 'Здравствуйте', 'Hello' => 'Здравствуйте',
'Here you can download your personal data in a comma separated values format.' => 'Здесь вы можете загрузить свои персональные данные в формате значений, разделенных запятыми.', 'Here you can download your personal data in a comma separated values format.' => 'Здесь вы можете загрузить свои персональные данные в формате значений, разделенных запятыми.',
'I agree processing of my personal data and the use of cookies to facilitate the operation of this site. For more information read our {privacyPolicy}' => 'Я соглашаюсь на обработку моих персональных данных и использование файлов cookie для облегчения работы этого сайта. Для получения дополнительной информации ознакомьтесь с нашей {privacyPolicy}', 'I agree processing of my personal data and the use of cookies to facilitate the operation of this site. For more information read our {privacyPolicy}' => 'Я соглашаюсь на обработку моих персональных данных и использование файлов cookie для облегчения работы этого сайта. Для получения дополнительной информации ознакомьтесь с нашей {privacyPolicy}',
'IP' => 'IP',
'If you already registered, sign in and connect this account on settings page' => 'Если вы уже зарегистрированы, войдите и подключите аккаунт в настройках', 'If you already registered, sign in and connect this account on settings page' => 'Если вы уже зарегистрированы, войдите и подключите аккаунт в настройках',
'If you cannot click the link, please try pasting the text into your browser' => 'Если вы не можете нажать на ссылку, скопируйте её и вставьте в адресную строку вашего браузера', 'If you cannot click the link, please try pasting the text into your browser' => 'Если вы не можете нажать на ссылку, скопируйте её и вставьте в адресную строку вашего браузера',
'If you did not make this request you can ignore this email' => 'Если вы получили это сообщение по ошибке, просто проигнорируйте или удалите его', 'If you did not make this request you can ignore this email' => 'Если вы получили это сообщение по ошибке, просто проигнорируйте или удалите его',
@ -118,6 +121,7 @@ return [
'In order to complete your registration, please click the link below' => 'Чтобы активировать свой аккаунт, пожалуйста, нажмите на ссылку ниже', 'In order to complete your registration, please click the link below' => 'Чтобы активировать свой аккаунт, пожалуйста, нажмите на ссылку ниже',
'In order to complete your request, please click the link below' => 'Чтобы завершить запрос, нажмите на ссылку ниже', 'In order to complete your request, please click the link below' => 'Чтобы завершить запрос, нажмите на ссылку ниже',
'In order to finish your registration, we need you to enter following fields' => 'Чтобы закончить регистрацию, заполните следующие поля', 'In order to finish your registration, we need you to enter following fields' => 'Чтобы закончить регистрацию, заполните следующие поля',
'Inactive' => 'Не активно',
'Information' => 'Информация', 'Information' => 'Информация',
'Invalid login or password' => 'Неправильный логин или пароль', 'Invalid login or password' => 'Неправильный логин или пароль',
'Invalid or expired link' => 'Ссылка неправильна или устарела', 'Invalid or expired link' => 'Ссылка неправильна или устарела',
@ -127,6 +131,7 @@ return [
'It will be deleted forever' => 'Он будет удалён навсегда', 'It will be deleted forever' => 'Он будет удалён навсегда',
'Items' => 'Элементы', 'Items' => 'Элементы',
'Joined on {0, date}' => 'Зарегистрирован {0, date}', 'Joined on {0, date}' => 'Зарегистрирован {0, date}',
'Last activity' => 'Последняя активность',
'Last login IP' => 'IP последнего входа', 'Last login IP' => 'IP последнего входа',
'Last login time' => 'Время последнего входа', 'Last login time' => 'Время последнего входа',
'Last password change' => 'Последняя смена пароля', 'Last password change' => 'Последняя смена пароля',
@ -185,10 +190,15 @@ return [
'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => 'Просканируйте QR-код приложением Google Authenticator App, затем вставьте временный код в поле и отправьте.', 'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => 'Просканируйте QR-код приложением Google Authenticator App, затем вставьте временный код в поле и отправьте.',
'Select rule...' => 'Выберите правило...', 'Select rule...' => 'Выберите правило...',
'Send password recovery email' => 'Отправить письмо с восстановлением пароля', 'Send password recovery email' => 'Отправить письмо с восстановлением пароля',
'Session ID' => 'ID сесии',
'Session history' => 'История сессий',
'Sign in' => 'Войти', 'Sign in' => 'Войти',
'Sign up' => 'Зарегистрироваться', 'Sign up' => 'Зарегистрироваться',
'Something went wrong' => 'Что-то пошло не так', 'Something went wrong' => 'Что-то пошло не так',
'Status' => 'Статус',
'Submit' => 'Подтвердить',
'Switch identities is disabled.' => 'Переключение на другой аккаунт отключено.', 'Switch identities is disabled.' => 'Переключение на другой аккаунт отключено.',
'Terminate all sessions' => 'Прекратить другие сеансы',
'Thank you for signing up on {0}' => 'Спасибо за регистрацию на сайте {0}', 'Thank you for signing up on {0}' => 'Спасибо за регистрацию на сайте {0}',
'Thank you, registration is now complete.' => 'Поздравляем, регистрация успешно завершена!', 'Thank you, registration is now complete.' => 'Поздравляем, регистрация успешно завершена!',
'The "recaptcha" component must be configured.' => 'Необходимо настроить компонент "recaptcha"', 'The "recaptcha" component must be configured.' => 'Необходимо настроить компонент "recaptcha"',
@ -229,7 +239,9 @@ return [
'Update rule' => 'Изменить правило', 'Update rule' => 'Изменить правило',
'Update user account' => 'Обновить аккаунт пользователя', 'Update user account' => 'Обновить аккаунт пользователя',
'Updated at' => 'Дата редактирования', 'Updated at' => 'Дата редактирования',
'User ID' => 'ID пользователя',
'User account could not be created.' => 'Не удалось создать аккаунт для пользователя.', 'User account could not be created.' => 'Не удалось создать аккаунт для пользователя.',
'User agent' => 'User agent',
'User block status has been updated.' => 'Статус блокировки пользователя обновлён.', 'User block status has been updated.' => 'Статус блокировки пользователя обновлён.',
'User could not be registered.' => 'Не удалось зарегистрировать пользователя.', 'User could not be registered.' => 'Не удалось зарегистрировать пользователя.',
'User has been confirmed' => 'Пользователь был активирован', 'User has been confirmed' => 'Пользователь был активирован',
@ -265,6 +277,7 @@ return [
'Your account on {0} has been created' => 'Ваш аккаунт на сайте "{0}" был успешно создан', 'Your account on {0} has been created' => 'Ваш аккаунт на сайте "{0}" был успешно создан',
'Your confirmation token is invalid or expired' => 'Ваша ссылка устарела или является ошибочной', 'Your confirmation token is invalid or expired' => 'Ваша ссылка устарела или является ошибочной',
'Your consent is required to register' => 'Ваше согласие требуется для регистрации', 'Your consent is required to register' => 'Ваше согласие требуется для регистрации',
'Your consent is required to work with this site' => 'Ваше согласие требуется для работы с этим сайтом',
'Your email address has been changed' => 'Ваш email был успешно изменён', 'Your email address has been changed' => 'Ваш email был успешно изменён',
'Your password has expired, you must change it now' => 'Срок действия вашего пароля истек, сейчас вы должны изменить его', 'Your password has expired, you must change it now' => 'Срок действия вашего пароля истек, сейчас вы должны изменить его',
'Your personal information has been removed' => 'Ваша персональная информация удалена', 'Your personal information has been removed' => 'Ваша персональная информация удалена',
@ -275,17 +288,22 @@ return [
'{0} cannot be blank.' => '{0} не может быть пустым.', '{0} cannot be blank.' => '{0} не может быть пустым.',
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '', 'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'Data privacy' => '', 'Data privacy' => '',
'If you haven\'t received a password, you can reset it at' => '',
'Submit' => '', 'Submit' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '', 'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}' => '',
'Your consent is required to work with this site' => '', 'Your consent is required to work with this site' => '',
'Your role requires 2FA, you won\'t be able to use the application until you enable it' => '',
'A message has been sent to your email address. ' => '@@Сообщение было отправлено на вашу электронную почту@@', 'A message has been sent to your email address. ' => '@@Сообщение было отправлено на вашу электронную почту@@',
'An email has been sent with instructions for resetting your password' => '@@Вам отправлено письмо с инструкциями по смене пароля@@', 'An email has been sent with instructions for resetting your password' => '@@Вам отправлено письмо с инструкциями по смене пароля@@',
'Awesome, almost there. ' => '@@Замечательно, почти готово!@@', 'Awesome, almost there. ' => '@@Замечательно, почти готово!@@',
'Class "{0}" does not exist' => '@@Класс "{0}" не найден@@', 'Class "{0}" does not exist' => '@@Класс "{0}" не найден@@',
'Disable Two-Factor Auth' => '@@Отключить двухфакторную авторизацию@@', 'Disable Two-Factor Auth' => '@@Отключить двухфакторную авторизацию@@',
'Enable Two-factor auth' => '@@Включить двухфакторную авторизацию@@', 'Enable Two-factor auth' => '@@Включить двухфакторную авторизацию@@',
'Every user having your role has two factor authentication mandatory, you must enable it' => '@@@@',
'Invalid two-factor code' => '@@Неверный код двухфакторной авторизации@@', 'Invalid two-factor code' => '@@Неверный код двухфакторной авторизации@@',
'Last login' => '@@Последний вход@@', 'Last login' => '@@Последний вход@@',
'Now you can resume the login process' => '@@@@',
'Registration ip' => '@@IP при регистрации@@', 'Registration ip' => '@@IP при регистрации@@',
'Rule class can not be instantiated' => '@@Класс правила не может быть создан@@', 'Rule class can not be instantiated' => '@@Класс правила не может быть создан@@',
'Rule class must extend "yii\\rbac\\Rule"' => '@@Класс правила должен наследоваться от "yii\\rbac\\Rule"@@', 'Rule class must extend "yii\\rbac\\Rule"' => '@@Класс правила должен наследоваться от "yii\\rbac\\Rule"@@',

View File

@ -28,6 +28,7 @@ return [
'Account details' => '', 'Account details' => '',
'Account details have been updated' => '', 'Account details have been updated' => '',
'Account settings' => '', 'Account settings' => '',
'Active' => '',
'Already registered? Sign in!' => '', 'Already registered? Sign in!' => '',
'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '', 'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '',
'An error occurred processing your request' => '', 'An error occurred processing your request' => '',
@ -81,6 +82,7 @@ return [
'Create new rule' => '', 'Create new rule' => '',
'Created at' => '', 'Created at' => '',
'Credentials will be sent to the user by email' => '', 'Credentials will be sent to the user by email' => '',
'Current' => '',
'Current password' => '', 'Current password' => '',
'Current password is not valid' => '', 'Current password is not valid' => '',
'Data privacy' => '', 'Data privacy' => '',
@ -112,13 +114,17 @@ return [
'Gravatar email' => '', 'Gravatar email' => '',
'Hello' => '', 'Hello' => '',
'Here you can download your personal data in a comma separated values format.' => '', 'Here you can download your personal data in a comma separated values format.' => '',
'IP' => '',
'I agree processing of my personal data and the use of cookies to facilitate the operation of this site. For more information read our {privacyPolicy}' => '',
'If you already registered, sign in and connect this account on settings page' => '', 'If you already registered, sign in and connect this account on settings page' => '',
'If you cannot click the link, please try pasting the text into your browser' => '', 'If you cannot click the link, please try pasting the text into your browser' => '',
'If you did not make this request you can ignore this email' => '', 'If you did not make this request you can ignore this email' => '',
'If you haven\'t received a password, you can reset it at' => '',
'Impersonate this user' => '', 'Impersonate this user' => '',
'In order to complete your registration, please click the link below' => '', 'In order to complete your registration, please click the link below' => '',
'In order to complete your request, please click the link below' => '', 'In order to complete your request, please click the link below' => '',
'In order to finish your registration, we need you to enter following fields' => '', 'In order to finish your registration, we need you to enter following fields' => '',
'Inactive' => '',
'Information' => '', 'Information' => '',
'Invalid login or password' => '', 'Invalid login or password' => '',
'Invalid or expired link' => '', 'Invalid or expired link' => '',
@ -128,6 +134,7 @@ return [
'It will be deleted forever' => '', 'It will be deleted forever' => '',
'Items' => '', 'Items' => '',
'Joined on {0, date}' => '', 'Joined on {0, date}' => '',
'Last activity' => '',
'Last login IP' => '', 'Last login IP' => '',
'Last login time' => '', 'Last login time' => '',
'Last password change' => '', 'Last password change' => '',
@ -186,11 +193,15 @@ return [
'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => '', 'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => '',
'Select rule...' => '', 'Select rule...' => '',
'Send password recovery email' => '', 'Send password recovery email' => '',
'Session ID' => '',
'Session history' => '',
'Sign in' => '', 'Sign in' => '',
'Sign up' => '', 'Sign up' => '',
'Something went wrong' => '', 'Something went wrong' => '',
'Status' => '',
'Submit' => '', 'Submit' => '',
'Switch identities is disabled.' => '', 'Switch identities is disabled.' => '',
'Terminate all sessions' => '',
'Thank you for signing up on {0}' => '', 'Thank you for signing up on {0}' => '',
'Thank you, registration is now complete.' => '', 'Thank you, registration is now complete.' => '',
'The "recaptcha" component must be configured.' => '', 'The "recaptcha" component must be configured.' => '',
@ -232,7 +243,9 @@ return [
'Update rule' => '', 'Update rule' => '',
'Update user account' => '', 'Update user account' => '',
'Updated at' => '', 'Updated at' => '',
'User ID' => '',
'User account could not be created.' => '', 'User account could not be created.' => '',
'User agent' => '',
'User block status has been updated.' => '', 'User block status has been updated.' => '',
'User could not be registered.' => '', 'User could not be registered.' => '',
'User has been confirmed' => '', 'User has been confirmed' => '',
@ -258,6 +271,7 @@ return [
'You can connect multiple accounts to be able to log in using them' => '', 'You can connect multiple accounts to be able to log in using them' => '',
'You cannot remove your own account' => '', 'You cannot remove your own account' => '',
'You need to confirm your email address' => '', 'You need to confirm your email address' => '',
'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}' => '',
'Your account details have been updated' => '', 'Your account details have been updated' => '',
'Your account has been blocked' => '', 'Your account has been blocked' => '',
'Your account has been blocked.' => '', 'Your account has been blocked.' => '',
@ -273,6 +287,9 @@ return [
'Your password has expired, you must change it now' => '', 'Your password has expired, you must change it now' => '',
'Your personal information has been removed' => '', 'Your personal information has been removed' => '',
'Your profile has been updated' => '', 'Your profile has been updated' => '',
'Your role requires 2FA, you won\'t be able to use the application until you enable it' => '',
'privacy policy' => '',
'{0, date, MMM dd, YYYY HH:mm}' => '',
'{0, date, MMMM dd, YYYY HH:mm}' => '', '{0, date, MMMM dd, YYYY HH:mm}' => '',
'{0} cannot be blank.' => '', '{0} cannot be blank.' => '',
]; ];

View File

@ -28,6 +28,7 @@ return [
'Account details' => '', 'Account details' => '',
'Account details have been updated' => '', 'Account details have been updated' => '',
'Account settings' => '', 'Account settings' => '',
'Active' => '',
'Already registered? Sign in!' => '', 'Already registered? Sign in!' => '',
'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '', 'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '',
'An error occurred processing your request' => '', 'An error occurred processing your request' => '',
@ -81,6 +82,7 @@ return [
'Create new rule' => '', 'Create new rule' => '',
'Created at' => '', 'Created at' => '',
'Credentials will be sent to the user by email' => '', 'Credentials will be sent to the user by email' => '',
'Current' => '',
'Current password' => '', 'Current password' => '',
'Current password is not valid' => '', 'Current password is not valid' => '',
'Data privacy' => '', 'Data privacy' => '',
@ -112,13 +114,17 @@ return [
'Gravatar email' => '', 'Gravatar email' => '',
'Hello' => '', 'Hello' => '',
'Here you can download your personal data in a comma separated values format.' => '', 'Here you can download your personal data in a comma separated values format.' => '',
'I agree processing of my personal data and the use of cookies to facilitate the operation of this site. For more information read our {privacyPolicy}' => '',
'IP' => '',
'If you already registered, sign in and connect this account on settings page' => '', 'If you already registered, sign in and connect this account on settings page' => '',
'If you cannot click the link, please try pasting the text into your browser' => '', 'If you cannot click the link, please try pasting the text into your browser' => '',
'If you did not make this request you can ignore this email' => '', 'If you did not make this request you can ignore this email' => '',
'If you haven\'t received a password, you can reset it at' => '',
'Impersonate this user' => '', 'Impersonate this user' => '',
'In order to complete your registration, please click the link below' => '', 'In order to complete your registration, please click the link below' => '',
'In order to complete your request, please click the link below' => '', 'In order to complete your request, please click the link below' => '',
'In order to finish your registration, we need you to enter following fields' => '', 'In order to finish your registration, we need you to enter following fields' => '',
'Inactive' => '',
'Information' => '', 'Information' => '',
'Invalid login or password' => '', 'Invalid login or password' => '',
'Invalid or expired link' => '', 'Invalid or expired link' => '',
@ -128,6 +134,7 @@ return [
'It will be deleted forever' => '', 'It will be deleted forever' => '',
'Items' => '', 'Items' => '',
'Joined on {0, date}' => '', 'Joined on {0, date}' => '',
'Last activity' => '',
'Last login IP' => '', 'Last login IP' => '',
'Last login time' => '', 'Last login time' => '',
'Last password change' => '', 'Last password change' => '',
@ -186,11 +193,15 @@ return [
'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => '', 'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => '',
'Select rule...' => '', 'Select rule...' => '',
'Send password recovery email' => '', 'Send password recovery email' => '',
'Session ID' => '',
'Session history' => '',
'Sign in' => '', 'Sign in' => '',
'Sign up' => '', 'Sign up' => '',
'Something went wrong' => '', 'Something went wrong' => '',
'Status' => '',
'Submit' => '', 'Submit' => '',
'Switch identities is disabled.' => '', 'Switch identities is disabled.' => '',
'Terminate all sessions' => '',
'Thank you for signing up on {0}' => '', 'Thank you for signing up on {0}' => '',
'Thank you, registration is now complete.' => '', 'Thank you, registration is now complete.' => '',
'The "recaptcha" component must be configured.' => '', 'The "recaptcha" component must be configured.' => '',
@ -232,7 +243,9 @@ return [
'Update rule' => '', 'Update rule' => '',
'Update user account' => '', 'Update user account' => '',
'Updated at' => '', 'Updated at' => '',
'User ID' => '',
'User account could not be created.' => '', 'User account could not be created.' => '',
'User agent' => '',
'User block status has been updated.' => '', 'User block status has been updated.' => '',
'User could not be registered.' => '', 'User could not be registered.' => '',
'User has been confirmed' => '', 'User has been confirmed' => '',
@ -258,6 +271,7 @@ return [
'You can connect multiple accounts to be able to log in using them' => '', 'You can connect multiple accounts to be able to log in using them' => '',
'You cannot remove your own account' => '', 'You cannot remove your own account' => '',
'You need to confirm your email address' => '', 'You need to confirm your email address' => '',
'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}' => '',
'Your account details have been updated' => '', 'Your account details have been updated' => '',
'Your account has been blocked' => '', 'Your account has been blocked' => '',
'Your account has been blocked.' => '', 'Your account has been blocked.' => '',
@ -273,6 +287,9 @@ return [
'Your password has expired, you must change it now' => '', 'Your password has expired, you must change it now' => '',
'Your personal information has been removed' => '', 'Your personal information has been removed' => '',
'Your profile has been updated' => '', 'Your profile has been updated' => '',
'Your role requires 2FA, you won\'t be able to use the application until you enable it' => '',
'privacy policy' => '',
'{0, date, MMM dd, YYYY HH:mm}' => '',
'{0, date, MMMM dd, YYYY HH:mm}' => '', '{0, date, MMMM dd, YYYY HH:mm}' => '',
'{0} cannot be blank.' => '', '{0} cannot be blank.' => '',
]; ];

View File

@ -273,33 +273,21 @@ return [
'{0, date, MMMM dd, YYYY HH:mm}' => '{0, date, MMMM dd, YYYY HH:mm}', '{0, date, MMMM dd, YYYY HH:mm}' => '{0, date, MMMM dd, YYYY HH:mm}',
'{0} cannot be blank.' => '{0} не може бути порожнім.', '{0} cannot be blank.' => '{0} не може бути порожнім.',
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '', 'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'Active' => '',
'Current' => '',
'Data privacy' => '', 'Data privacy' => '',
'IP' => '',
'Inactive' => '',
'Last activity' => '',
'Recovery message sent' => '', 'Recovery message sent' => '',
'Session ID' => '',
'Session history' => '',
'Status' => '',
'Submit' => '', 'Submit' => '',
'Terminate all sessions' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '', 'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'User ID' => '',
'User agent' => '',
'Your consent is required to work with this site' => '', 'Your consent is required to work with this site' => '',
'A message has been sent to your email address. ' => '@@На вашу електронну адресу надіслано повідомлення@@', 'Your role requires 2FA, you won\'t be able to use the application until you enable it' => '',
'An email has been sent with instructions for resetting your password' => '@@Лист з інструкціями по зміні пароля надіслано на електронну адресу@@',
'Awesome, almost there. ' => '@@Чудово, майже все.@@',
'Class "{0}" does not exist' => '@@Клас "{0}" не існує@@',
'Disable Two-Factor Auth' => '@@Вимкнути двофакторну аутентифікацію@@',
'Enable Two-factor auth' => '@@Увімкнути двофакторну аутентифікацію@@',
'I aggree processing of my personal data and the use of cookies to facilitate the operation of this site. For more information read our {privacyPolicy}' => '@@Я даю згоду на обробку моїх персональних даних та на використання cookie даним сайтом. Для більш детальної інформації ознайомтесь з {privacyPolicy}@@',
'Invalid two-factor code' => '@@Невірний код двофакторної авторизації@@',
'Last login' => '@@Останній вхід@@',
'Registration ip' => '@@IP реєстрації@@',
'Rule class can not be instantiated' => '@@Клас Правила не може бути ініційований@@',
'Rule class must extend "yii\\rbac\\Rule"' => '@@Клас Правила має розширювати "yii\\rbac\\Rule"@@',
'This will disable two-factor auth. Are you sure?' => '@@Це вимкне двофакторну аутентифікацію. Ви впевнені?@@',
'Two Factor Authentication' => '@@Двофакторна аутентифікація@@',
'Two factor authentication protects you against stolen credentials' => '@@Двофакторна аутентифікація дає Вам додатковий захист даних авторизації@@',
'Two factor successfully enabled.' => '@@Двофакторна аутентифікація успішно підключена@@',
'Two-Factor Authentication' => '@@Двофакторна аутентифікація@@',
'Two-factor auth protects you against stolen credentials' => '@@Двофакторна аутентифікація дає Вам додатковий захист даних авторизації@@',
'Two-factor authentication code' => '@@Код двофакторної аутентифікації@@',
'Two-factor authorization has been disabled.' => '@@Двофакторна аутентифікація відключена@@',
'Two-factor code' => '@@Двофакторний код@@',
'Unable to disable two-factor authorization.' => '@@Неможливо відключити двофакторну авторизацію.@@',
'We couldn\'t re-send the mail to confirm your address. ' => '@@Ми не змогли надіслати email для підтвердження Вашої електронної адреси.@@',
'We have sent confirmation links to both old and new email addresses. ' => '@@Ми надіслали повідомлення з підтверджуючими посиланнями на обидві Ваші електронні адреси: стару і нову.@@',
]; ];

View File

@ -28,6 +28,7 @@ return [
'Account details' => '', 'Account details' => '',
'Account details have been updated' => '', 'Account details have been updated' => '',
'Account settings' => '', 'Account settings' => '',
'Active' => '',
'Already registered? Sign in!' => '', 'Already registered? Sign in!' => '',
'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '', 'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '',
'An error occurred processing your request' => '', 'An error occurred processing your request' => '',
@ -81,6 +82,7 @@ return [
'Create new rule' => '', 'Create new rule' => '',
'Created at' => '', 'Created at' => '',
'Credentials will be sent to the user by email' => '', 'Credentials will be sent to the user by email' => '',
'Current' => '',
'Current password' => '', 'Current password' => '',
'Current password is not valid' => '', 'Current password is not valid' => '',
'Data privacy' => '', 'Data privacy' => '',
@ -112,13 +114,17 @@ return [
'Gravatar email' => '', 'Gravatar email' => '',
'Hello' => '', 'Hello' => '',
'Here you can download your personal data in a comma separated values format.' => '', 'Here you can download your personal data in a comma separated values format.' => '',
'I agree processing of my personal data and the use of cookies to facilitate the operation of this site. For more information read our {privacyPolicy}' => '',
'IP' => '',
'If you already registered, sign in and connect this account on settings page' => '', 'If you already registered, sign in and connect this account on settings page' => '',
'If you cannot click the link, please try pasting the text into your browser' => '', 'If you cannot click the link, please try pasting the text into your browser' => '',
'If you did not make this request you can ignore this email' => '', 'If you did not make this request you can ignore this email' => '',
'If you haven\'t received a password, you can reset it at' => '',
'Impersonate this user' => '', 'Impersonate this user' => '',
'In order to complete your registration, please click the link below' => '', 'In order to complete your registration, please click the link below' => '',
'In order to complete your request, please click the link below' => '', 'In order to complete your request, please click the link below' => '',
'In order to finish your registration, we need you to enter following fields' => '', 'In order to finish your registration, we need you to enter following fields' => '',
'Inactive' => '',
'Information' => '', 'Information' => '',
'Invalid login or password' => '', 'Invalid login or password' => '',
'Invalid or expired link' => '', 'Invalid or expired link' => '',
@ -128,6 +134,7 @@ return [
'It will be deleted forever' => '', 'It will be deleted forever' => '',
'Items' => '', 'Items' => '',
'Joined on {0, date}' => '', 'Joined on {0, date}' => '',
'Last activity' => '',
'Last login IP' => '', 'Last login IP' => '',
'Last login time' => '', 'Last login time' => '',
'Last password change' => '', 'Last password change' => '',
@ -186,11 +193,15 @@ return [
'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => '', 'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => '',
'Select rule...' => '', 'Select rule...' => '',
'Send password recovery email' => '', 'Send password recovery email' => '',
'Session ID' => '',
'Session history' => '',
'Sign in' => '', 'Sign in' => '',
'Sign up' => '', 'Sign up' => '',
'Something went wrong' => '', 'Something went wrong' => '',
'Status' => '',
'Submit' => '', 'Submit' => '',
'Switch identities is disabled.' => '', 'Switch identities is disabled.' => '',
'Terminate all sessions' => '',
'Thank you for signing up on {0}' => '', 'Thank you for signing up on {0}' => '',
'Thank you, registration is now complete.' => '', 'Thank you, registration is now complete.' => '',
'The "recaptcha" component must be configured.' => '', 'The "recaptcha" component must be configured.' => '',
@ -232,7 +243,9 @@ return [
'Update rule' => '', 'Update rule' => '',
'Update user account' => '', 'Update user account' => '',
'Updated at' => '', 'Updated at' => '',
'User ID' => '',
'User account could not be created.' => '', 'User account could not be created.' => '',
'User agent' => '',
'User block status has been updated.' => '', 'User block status has been updated.' => '',
'User could not be registered.' => '', 'User could not be registered.' => '',
'User has been confirmed' => '', 'User has been confirmed' => '',
@ -258,6 +271,7 @@ return [
'You can connect multiple accounts to be able to log in using them' => '', 'You can connect multiple accounts to be able to log in using them' => '',
'You cannot remove your own account' => '', 'You cannot remove your own account' => '',
'You need to confirm your email address' => '', 'You need to confirm your email address' => '',
'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}' => '',
'Your account details have been updated' => '', 'Your account details have been updated' => '',
'Your account has been blocked' => '', 'Your account has been blocked' => '',
'Your account has been blocked.' => '', 'Your account has been blocked.' => '',
@ -273,6 +287,9 @@ return [
'Your password has expired, you must change it now' => '', 'Your password has expired, you must change it now' => '',
'Your personal information has been removed' => '', 'Your personal information has been removed' => '',
'Your profile has been updated' => '', 'Your profile has been updated' => '',
'Your role requires 2FA, you won\'t be able to use the application until you enable it' => '',
'privacy policy' => '',
'{0, date, MMM dd, YYYY HH:mm}' => '',
'{0, date, MMMM dd, YYYY HH:mm}' => '', '{0, date, MMMM dd, YYYY HH:mm}' => '',
'{0} cannot be blank.' => '', '{0} cannot be blank.' => '',
]; ];

View File

@ -28,6 +28,7 @@ return [
'Account details' => '', 'Account details' => '',
'Account details have been updated' => '', 'Account details have been updated' => '',
'Account settings' => '', 'Account settings' => '',
'Active' => '',
'Already registered? Sign in!' => '', 'Already registered? Sign in!' => '',
'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '', 'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '',
'An error occurred processing your request' => '', 'An error occurred processing your request' => '',
@ -81,6 +82,7 @@ return [
'Create new rule' => '', 'Create new rule' => '',
'Created at' => '', 'Created at' => '',
'Credentials will be sent to the user by email' => '', 'Credentials will be sent to the user by email' => '',
'Current' => '',
'Current password' => '', 'Current password' => '',
'Current password is not valid' => '', 'Current password is not valid' => '',
'Data privacy' => '', 'Data privacy' => '',
@ -112,13 +114,17 @@ return [
'Gravatar email' => '', 'Gravatar email' => '',
'Hello' => '', 'Hello' => '',
'Here you can download your personal data in a comma separated values format.' => '', 'Here you can download your personal data in a comma separated values format.' => '',
'I agree processing of my personal data and the use of cookies to facilitate the operation of this site. For more information read our {privacyPolicy}' => '',
'IP' => '',
'If you already registered, sign in and connect this account on settings page' => '', 'If you already registered, sign in and connect this account on settings page' => '',
'If you cannot click the link, please try pasting the text into your browser' => '', 'If you cannot click the link, please try pasting the text into your browser' => '',
'If you did not make this request you can ignore this email' => '', 'If you did not make this request you can ignore this email' => '',
'If you haven\'t received a password, you can reset it at' => '',
'Impersonate this user' => '', 'Impersonate this user' => '',
'In order to complete your registration, please click the link below' => '', 'In order to complete your registration, please click the link below' => '',
'In order to complete your request, please click the link below' => '', 'In order to complete your request, please click the link below' => '',
'In order to finish your registration, we need you to enter following fields' => '', 'In order to finish your registration, we need you to enter following fields' => '',
'Inactive' => '',
'Information' => '', 'Information' => '',
'Invalid login or password' => '', 'Invalid login or password' => '',
'Invalid or expired link' => '', 'Invalid or expired link' => '',
@ -128,6 +134,7 @@ return [
'It will be deleted forever' => '', 'It will be deleted forever' => '',
'Items' => '', 'Items' => '',
'Joined on {0, date}' => '', 'Joined on {0, date}' => '',
'Last activity' => '',
'Last login IP' => '', 'Last login IP' => '',
'Last login time' => '', 'Last login time' => '',
'Last password change' => '', 'Last password change' => '',
@ -186,11 +193,15 @@ return [
'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => '', 'Scan the QrCode with Google Authenticator App, then insert its temporary code on the box and submit.' => '',
'Select rule...' => '', 'Select rule...' => '',
'Send password recovery email' => '', 'Send password recovery email' => '',
'Session ID' => '',
'Session history' => '',
'Sign in' => '', 'Sign in' => '',
'Sign up' => '', 'Sign up' => '',
'Something went wrong' => '', 'Something went wrong' => '',
'Status' => '',
'Submit' => '', 'Submit' => '',
'Switch identities is disabled.' => '', 'Switch identities is disabled.' => '',
'Terminate all sessions' => '',
'Thank you for signing up on {0}' => '', 'Thank you for signing up on {0}' => '',
'Thank you, registration is now complete.' => '', 'Thank you, registration is now complete.' => '',
'The "recaptcha" component must be configured.' => '', 'The "recaptcha" component must be configured.' => '',
@ -232,7 +243,9 @@ return [
'Update rule' => '', 'Update rule' => '',
'Update user account' => '', 'Update user account' => '',
'Updated at' => '', 'Updated at' => '',
'User ID' => '',
'User account could not be created.' => '', 'User account could not be created.' => '',
'User agent' => '',
'User block status has been updated.' => '', 'User block status has been updated.' => '',
'User could not be registered.' => '', 'User could not be registered.' => '',
'User has been confirmed' => '', 'User has been confirmed' => '',
@ -258,6 +271,7 @@ return [
'You can connect multiple accounts to be able to log in using them' => '', 'You can connect multiple accounts to be able to log in using them' => '',
'You cannot remove your own account' => '', 'You cannot remove your own account' => '',
'You need to confirm your email address' => '', 'You need to confirm your email address' => '',
'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}' => '',
'Your account details have been updated' => '', 'Your account details have been updated' => '',
'Your account has been blocked' => '', 'Your account has been blocked' => '',
'Your account has been blocked.' => '', 'Your account has been blocked.' => '',
@ -273,6 +287,9 @@ return [
'Your password has expired, you must change it now' => '', 'Your password has expired, you must change it now' => '',
'Your personal information has been removed' => '', 'Your personal information has been removed' => '',
'Your profile has been updated' => '', 'Your profile has been updated' => '',
'Your role requires 2FA, you won\'t be able to use the application until you enable it' => '',
'privacy policy' => '',
'{0, date, MMM dd, YYYY HH:mm}' => '',
'{0, date, MMMM dd, YYYY HH:mm}' => '', '{0, date, MMMM dd, YYYY HH:mm}' => '',
'{0} cannot be blank.' => '', '{0} cannot be blank.' => '',
]; ];

View File

@ -12,8 +12,8 @@
use yii\bootstrap\ActiveForm; use yii\bootstrap\ActiveForm;
use yii\helpers\Html; use yii\helpers\Html;
/* @var yii\web\View $this */ /** @var yii\web\View $this */
/* @var Da\User\Model\User $user */ /** @var Da\User\Model\User $user */
?> ?>

View File

@ -11,9 +11,9 @@
use Da\User\Widget\AssignmentsWidget; use Da\User\Widget\AssignmentsWidget;
/* @var yii\web\View $this */ /** @var yii\web\View $this */
/* @var Da\User\Model\User $user */ /** @var Da\User\Model\User $user */
/* @var string[] $params */ /** @var string[] $params */
?> ?>

View File

@ -9,10 +9,9 @@
* the LICENSE file that was distributed with this source code. * the LICENSE file that was distributed with this source code.
*/ */
/** /** @var yii\web\View $this */
* @var yii\web\View /** @var Da\User\Model\User $user */
* @var \Da\User\Model\User $user
*/
?> ?>
<?php $this->beginContent('@Da/User/resources/views/admin/update.php', ['user' => $user]) ?> <?php $this->beginContent('@Da/User/resources/views/admin/update.php', ['user' => $user]) ?>

View File

@ -0,0 +1,68 @@
<?php
/*
* This file is part of the 2amigos/yii2-usuario project.
*
* (c) 2amigOS! <http://2amigos.us/>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
use Da\User\Widget\SessionStatusWidget;
use yii\helpers\Html;
use yii\grid\GridView;
use yii\widgets\Pjax;
use Da\User\Model\SessionHistory;
use Da\User\Search\SessionHistorySearch;
use yii\web\View;
use yii\data\ActiveDataProvider;
/**
* @var $this View
* @var $searchModel SessionHistorySearch
* @var $dataProvider ActiveDataProvider
*/
?>
<?php $this->beginContent('@Da/User/resources/views/admin/update.php', ['user' => $user]) ?>
<div class="row">
<div class="col-xs-12">
<?= Html::a(
Yii::t('usuario', 'Terminate all sessions'),
['/user/admin/terminate-sessions', 'id' => $user->id],
[
'class' => 'btn btn-danger btn-xs pull-right',
'data-method' => 'post'
]
) ?>
</div>
</div>
<hr>
<?php Pjax::begin(); ?>
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
'user_agent',
'ip',
[
'contentOptions' => [
'class' => 'text-nowrap',
],
'label' => Yii::t('usuario', 'Status'),
'value' => function (SessionHistory $model) {
return SessionStatusWidget::widget(['model' => $model]);
},
],
[
'attribute' => 'updated_at',
'format' => 'datetime'
],
],
]); ?>
<?php Pjax::end(); ?>
<?php $this->endContent() ?>

View File

@ -10,8 +10,8 @@
*/ */
/** /**
* @var yii\widgets\ActiveForm * @var yii\widgets\ActiveForm $form
* @var \Da\User\Model\User $user * @var \Da\User\Model\User $user
*/ */
?> ?>

View File

@ -15,10 +15,10 @@ use yii\web\View;
use yii\widgets\Pjax; use yii\widgets\Pjax;
/** /**
* @var $this yii\web\View * @var yii\web\View $this
* @var $dataProvider yii\data\ActiveDataProvider * @var yii\data\ActiveDataProvider $dataProvider
* @var $searchModel Da\User\Search\UserSearch * @var Da\User\Search\UserSearch $searchModel
* @var $module Da\User\Module * @var Da\User\Module $module
*/ */
$this->title = Yii::t('usuario', 'Manage users'); $this->title = Yii::t('usuario', 'Manage users');

10
src/User/resources/views/admin/update.php Normal file → Executable file
View File

@ -13,6 +13,7 @@ use Da\User\Model\User;
use yii\bootstrap\Nav; use yii\bootstrap\Nav;
use yii\helpers\Html; use yii\helpers\Html;
use yii\web\View; use yii\web\View;
use Da\User\Module as UserModule;
/** /**
* @var View $this * @var View $this
@ -24,12 +25,14 @@ $this->title = Yii::t('usuario', 'Update user account');
$this->params['breadcrumbs'][] = ['label' => Yii::t('usuario', 'Users'), 'url' => ['index']]; $this->params['breadcrumbs'][] = ['label' => Yii::t('usuario', 'Users'), 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title; $this->params['breadcrumbs'][] = $this->title;
/** @var UserModule $module */
$module = Yii::$app->getModule('user');
?> ?>
<div class="clearfix"></div> <div class="clearfix"></div>
<?= $this->render( <?= $this->render(
'/shared/_alert', '/shared/_alert',
[ [
'module' => Yii::$app->getModule('user'), 'module' => $module,
] ]
) ?> ) ?>
@ -67,6 +70,11 @@ $this->params['breadcrumbs'][] = $this->title;
'label' => Yii::t('usuario', 'Assignments'), 'label' => Yii::t('usuario', 'Assignments'),
'url' => ['/user/admin/assignments', 'id' => $user->id], 'url' => ['/user/admin/assignments', 'id' => $user->id],
], ],
[
'label' => Yii::t('usuario', 'Session history'),
'url' => ['/user/admin/session-history', 'id' => $user->id],
'visible' => $module->enableSessionHistory,
],
'<hr>', '<hr>',
[ [
'label' => Yii::t('usuario', 'Confirm'), 'label' => Yii::t('usuario', 'Confirm'),

View File

@ -30,5 +30,5 @@ use yii\helpers\Html;
<?= Yii::t('usuario', 'If you cannot click the link, please try pasting the text into your browser') ?>. <?= Yii::t('usuario', 'If you cannot click the link, please try pasting the text into your browser') ?>.
</p> </p>
<p style="font-family: 'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.6; font-weight: normal; margin: 0 0 10px; padding: 0;"> <p style="font-family: 'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.6; font-weight: normal; margin: 0 0 10px; padding: 0;">
<?= Yii::t('usuario', 'If you did not make this request you can ignore this email') ?>. <?= Yii::t('usuario', 'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}', ['app_name' => Yii::$app->name]) ?>.
</p> </p>

View File

@ -10,8 +10,8 @@
*/ */
/** /**
* @var \yii\web\View * @var \yii\web\View $this
* @var yii\mail\BaseMessage $content * @var string $content
*/ */
?> ?>
<?php $this->beginPage() ?> <?php $this->beginPage() ?>

View File

@ -10,7 +10,9 @@
*/ */
/** /**
* @var string main view render result /**
* @var \yii\web\View $this
* @var string $content
*/ */
?> ?>

View File

@ -10,7 +10,6 @@
*/ */
/** /**
* @var \Da\User\Model\User
* @var \Da\User\Model\Token $token * @var \Da\User\Model\Token $token
*/ */
?> ?>
@ -23,4 +22,4 @@
<?= Yii::t('usuario', 'If you cannot click the link, please try pasting the text into your browser') ?>. <?= Yii::t('usuario', 'If you cannot click the link, please try pasting the text into your browser') ?>.
<?= Yii::t('usuario', 'If you did not make this request you can ignore this email') ?>. <?= Yii::t('usuario', 'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}', ['app_name' => Yii::$app->name]) ?>.

View File

@ -10,7 +10,7 @@
*/ */
/** /**
* @var \Da\User\Model\Token * @var \Da\User\Model\Token $token
*/ */
?> ?>
<?= Yii::t('usuario', 'Hello') ?>, <?= Yii::t('usuario', 'Hello') ?>,

View File

@ -10,7 +10,6 @@
*/ */
/** /**
* @var \Da\User\Model\User
* @var \Da\User\Model\Token $token * @var \Da\User\Model\Token $token
*/ */
?> ?>

View File

@ -10,10 +10,10 @@
*/ */
/** /**
* @var \Da\User\Model\User $user * @var \Da\User\Model\User $user
* @var \Da\User\Model\Token $token * @var \Da\User\Model\Token $token
* @var \Da\User\Module $module * @var \Da\User\Module $module
* @var bool $showPassword * @var bool $showPassword
*/ */
?> ?>
<?= Yii::t('usuario', 'Hello') ?>, <?= Yii::t('usuario', 'Hello') ?>,
@ -30,4 +30,4 @@
<?= Yii::t('usuario', 'If you cannot click the link, please try pasting the text into your browser') ?>. <?= Yii::t('usuario', 'If you cannot click the link, please try pasting the text into your browser') ?>.
<?php endif ?> <?php endif ?>
<?= Yii::t('usuario', 'If you did not make this request you can ignore this email') ?>. <?= Yii::t('usuario', 'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}', ['app_name' => Yii::$app->name]) ?>.

View File

@ -10,6 +10,7 @@
*/ */
use yii\helpers\Html; use yii\helpers\Html;
use yii\helpers\Url;
/** /**
* @var \Da\User\Module $module * @var \Da\User\Module $module
@ -28,6 +29,9 @@ use yii\helpers\Html;
<?php if ($showPassword || $module->generatePasswords): ?> <?php if ($showPassword || $module->generatePasswords): ?>
<?= Yii::t('usuario', 'We have generated a password for you') ?>: <strong><?= $user->password ?></strong> <?= Yii::t('usuario', 'We have generated a password for you') ?>: <strong><?= $user->password ?></strong>
<?php endif ?> <?php endif ?>
<?php if ($module->allowPasswordRecovery): ?>
<?= Yii::t('usuario', 'If you haven\'t received a password, you can reset it at') ?>: <strong><?= Html::a(Html::encode(Url::to(['/user/forgot'], true)), Url::to(['/user/forgot'], true)) ?></strong>
<?php endif ?>
</p> </p>
@ -44,5 +48,5 @@ use yii\helpers\Html;
<?php endif ?> <?php endif ?>
<p style="font-family: 'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.6; font-weight: normal; margin: 0 0 10px; padding: 0;"> <p style="font-family: 'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.6; font-weight: normal; margin: 0 0 10px; padding: 0;">
<?= Yii::t('usuario', 'If you did not make this request you can ignore this email') ?>. <?= Yii::t('usuario', 'You received this email because someone, possibly you or someone on your behalf, have created an account at {app_name}', ['app_name' => Yii::$app->name]) ?>.
</p> </p>

View File

@ -15,9 +15,9 @@ use yii\helpers\Html;
use yii\widgets\ActiveForm; use yii\widgets\ActiveForm;
/** /**
* @var $this yii\web\View * @var yii\web\View $this
* @var $model Da\User\Model\Permission * @var Da\User\Model\Permission $model
* @var $unassignedItems string[] * @var string[] $unassignedItems
*/ */
?> ?>

View File

@ -10,9 +10,9 @@
*/ */
/** /**
* @var \Da\User\Model\Permission * @var yii\web\View $this
* @var $this yii\web\View * @var Da\User\Model\Permission $model
* @var $unassignedItems string[] * @var string[] $unassignedItems
*/ */
$this->title = Yii::t('usuario', 'Create new permission'); $this->title = Yii::t('usuario', 'Create new permission');

View File

@ -10,9 +10,9 @@
*/ */
/** /**
* @var $dataProvider \yii\data\ActiveDataProvider * @var \yii\data\ActiveDataProvider $dataProvider
* @var $this yii\web\View * @var yii\web\View $this
* @var $searchModel \Da\User\Search\PermissionSearch * @var \Da\User\Search\PermissionSearch $searchModel
*/ */
use yii\grid\ActionColumn; use yii\grid\ActionColumn;
use yii\grid\GridView; use yii\grid\GridView;

View File

@ -10,9 +10,9 @@
*/ */
/** /**
* @var \Da\User\Model\Permission * @var yii\web\View $this
* @var $this yii\web\View * @var Da\User\Model\Permission $model
* @var $unassignedItems string[] * @var string[] $unassignedItems
*/ */
$this->title = Yii::t('usuario', 'Update permission'); $this->title = Yii::t('usuario', 'Update permission');
@ -31,4 +31,3 @@ $this->params['breadcrumbs'][] = $this->title;
) ?> ) ?>
<?php $this->endContent() ?> <?php $this->endContent() ?>

View File

@ -10,8 +10,8 @@
*/ */
/** /**
* @var $this yii\web\View * @var yii\web\View $this
* @var $model \Da\User\Model\Role * @var \Da\User\Model\Role $model
*/ */
use Da\User\Helper\AuthHelper; use Da\User\Helper\AuthHelper;

View File

@ -10,9 +10,9 @@
*/ */
/** /**
* @var \Da\User\Model\Role * @var yii\web\View $this
* @var $this yii\web\View * @var \Da\User\Model\Role $model
* @var $unassignedItems string[] * @var string[] $unassignedItems
*/ */
$this->title = Yii::t('usuario', 'Create new role'); $this->title = Yii::t('usuario', 'Create new role');
$this->params['breadcrumbs'][] = $this->title; $this->params['breadcrumbs'][] = $this->title;

View File

@ -14,9 +14,9 @@ use yii\grid\GridView;
use yii\helpers\Url; use yii\helpers\Url;
/** /**
* @var $dataProvider array * @var \yii\data\DataProviderInterface $dataProvider
* @var $searchModel \Da\User\Search\RoleSearch * @var \Da\User\Search\RoleSearch $searchModel
* @var $this yii\web\View * @var yii\web\View $this
*/ */
$this->title = Yii::t('usuario', 'Roles'); $this->title = Yii::t('usuario', 'Roles');

View File

@ -10,9 +10,9 @@
*/ */
/** /**
* @var yii\web\View $this
* @var \Da\User\Model\Role $model * @var \Da\User\Model\Role $model
* @var $this yii\web\View * @var string[] $unassignedItems
* @var $unassignedItems string[]
*/ */
$this->title = Yii::t('usuario', 'Update role'); $this->title = Yii::t('usuario', 'Update role');
$this->params['breadcrumbs'][] = $this->title; $this->params['breadcrumbs'][] = $this->title;

View File

@ -1,8 +1,8 @@
<?php <?php
/** /**
* @var $this yii\web\View * @var yii\web\View $this
* @var $model \Da\User\Model\Rule * @var \Da\User\Model\Rule $model
*/ */
use yii\helpers\Html; use yii\helpers\Html;

View File

@ -10,9 +10,9 @@
*/ */
/** /**
* @var yii\web\View $this
* @var \Da\User\Model\Rule $model * @var \Da\User\Model\Rule $model
* @var $this yii\web\View * @var string[] $unassignedItems
* @var $unassignedItems string[]
*/ */
$this->title = Yii::t('usuario', 'Create new rule'); $this->title = Yii::t('usuario', 'Create new rule');
$this->params['breadcrumbs'][] = $this->title; $this->params['breadcrumbs'][] = $this->title;

View File

@ -6,9 +6,9 @@ use yii\helpers\Url;
use yii\rbac\Rule; use yii\rbac\Rule;
/** /**
* @var $dataProvider \yii\data\ActiveDataProvider * @var \yii\data\ActiveDataProvider $dataProvider
* @var $searchModel \Da\User\Search\RuleSearch * @var \Da\User\Search\RuleSearch $searchModel
* @var $this yii\web\View * @var yii\web\View $this
*/ */
$this->title = Yii::t('usuario', 'Rules'); $this->title = Yii::t('usuario', 'Rules');

View File

@ -10,9 +10,9 @@
*/ */
/** /**
* @var yii\web\View $this
* @var \Da\User\Model\Rule $model * @var \Da\User\Model\Rule $model
* @var $this yii\web\View * @var string[] $unassignedItems
* @var $unassignedItems string[]
*/ */
$this->title = Yii::t('usuario', 'Update rule'); $this->title = Yii::t('usuario', 'Update rule');
$this->params['breadcrumbs'][] = ['label' => Yii::t('usuario', 'Rules'), 'url' => ['index']]; $this->params['breadcrumbs'][] = ['label' => Yii::t('usuario', 'Rules'), 'url' => ['index']];

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