From bcce2625a8cb0b630d945c6849014049869e10ce Mon Sep 17 00:00:00 2001 From: Igor Scheller Date: Tue, 27 Nov 2018 12:01:36 +0100 Subject: Implemented AuthController for login * Moved /login functionality to AuthController * Refactored password handling logic to use the Authenticator --- config/config.default.php | 9 +- config/routes.php | 2 + .../2018_10_01_000000_create_users_tables.php | 2 +- includes/controller/users_controller.php | 13 +- includes/pages/admin_user.php | 2 +- includes/pages/guest_login.php | 119 +- includes/pages/user_settings.php | 5 +- includes/sys_auth.php | 68 - includes/view/AngelTypes_view.php | 2 +- includes/view/User_view.php | 2 +- resources/lang/de_DE.UTF-8/LC_MESSAGES/default.po | 19 +- resources/lang/en_US.UTF-8/LC_MESSAGES/default.mo | Bin 0 -> 745 bytes resources/lang/en_US.UTF-8/LC_MESSAGES/default.po | 26 + resources/lang/pt_BR.UTF.8/LC_MESSAGES/default.mo | Bin 0 -> 41129 bytes resources/lang/pt_BR.UTF.8/LC_MESSAGES/default.po | 2645 +++++++++++++++++++ resources/lang/pt_BR.UTF.8/LC_MESSAGES/pt_BR.mo | Bin 41256 -> 0 bytes resources/lang/pt_BR.UTF.8/LC_MESSAGES/pt_BR.po | 2647 -------------------- resources/views/errors/405.twig | 5 + resources/views/macros/base.twig | 11 + resources/views/pages/login.twig | 104 + src/Controllers/AuthController.php | 90 +- src/Helpers/Authenticator.php | 93 +- src/Helpers/AuthenticatorServiceProvider.php | 4 + src/Middleware/LegacyMiddleware.php | 5 - tests/Unit/Controllers/AuthControllerTest.php | 132 +- .../Controllers/Stub/ControllerImplementation.php | 8 - .../Helpers/AuthenticatorServiceProviderTest.php | 9 + tests/Unit/Helpers/AuthenticatorTest.php | 125 +- .../Unit/Http/UrlGeneratorServiceProviderTest.php | 5 +- 29 files changed, 3249 insertions(+), 2903 deletions(-) create mode 100644 resources/lang/en_US.UTF-8/LC_MESSAGES/default.mo create mode 100644 resources/lang/en_US.UTF-8/LC_MESSAGES/default.po create mode 100644 resources/lang/pt_BR.UTF.8/LC_MESSAGES/default.mo create mode 100644 resources/lang/pt_BR.UTF.8/LC_MESSAGES/default.po delete mode 100644 resources/lang/pt_BR.UTF.8/LC_MESSAGES/pt_BR.mo delete mode 100644 resources/lang/pt_BR.UTF.8/LC_MESSAGES/pt_BR.po create mode 100644 resources/views/errors/405.twig create mode 100644 resources/views/macros/base.twig create mode 100644 resources/views/pages/login.twig diff --git a/config/config.default.php b/config/config.default.php index 693b0d19..9c9505c6 100644 --- a/config/config.default.php +++ b/config/config.default.php @@ -95,13 +95,10 @@ return [ // Number of hours that an angel has to sign out own shifts 'last_unsubscribe' => 3, - // Define the algorithm to use for `crypt()` of passwords + // Define the algorithm to use for `password_verify()` // If the user uses an old algorithm the password will be converted to the new format - // MD5 '$1' - // Blowfish '$2y$13' - // SHA-256 '$5$rounds=5000' - // SHA-512 '$6$rounds=5000' - 'crypt_alg' => '$6$rounds=5000', + // See https://secure.php.net/manual/en/password.constants.php for a complete list + 'password_algorithm' => PASSWORD_DEFAULT, // The minimum length for passwords 'min_password_length' => 8, diff --git a/config/routes.php b/config/routes.php index e999d026..02fd3abd 100644 --- a/config/routes.php +++ b/config/routes.php @@ -9,6 +9,8 @@ $route->get('/', 'HomeController@index'); $route->get('/credits', 'CreditsController@index'); // Authentication +$route->get('/login', 'AuthController@login'); +$route->post('/login', 'AuthController@postLogin'); $route->get('/logout', 'AuthController@logout'); // Stats diff --git a/db/migrations/2018_10_01_000000_create_users_tables.php b/db/migrations/2018_10_01_000000_create_users_tables.php index d8422ca0..52b3658f 100644 --- a/db/migrations/2018_10_01_000000_create_users_tables.php +++ b/db/migrations/2018_10_01_000000_create_users_tables.php @@ -28,7 +28,7 @@ class CreateUsersTables extends Migration $table->string('name', 24)->unique(); $table->string('email', 254)->unique(); - $table->string('password', 128); + $table->string('password', 255); $table->string('api_key', 32); $table->dateTime('last_login_at')->nullable(); diff --git a/includes/controller/users_controller.php b/includes/controller/users_controller.php index 7c6bde02..214998dc 100644 --- a/includes/controller/users_controller.php +++ b/includes/controller/users_controller.php @@ -47,6 +47,7 @@ function users_controller() function user_delete_controller() { $user = auth()->user(); + $auth = auth(); $request = request(); if ($request->has('user_id')) { @@ -68,14 +69,12 @@ function user_delete_controller() if ($request->hasPostData('submit')) { $valid = true; - if ( - !( + if (!( $request->has('password') - && verify_password($request->postData('password'), $user->password, $user->id) - ) - ) { + && $auth->verifyPassword($user, $request->postData('password')) + )) { $valid = false; - error(__('Your password is incorrect. Please try it again.')); + error(__('Your password is incorrect. Please try it again.')); } if ($valid) { @@ -341,7 +340,7 @@ function user_password_recovery_set_new_controller() } if ($valid) { - set_password($passwordReset->user->id, $request->postData('password')); + auth()->setPassword($passwordReset->user, $request->postData('password')); success(__('Password saved.')); $passwordReset->delete(); redirect(page_link_to('login')); diff --git a/includes/pages/admin_user.php b/includes/pages/admin_user.php index e6f94180..8482dea5 100644 --- a/includes/pages/admin_user.php +++ b/includes/pages/admin_user.php @@ -291,8 +291,8 @@ function admin_user() $request->postData('new_pw') != '' && $request->postData('new_pw') == $request->postData('new_pw2') ) { - set_password($user_id, $request->postData('new_pw')); $user_source = User::find($user_id); + auth()->setPassword($user_source, $request->postData('new_pw')); engelsystem_log('Set new password for ' . User_Nick_render($user_source, true)); $html .= success('Passwort neu gesetzt.', true); } else { diff --git a/includes/pages/guest_login.php b/includes/pages/guest_login.php index d152a092..3bc10fc3 100644 --- a/includes/pages/guest_login.php +++ b/includes/pages/guest_login.php @@ -8,14 +8,6 @@ use Engelsystem\Models\User\Settings; use Engelsystem\Models\User\State; use Engelsystem\Models\User\User; -/** - * @return string - */ -function login_title() -{ - return __('Login'); -} - /** * @return string */ @@ -226,7 +218,7 @@ function guest_register() // Assign user-group and set password DB::insert('INSERT INTO `UserGroups` (`uid`, `group_id`) VALUES (?, -20)', [$user->id]); - set_password($user->id, $request->postData('password')); + auth()->setPassword($user, $request->postData('password')); // Assign angel-types $user_angel_types_info = []; @@ -369,112 +361,3 @@ function entry_required() { return ''; } - -/** - * @return string - */ -function guest_login() -{ - $nick = ''; - $request = request(); - $session = session(); - $valid = true; - - $session->remove('uid'); - - if ($request->hasPostData('submit')) { - if ($request->has('nick') && !empty($request->input('nick'))) { - $nickValidation = User_validate_Nick($request->input('nick')); - $nick = $nickValidation->getValue(); - $login_user = User::whereName($nickValidation->getValue())->first(); - if ($login_user) { - if ($request->has('password')) { - if (!verify_password($request->postData('password'), $login_user->password, $login_user->id)) { - $valid = false; - error(__('Your password is incorrect. Please try it again.')); - } - } else { - $valid = false; - error(__('Please enter a password.')); - } - } else { - $valid = false; - error(__('No user was found with that Nickname. Please try again. If you are still having problems, ask a Dispatcher.')); - } - } else { - $valid = false; - error(__('Please enter a nickname.')); - } - - if ($valid && $login_user) { - $session->set('uid', $login_user->id); - $session->set('locale', $login_user->settings->language); - - redirect(page_link_to(config('home_site'))); - } - } - - return page([ - div('col-md-12', [ - div('row', [ - EventConfig_countdown_page() - ]), - div('row', [ - div('col-sm-6 col-sm-offset-3 col-md-4 col-md-offset-4', [ - div('panel panel-primary first', [ - div('panel-heading', [ - ' ' . __('Login') - ]), - div('panel-body', [ - msg(), - form([ - form_text_placeholder('nick', __('Nick'), $nick), - form_password_placeholder('password', __('Password')), - form_submit('submit', __('Login')), - !$valid ? buttons([ - button(page_link_to('user_password_recovery'), __('I forgot my password')) - ]) : '' - ]) - ]), - div('panel-footer', [ - glyph('info-sign') . __('Please note: You have to activate cookies!') - ]) - ]) - ]) - ]), - div('row', [ - div('col-sm-6 text-center', [ - heading(register_title(), 2), - get_register_hint() - ]), - div('col-sm-6 text-center', [ - heading(__('What can I do?'), 2), - '

' . __('Please read about the jobs you can do to help us.') . '

', - buttons([ - button( - page_link_to('angeltypes', ['action' => 'about']), - __('Teams/Job description') . ' »' - ) - ]) - ]) - ]) - ]) - ]); -} - -/** - * @return string - */ -function get_register_hint() -{ - if (auth()->can('register') && config('registration_enabled')) { - return join('', [ - '

' . __('Please sign up, if you want to help us!') . '

', - buttons([ - button(page_link_to('register'), register_title() . ' »') - ]) - ]); - } - - return error(__('Registration is disabled.'), true); -} diff --git a/includes/pages/user_settings.php b/includes/pages/user_settings.php index ae29e4d8..f6853191 100644 --- a/includes/pages/user_settings.php +++ b/includes/pages/user_settings.php @@ -101,9 +101,10 @@ function user_settings_main($user_source, $enable_tshirt_size, $tshirt_sizes) function user_settings_password($user_source) { $request = request(); + $auth = auth(); if ( !$request->has('password') - || !verify_password($request->postData('password'), $user_source->password, $user_source->id) + || !$auth->verifyPassword($user_source, $request->postData('password')) ) { error(__('-> not OK. Please try again.')); } elseif (strlen($request->postData('new_password')) < config('min_password_length')) { @@ -111,7 +112,7 @@ function user_settings_password($user_source) } elseif ($request->postData('new_password') != $request->postData('new_password2')) { error(__('Your passwords don\'t match.')); } else { - set_password($user_source->id, $request->postData('new_password')); + $auth->setPassword($user_source, $request->postData('new_password')); success(__('Password saved.')); } redirect(page_link_to('user_settings')); diff --git a/includes/sys_auth.php b/includes/sys_auth.php index 520b13eb..f0485495 100644 --- a/includes/sys_auth.php +++ b/includes/sys_auth.php @@ -1,74 +1,6 @@ password = crypt($password, config('crypt_alg') . '$' . generate_salt(16) . '$'); - $user->save(); -} - -/** - * verify a password given a precomputed salt. - * if $uid is given and $salt is an old-style salt (plain md5), we convert it automatically - * - * @param string $password - * @param string $salt - * @param int $uid - * @return bool - */ -function verify_password($password, $salt, $uid = null) -{ - $crypt_alg = config('crypt_alg'); - $correct = false; - if (substr($salt, 0, 1) == '$') { - // new-style crypt() - $correct = crypt($password, $salt) == $salt; - } elseif (substr($salt, 0, 7) == '{crypt}') { - // old-style crypt() with DES and static salt - not used anymore - $correct = crypt($password, '77') == $salt; - } elseif (strlen($salt) == 32) { - // old-style md5 without salt - not used anymore - $correct = md5($password) == $salt; - } - - if ($correct && substr($salt, 0, strlen($crypt_alg)) != $crypt_alg && intval($uid)) { - // this password is stored in another format than we want it to be. - // let's update it! - // we duplicate the query from the above set_password() function to have the extra safety of checking - // the old hash - $user = User::find($uid); - if ($user->password == $salt) { - $user->password = crypt($password, $crypt_alg . '$' . generate_salt() . '$'); - $user->save(); - } - } - return $correct; -} /** * @param int $user_id diff --git a/includes/view/AngelTypes_view.php b/includes/view/AngelTypes_view.php index f5434e8f..9f9bd736 100644 --- a/includes/view/AngelTypes_view.php +++ b/includes/view/AngelTypes_view.php @@ -578,7 +578,7 @@ function AngelTypes_about_view($angeltypes, $user_logged_in) $buttons[] = button(page_link_to('register'), register_title()); } - $buttons[] = button(page_link_to('login'), login_title()); + $buttons[] = button(page_link_to('login'), __('Login')); } $faqUrl = config('faq_url'); diff --git a/includes/view/User_view.php b/includes/view/User_view.php index 949bba87..21be0c9f 100644 --- a/includes/view/User_view.php +++ b/includes/view/User_view.php @@ -126,7 +126,7 @@ function User_registration_success_view($event_welcome_message) div('col-md-4', [ '

' . __('Login') . '

', form([ - form_text('nick', __('Nick'), ''), + form_text('login', __('Nick'), ''), form_password('password', __('Password')), form_submit('submit', __('Login')), buttons([ diff --git a/resources/lang/de_DE.UTF-8/LC_MESSAGES/default.po b/resources/lang/de_DE.UTF-8/LC_MESSAGES/default.po index d5a7b993..27ceb586 100644 --- a/resources/lang/de_DE.UTF-8/LC_MESSAGES/default.po +++ b/resources/lang/de_DE.UTF-8/LC_MESSAGES/default.po @@ -541,7 +541,7 @@ msgstr "Du kannst Dich nicht selber löschen." #: includes/controller/users_controller.php:78 #: includes/pages/guest_login.php:410 -msgid "Your password is incorrect. Please try it again." +msgid "Your password is incorrect. Please try it again." msgstr "Dein Passwort stimmt nicht. Bitte probiere es nochmal." #: includes/controller/users_controller.php:87 @@ -1530,18 +1530,21 @@ msgid "Entry required!" msgstr "Pflichtfeld!" #: includes/pages/guest_login.php:414 -msgid "Please enter a password." +msgid "auth.no-password" msgstr "Gib bitte ein Passwort ein." #: includes/pages/guest_login.php:418 -msgid "" -"No user was found with that Nickname. Please try again. If you are still " -"having problems, ask a Dispatcher." +msgid "auth.not-found" msgstr "" -"Es wurde kein Engel mit diesem Namen gefunden. Probiere es bitte noch " -"einmal. Wenn das Problem weiterhin besteht, frage einen Dispatcher." +"Es wurde kein Engel gefunden. Probiere es bitte noch einmal. Wenn das Problem " +"weiterhin besteht, melde dich im Himmel." #: includes/pages/guest_login.php:451 includes/view/User_view.php:130 +msgid "auth.no-nickname" +msgstr "Gib bitte einen Nick an." + +#: includes/pages/guest_login.php:481 +#: includes/view/User_view.php:122 msgid "I forgot my password" msgstr "Passwort vergessen" @@ -2357,7 +2360,7 @@ msgid "" "I have my own car with me and am willing to use it for the event (You'll get " "reimbursed for fuel)" msgstr "" -"Ich habe mein eigenes Auto dabei und möchte würde es zum Fahren für das " +"Ich habe mein eigenes Auto dabei und möchte es zum Fahren für das " "Event verwenden (Du wirst für Spritkosten entschädigt)" #: includes/view/UserDriverLicenses_view.php:30 diff --git a/resources/lang/en_US.UTF-8/LC_MESSAGES/default.mo b/resources/lang/en_US.UTF-8/LC_MESSAGES/default.mo new file mode 100644 index 00000000..e95ae703 Binary files /dev/null and b/resources/lang/en_US.UTF-8/LC_MESSAGES/default.mo differ diff --git a/resources/lang/en_US.UTF-8/LC_MESSAGES/default.po b/resources/lang/en_US.UTF-8/LC_MESSAGES/default.po new file mode 100644 index 00000000..22566e52 --- /dev/null +++ b/resources/lang/en_US.UTF-8/LC_MESSAGES/default.po @@ -0,0 +1,26 @@ +msgid "" +msgstr "" +"Project-Id-Version: Engelsystem 2.0\n" +"POT-Creation-Date: 2017-12-29 19:01+0100\n" +"PO-Revision-Date: 2018-11-27 00:28+0100\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.11\n" +"X-Poedit-KeywordsList: _;gettext;gettext_noop\n" +"X-Poedit-Basepath: .\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"Last-Translator: \n" +"Language: en_US\n" +"X-Poedit-SearchPath-0: .\n" + +msgid "auth.no-nickname" +msgstr "Please enter a nickname." + +msgid "auth.no-password" +msgstr "Please enter a password." + +msgid "auth.not-found" +msgstr "No user was found. Please try again. If you are still having problems, ask Heaven." diff --git a/resources/lang/pt_BR.UTF.8/LC_MESSAGES/default.mo b/resources/lang/pt_BR.UTF.8/LC_MESSAGES/default.mo new file mode 100644 index 00000000..8b864156 Binary files /dev/null and b/resources/lang/pt_BR.UTF.8/LC_MESSAGES/default.mo differ diff --git a/resources/lang/pt_BR.UTF.8/LC_MESSAGES/default.po b/resources/lang/pt_BR.UTF.8/LC_MESSAGES/default.po new file mode 100644 index 00000000..b9bf420d --- /dev/null +++ b/resources/lang/pt_BR.UTF.8/LC_MESSAGES/default.po @@ -0,0 +1,2645 @@ +msgid "" +msgstr "" +"Project-Id-Version: Engelsystem 2.0\n" +"POT-Creation-Date: 2017-04-25 05:23+0200\n" +"PO-Revision-Date: 2018-11-27 00:29+0100\n" +"Last-Translator: samba \n" +"Language-Team: \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.1\n" +"X-Poedit-KeywordsList: _;gettext;gettext_noop\n" +"X-Poedit-Basepath: ../../..\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-SearchPath-0: .\n" + +#: includes/controller/angeltypes_controller.php:7 +#: includes/pages/user_shifts.php:164 includes/view/AngelTypes_view.php:62 +#: includes/view/AngelTypes_view.php:86 includes/view/User_view.php:356 +msgid "Angeltypes" +msgstr "Tipo de Anjo" + +#: includes/controller/angeltypes_controller.php:53 +#: includes/pages/guest_login.php:377 includes/view/AngelTypes_view.php:265 +#: includes/view/AngelTypes_view.php:326 includes/view/User_view.php:110 +msgid "Teams/Job description" +msgstr "Time/Descrição do trabalho" + +#: includes/controller/angeltypes_controller.php:72 +#, php-format +msgid "Angeltype %s deleted." +msgstr "Tipo de anjo %s apagado." + +#: includes/controller/angeltypes_controller.php:77 +#: includes/view/AngelTypes_view.php:41 +#, php-format +msgid "Delete angeltype %s" +msgstr "Apagar tipo de anjo %s" + +#: includes/controller/angeltypes_controller.php:116 +msgid "Please check the name. Maybe it already exists." +msgstr "Por favor verifique o nome. Pode ser que já exista." + +#: includes/controller/angeltypes_controller.php:141 +#: includes/view/AngelTypes_view.php:60 +#, php-format +msgid "Edit %s" +msgstr "Editar %s" + +#: includes/controller/angeltypes_controller.php:162 +#: includes/view/AngelTypes_view.php:252 +#, php-format +msgid "Team %s" +msgstr "Time %s" + +#: includes/controller/angeltypes_controller.php:181 +#: includes/view/User_view.php:274 +msgid "view" +msgstr "ver" + +#: includes/controller/angeltypes_controller.php:185 +#: includes/pages/admin_free.php:71 includes/pages/admin_groups.php:23 +#: includes/pages/admin_rooms.php:16 includes/view/AngelTypes_view.php:107 +#: includes/view/ShiftTypes_view.php:55 includes/view/ShiftTypes_view.php:67 +#: includes/view/Shifts_view.php:55 includes/view/User_view.php:277 +#: includes/view/User_view.php:328 +msgid "edit" +msgstr "editar" + +#: includes/controller/angeltypes_controller.php:186 +#: includes/controller/shifts_controller.php:178 +#: includes/pages/admin_questions.php:42 includes/pages/admin_questions.php:56 +#: includes/pages/admin_rooms.php:17 includes/pages/admin_user.php:120 +#: includes/view/AngelTypes_view.php:45 includes/view/AngelTypes_view.php:110 +#: includes/view/Questions_view.php:5 includes/view/Questions_view.php:12 +#: includes/view/ShiftTypes_view.php:16 includes/view/ShiftTypes_view.php:56 +#: includes/view/ShiftTypes_view.php:68 includes/view/Shifts_view.php:56 +msgid "delete" +msgstr "deletar" + +#: includes/controller/angeltypes_controller.php:191 +#: includes/view/AngelTypes_view.php:103 includes/view/AngelTypes_view.php:288 +msgid "leave" +msgstr "sair" + +#: includes/controller/angeltypes_controller.php:193 +#: includes/view/AngelTypes_view.php:94 includes/view/AngelTypes_view.php:290 +msgid "join" +msgstr "entrar" + +#: includes/controller/angeltypes_controller.php:220 +#: includes/controller/user_angeltypes_controller.php:29 +#: includes/controller/user_angeltypes_controller.php:35 +#: includes/controller/user_angeltypes_controller.php:65 +#: includes/controller/user_angeltypes_controller.php:71 +#: includes/controller/user_angeltypes_controller.php:119 +#: includes/controller/user_angeltypes_controller.php:170 +#: includes/controller/user_angeltypes_controller.php:235 +msgid "Angeltype doesn't exist." +msgstr "Esse tipo de anjo não existe." + +#: includes/controller/event_config_controller.php:4 +msgid "Event config" +msgstr "Configuração do evento" + +#: includes/controller/event_config_controller.php:48 +msgid "Please enter buildup start date." +msgstr "Por favor digite a data de início da montagem." + +#: includes/controller/event_config_controller.php:52 +msgid "Please enter event start date." +msgstr "Por favor digite a data de início do evento." + +#: includes/controller/event_config_controller.php:56 +msgid "Please enter event end date." +msgstr "Por favor digite a data de término do evento." + +#: includes/controller/event_config_controller.php:60 +msgid "Please enter teardown end date." +msgstr "Por favor digite a data de desmontagem do evento" + +#: includes/controller/event_config_controller.php:66 +msgid "The buildup start date has to be before the event start date." +msgstr "A data de montagem deve ser anterior a data de início do evento." + +#: includes/controller/event_config_controller.php:71 +msgid "The event start date has to be before the event end date." +msgstr "" +"A data de início do evento deve ser anterior a data de término do evento." + +#: includes/controller/event_config_controller.php:76 +msgid "The event end date has to be before the teardown end date." +msgstr "A data de término deve ser anterior a data de desmontagem do evento." + +#: includes/controller/event_config_controller.php:81 +msgid "The buildup start date has to be before the teardown end date." +msgstr "A data de montagem deve ser anterior a data de desmontagem do evento." + +#: includes/controller/event_config_controller.php:92 +#: includes/pages/user_settings.php:77 +msgid "Settings saved." +msgstr "Configurações salvas." + +#: includes/controller/shift_entries_controller.php:56 +msgid "" +"You are not allowed to sign up for this shift. Maybe shift is full or " +"already running." +msgstr "" +"Você não tem permissão para se inscrever nesse turno. Talvez o turno esteja " +"lotado ou já esteja em andamento." + +#: includes/controller/shift_entries_controller.php:103 +msgid "You are subscribed. Thank you!" +msgstr "Você já está inscrito. Obrigado!" + +#: includes/controller/shift_entries_controller.php:103 +#: includes/pages/user_myshifts.php:4 +msgid "My shifts" +msgstr "Meus turnos" + +#: includes/controller/shift_entries_controller.php:111 +#: includes/view/User_view.php:348 +msgid "Freeloader" +msgstr "Freeloader" + +#: includes/controller/shift_entries_controller.php:180 +msgid "Shift entry deleted." +msgstr "O turno foi deletado." + +#: includes/controller/shift_entries_controller.php:182 +msgid "Entry not found." +msgstr "Entrada não encontrada." + +#: includes/controller/shifts_controller.php:63 +msgid "Please select a room." +msgstr "Por favor selecione uma sala." + +#: includes/controller/shifts_controller.php:70 +msgid "Please select a shifttype." +msgstr "Por favor selecione um tssipo de turno." + +#: includes/controller/shifts_controller.php:77 +msgid "Please enter a valid starting time for the shifts." +msgstr "Por favor entre com um horário de início válido para os turnos." + +#: includes/controller/shifts_controller.php:84 +msgid "Please enter a valid ending time for the shifts." +msgstr "Por favor entre com um horário de término válido para os turnos." + +#: includes/controller/shifts_controller.php:89 +msgid "The ending time has to be after the starting time." +msgstr "O horário de término deve ser após o horário de início." + +#: includes/controller/shifts_controller.php:97 +#, php-format +msgid "Please check your input for needed angels of type %s." +msgstr "Por favor verifique seu input para os anjos de tipo %s necessários." + +#: includes/controller/shifts_controller.php:120 +msgid "Shift updated." +msgstr "Turno atualizado." + +#: includes/controller/shifts_controller.php:135 +msgid "This page is much more comfortable with javascript." +msgstr "Esta página é muito mais confortável com javascript" + +#: includes/controller/shifts_controller.php:137 +#: includes/pages/admin_import.php:98 includes/pages/admin_shifts.php:319 +msgid "Shifttype" +msgstr "Tipo de turno" + +#: includes/controller/shifts_controller.php:138 +#: includes/pages/admin_import.php:158 includes/pages/admin_import.php:167 +#: includes/pages/admin_import.php:176 includes/pages/admin_shifts.php:320 +#: includes/view/Shifts_view.php:62 +msgid "Title" +msgstr "Título" + +#: includes/controller/shifts_controller.php:139 +msgid "Room:" +msgstr "Sala:" + +#: includes/controller/shifts_controller.php:140 +msgid "Start:" +msgstr "Início:" + +#: includes/controller/shifts_controller.php:141 +msgid "End:" +msgstr "Fim:" + +#: includes/controller/shifts_controller.php:142 +#: includes/pages/admin_shifts.php:270 includes/pages/admin_shifts.php:334 +#: includes/view/Shifts_view.php:88 +msgid "Needed angels" +msgstr "Anjos necessários" + +#: includes/controller/shifts_controller.php:144 +#: includes/pages/admin_groups.php:54 includes/pages/admin_news.php:35 +#: includes/pages/admin_questions.php:40 includes/pages/admin_rooms.php:157 +#: includes/pages/admin_shifts.php:272 includes/pages/user_messages.php:44 +#: includes/pages/user_news.php:107 includes/pages/user_news.php:164 +#: includes/view/AngelTypes_view.php:76 includes/view/EventConfig_view.php:122 +#: includes/view/Questions_view.php:32 includes/view/ShiftEntry_view.php:32 +#: includes/view/ShiftTypes_view.php:39 +#: includes/view/UserDriverLicenses_view.php:34 includes/view/User_view.php:56 +#: includes/view/User_view.php:65 includes/view/User_view.php:70 +#: includes/view/User_view.php:75 includes/view/User_view.php:146 +#: includes/view/User_view.php:402 +msgid "Save" +msgstr "Salvar" + +#: includes/controller/shifts_controller.php:172 +msgid "Shift deleted." +msgstr "Turno deletado." + +#: includes/controller/shifts_controller.php:177 +#, php-format +msgid "Do you want to delete the shift %s from %s to %s?" +msgstr "Você quer deletar o turno %s de %s para %s?" + +#: includes/controller/shifts_controller.php:195 +msgid "Shift could not be found." +msgstr "O turno não pôde ser encontrado." + +#: includes/controller/shifttypes_controller.php:31 +#, php-format +msgid "Shifttype %s deleted." +msgstr "Tipo de turno %s deletado." + +#: includes/controller/shifttypes_controller.php:36 +#: includes/view/ShiftTypes_view.php:12 +#, php-format +msgid "Delete shifttype %s" +msgstr "Apagar tipo de turno %s" + +#: includes/controller/shifttypes_controller.php:58 +msgid "Shifttype not found." +msgstr "Tipo de turno não encontrado." + +#: includes/controller/shifttypes_controller.php:74 +#: includes/pages/admin_rooms.php:71 +msgid "Please enter a name." +msgstr "Por favor digite um nome." + +#: includes/controller/shifttypes_controller.php:94 +msgid "Updated shifttype." +msgstr "Tipo de turno atualizado." + +#: includes/controller/shifttypes_controller.php:101 +msgid "Created shifttype." +msgstr "Tipo de turno criado" + +#: includes/controller/shifttypes_controller.php:155 +msgid "Shifttypes" +msgstr "Tipos de turno" + +#: includes/controller/user_angeltypes_controller.php:19 +#, php-format +msgid "There is %d unconfirmed angeltype." +msgid_plural "There are %d unconfirmed angeltypes." +msgstr[0] "Há %d anjo não confirmado." +msgstr[1] "There are %d unconfirmed angeltypes." + +#: includes/controller/user_angeltypes_controller.php:19 +msgid "Angel types which need approvals:" +msgstr "Tipos de anjo que precisam de aprovações:" + +#: includes/controller/user_angeltypes_controller.php:40 +msgid "You are not allowed to delete all users for this angeltype." +msgstr "" +"Você não têm permissão para apagar todos os usuários desse tipo de anjo." + +#: includes/controller/user_angeltypes_controller.php:48 +#, php-format +msgid "Denied all users for angeltype %s." +msgstr "Todos os usuários com tipo de anjo %s negados." + +#: includes/controller/user_angeltypes_controller.php:53 +#: includes/view/UserAngelTypes_view.php:15 +msgid "Deny all users" +msgstr "Negar todos os usuários" + +#: includes/controller/user_angeltypes_controller.php:77 +#: includes/controller/user_angeltypes_controller.php:107 +#: includes/controller/user_angeltypes_controller.php:113 +#: includes/controller/user_angeltypes_controller.php:158 +#: includes/controller/user_angeltypes_controller.php:164 +#: includes/controller/user_angeltypes_controller.php:216 +#: includes/controller/user_angeltypes_controller.php:229 +msgid "User angeltype doesn't exist." +msgstr "O tipo de anjo deste usuário não existe." + +#: includes/controller/user_angeltypes_controller.php:82 +msgid "You are not allowed to confirm all users for this angeltype." +msgstr "" +"Você não tem permissão para confirmar todos os usuários com este tipo de " +"anjo." + +#: includes/controller/user_angeltypes_controller.php:90 +#, php-format +msgid "Confirmed all users for angeltype %s." +msgstr "Todos os usuários com tipo de anjo %s confirmados." + +#: includes/controller/user_angeltypes_controller.php:95 +#: includes/view/UserAngelTypes_view.php:26 +msgid "Confirm all users" +msgstr "Confirmar todos usuários" + +#: includes/controller/user_angeltypes_controller.php:124 +msgid "You are not allowed to confirm this users angeltype." +msgstr "Você não tem permissão para confirmar o tipo de anjo deste usuário." + +#: includes/controller/user_angeltypes_controller.php:130 +#: includes/controller/user_angeltypes_controller.php:176 +#: includes/controller/user_angeltypes_controller.php:241 +#: includes/controller/users_controller.php:312 +msgid "User doesn't exist." +msgstr "Usuário não existente." + +#: includes/controller/user_angeltypes_controller.php:141 +#, php-format +msgid "%s confirmed for angeltype %s." +msgstr "%s confirmado para o tipo de anjo %s." + +#: includes/controller/user_angeltypes_controller.php:146 +#: includes/view/UserAngelTypes_view.php:37 +msgid "Confirm angeltype for user" +msgstr "Confirme o tipo de anjo para o usuário" + +#: includes/controller/user_angeltypes_controller.php:181 +msgid "You are not allowed to delete this users angeltype." +msgstr "Você não tem permissão para deletar o tipo de anjo deste usuário." + +#: includes/controller/user_angeltypes_controller.php:191 +#, php-format +msgid "User %s removed from %s." +msgstr "Usuário %s removido de %s." + +#: includes/controller/user_angeltypes_controller.php:199 +#: includes/view/UserAngelTypes_view.php:48 +msgid "Remove angeltype" +msgstr "Remover esse tipo de anjo" + +#: includes/controller/user_angeltypes_controller.php:211 +msgid "You are not allowed to set supporter rights." +msgstr "Você não tem autorização para definir permissões de apoiadores." + +#: includes/controller/user_angeltypes_controller.php:223 +msgid "No supporter update given." +msgstr "Nenhuma atualização de apoiador informada." + +#: includes/controller/user_angeltypes_controller.php:248 +#, php-format +msgid "Added supporter rights for %s to %s." +msgstr "Permissões de apoiador incluídos para %s a %s." + +#: includes/controller/user_angeltypes_controller.php:248 +#, php-format +msgid "Removed supporter rights for %s from %s." +msgstr "Permissões de apoiador removidos para %s a %s." + +#: includes/controller/user_angeltypes_controller.php:256 +#: includes/view/AngelTypes_view.php:156 +#: includes/view/UserAngelTypes_view.php:4 +msgid "Add supporter rights" +msgstr "Adicionar permissão ao apoiador" + +#: includes/controller/user_angeltypes_controller.php:256 +#: includes/view/AngelTypes_view.php:147 +#: includes/view/UserAngelTypes_view.php:4 +msgid "Remove supporter rights" +msgstr "Remover permissões de apoiador" + +#: includes/controller/user_angeltypes_controller.php:289 +#, php-format +msgid "User %s added to %s." +msgstr "Usuário %s adicionado a %s." + +#: includes/controller/user_angeltypes_controller.php:299 +#: includes/view/UserAngelTypes_view.php:64 +msgid "Add user to angeltype" +msgstr "Adicionar usuário a tipo de anjo" + +#: includes/controller/user_angeltypes_controller.php:312 +#, php-format +msgid "You are already a %s." +msgstr "Você já é %s." + +#: includes/controller/user_angeltypes_controller.php:319 +#, php-format +msgid "You joined %s." +msgstr "Você se juntou a %s." + +#: includes/controller/user_angeltypes_controller.php:332 +#: includes/view/UserAngelTypes_view.php:78 +#, php-format +msgid "Become a %s" +msgstr "Torne-se %s" + +#: includes/controller/user_driver_licenses_controller.php:19 +#, php-format +msgid "" +"You joined an angeltype which requires a driving license. Please edit your " +"driving license information here: %s." +msgstr "" +"Você se tornou um tipo de anjo que requer carteira de motorista. Por favor " +"inclua \n" +"seus dados aqui: %s." + +#: includes/controller/user_driver_licenses_controller.php:19 +msgid "driving license information" +msgstr "dados da carteira de motorista" + +#: includes/controller/user_driver_licenses_controller.php:113 +msgid "Your driver license information has been saved." +msgstr "Dados da carteira de motorista salvos." + +#: includes/controller/user_driver_licenses_controller.php:116 +msgid "Please select at least one driving license." +msgstr "Selecione pelo menos uma carteira de motorista." + +#: includes/controller/user_driver_licenses_controller.php:121 +msgid "Your driver license information has been removed." +msgstr "Seus dados de carteira de motorista foram removidos." + +#: includes/controller/user_driver_licenses_controller.php:127 +#: includes/view/UserDriverLicenses_view.php:15 +#, php-format +msgid "Edit %s driving license information" +msgstr "Editar dados da carteira de motorista de %s" + +#: includes/controller/users_controller.php:52 +msgid "You cannot delete yourself." +msgstr "Você não pode se deletar." + +#: includes/controller/users_controller.php:61 +#: includes/pages/guest_login.php:315 +msgid "Your password is incorrect. Please try it again." +msgstr "Sua senha está incorreta. Por favor, tente novamente." + +#: includes/controller/users_controller.php:71 +msgid "User deleted." +msgstr "Usuário deletado." + +#: includes/controller/users_controller.php:79 includes/view/User_view.php:121 +#, php-format +msgid "Delete %s" +msgstr "Apagar %s" + +#: includes/controller/users_controller.php:120 +msgid "Please enter a valid number of vouchers." +msgstr "Por favor, entre com um número válido de vouchers." + +#: includes/controller/users_controller.php:131 +msgid "Saved the number of vouchers." +msgstr "Número de vouchers salvo." + +#: includes/controller/users_controller.php:139 includes/view/User_view.php:138 +#, php-format +msgid "%s's vouchers" +msgstr "Vouchers de %s" + +#: includes/controller/users_controller.php:151 +msgid "User not found." +msgstr "Usuário não encontrado." + +#: includes/controller/users_controller.php:205 includes/view/User_view.php:175 +msgid "All users" +msgstr "Todos usuários" + +#: includes/controller/users_controller.php:217 +msgid "Token is not correct." +msgstr "O token não está correto." + +#: includes/controller/users_controller.php:227 +#: includes/pages/guest_login.php:102 includes/pages/user_settings.php:97 +msgid "Your passwords don't match." +msgstr "Suas senhas não correspondem." + +#: includes/controller/users_controller.php:231 +#: includes/pages/user_settings.php:95 +msgid "Your password is to short (please use at least 6 characters)." +msgstr "Sua senha é muito curta (por favor use no mínimo 6 caracteres)." + +#: includes/controller/users_controller.php:236 +#: includes/pages/user_settings.php:99 +msgid "Password saved." +msgstr "Sua senha foi salva." + +#: includes/controller/users_controller.php:257 +#: includes/controller/users_controller.php:261 +#: includes/pages/guest_login.php:67 includes/pages/user_settings.php:21 +msgid "E-mail address is not correct." +msgstr "E-mail não está correto." + +#: includes/controller/users_controller.php:265 +#: includes/pages/guest_login.php:71 includes/pages/user_settings.php:25 +msgid "Please enter your e-mail." +msgstr "Por favor digite seu e-mail." + +#: includes/controller/users_controller.php:270 +#: includes/controller/users_controller.php:295 +msgid "Password recovery" +msgstr "Recuperação de senha" + +#: includes/controller/users_controller.php:270 +#, php-format +msgid "Please visit %s to recover your password." +msgstr "Por favor visite %s para recuperar sua senha" + +#: includes/controller/users_controller.php:271 +msgid "We sent an email containing your password recovery link." +msgstr "Nós enviamos um email com o link para recuperação da sua senha." + +#: includes/helper/email_helper.php:12 +#, php-format +msgid "Hi %s," +msgstr "Oi %s," + +#: includes/helper/email_helper.php:12 +#, php-format +msgid "here is a message for you from the %s:" +msgstr "aqui está uma mensagem do %s para você:" + +#: includes/helper/email_helper.php:12 +#, php-format +msgid "" +"This email is autogenerated and has not been signed. You got this email " +"because you are registered in the %s." +msgstr "Você recebeu esse email porque está registrado no %s." + +#: includes/mailer/shifts_mailer.php:10 +msgid "A Shift you are registered on has changed:" +msgstr "Um turno em que você estava registrado foi modificado:" + +#: includes/mailer/shifts_mailer.php:14 +#, php-format +msgid "* Shift type changed from %s to %s" +msgstr "* Tipo de turno alterado de %s para %s" + +#: includes/mailer/shifts_mailer.php:19 +#, php-format +msgid "* Shift title changed from %s to %s" +msgstr "* Título do turno alterado de %s para %s" + +#: includes/mailer/shifts_mailer.php:24 +#, php-format +msgid "* Shift Start changed from %s to %s" +msgstr "* Início do turno alterado de %s para %s" + +#: includes/mailer/shifts_mailer.php:29 +#, php-format +msgid "* Shift End changed from %s to %s" +msgstr "* Término do turno alterado de %s para %s" + +#: includes/mailer/shifts_mailer.php:34 +#, php-format +msgid "* Shift Location changed from %s to %s" +msgstr "* Local do turno alterado de %s para %s" + +#: includes/mailer/shifts_mailer.php:44 +msgid "The updated Shift:" +msgstr "Turno atualizado:" + +#: includes/mailer/shifts_mailer.php:53 +msgid "Your Shift has changed" +msgstr "O seu turno foi modificado" + +#: includes/mailer/shifts_mailer.php:62 +msgid "A Shift you are registered on was deleted:" +msgstr "Um turno em que você estava registrado foi apagado:" + +#: includes/mailer/shifts_mailer.php:71 +msgid "Your Shift was deleted" +msgstr "Seu turno foi apagado" + +#: includes/mailer/shifts_mailer.php:80 +msgid "You have been assigned to a Shift:" +msgstr "Você foi alocado a um turno:" + +#: includes/mailer/shifts_mailer.php:86 +msgid "Assigned to Shift" +msgstr "Alocado ao turno" + +#: includes/mailer/shifts_mailer.php:94 +msgid "You have been removed from a Shift:" +msgstr "Você foi removido de um turno:" + +#: includes/mailer/shifts_mailer.php:100 +msgid "Removed from Shift" +msgstr "Removido do turno" + +#: includes/mailer/users_mailer.php:7 +msgid "Your account has been deleted" +msgstr "A sua conta foi deletada." + +#: includes/mailer/users_mailer.php:7 +msgid "" +"Your angelsystem account has been deleted. If you have any questions " +"regarding your account deletion, please contact heaven." +msgstr "" +"Sua conta engelsystem foi deletada. Se você tiver questões sobre a deleção " +"da sua conta, por favor entre em contato com o paraíso." + +#: includes/pages/admin_active.php:4 +msgid "Active angels" +msgstr "Anjos ativos" + +#: includes/pages/admin_active.php:29 +#, php-format +msgid "" +"At least %s angels are forced to be active. The number has to be greater." +msgstr "No mínimo %s anjos precisam estar ativos. O número deve ser maior." + +#: includes/pages/admin_active.php:34 +msgid "Please enter a number of angels to be marked as active." +msgstr "Por favor insira o número de anjos a marcar como ativos." + +#: includes/pages/admin_active.php:59 +msgid "Marked angels." +msgstr "Anjos marcados." + +#: includes/pages/admin_active.php:61 includes/pages/admin_rooms.php:137 +#: includes/pages/admin_rooms.php:173 includes/pages/admin_shifts.php:266 +#: includes/view/UserAngelTypes_view.php:67 includes/view/User_view.php:124 +#: includes/view/User_view.php:141 +msgid "back" +msgstr "voltar" + +#: includes/pages/admin_active.php:61 +msgid "apply" +msgstr "aplicar" + +#: includes/pages/admin_active.php:71 +msgid "Angel has been marked as active." +msgstr "Anjo marcado como ativo." + +#: includes/pages/admin_active.php:73 includes/pages/admin_active.php:83 +#: includes/pages/admin_active.php:103 includes/pages/admin_arrive.php:23 +#: includes/pages/admin_arrive.php:34 +msgid "Angel not found." +msgstr "Anjo não encontrado." + +#: includes/pages/admin_active.php:81 +msgid "Angel has been marked as not active." +msgstr "Anjo marcado como não ativo." + +#: includes/pages/admin_active.php:91 +msgid "Angel has got a t-shirt." +msgstr "Anjo tem uma camiseta." + +#: includes/pages/admin_active.php:101 +msgid "Angel has got no t-shirt." +msgstr "Anjo não tem camiseta." + +#: includes/pages/admin_active.php:142 +msgid "set active" +msgstr "definir ativo" + +#: includes/pages/admin_active.php:145 +msgid "remove active" +msgstr "remover ativo" + +#: includes/pages/admin_active.php:146 +msgid "got t-shirt" +msgstr "pegou camiseta" + +#: includes/pages/admin_active.php:149 +msgid "remove t-shirt" +msgstr "remover camiseta" + +#: includes/pages/admin_active.php:168 includes/pages/admin_arrive.php:165 +#: includes/pages/admin_arrive.php:180 includes/pages/admin_arrive.php:195 +#: includes/view/AngelTypes_view.php:221 includes/view/AngelTypes_view.php:229 +#: includes/view/User_view.php:165 +msgid "Sum" +msgstr "Somatória" + +#: includes/pages/admin_active.php:175 +msgid "Search angel:" +msgstr "Buscar Anjo:" + +#: includes/pages/admin_active.php:176 +msgid "Show all shifts" +msgstr "Mostrar todos os turnos" + +#: includes/pages/admin_active.php:177 includes/pages/admin_arrive.php:141 +#: includes/pages/admin_arrive.php:142 includes/pages/admin_free.php:78 +#: includes/pages/admin_free.php:87 includes/pages/admin_log.php:23 +#: includes/pages/admin_log.php:24 +msgid "Search" +msgstr "Buscar" + +#: includes/pages/admin_active.php:180 +msgid "How much angels should be active?" +msgstr "Quantos anjos deverão estar ativos?" + +#: includes/pages/admin_active.php:181 includes/pages/admin_shifts.php:254 +#: includes/pages/admin_shifts.php:342 +msgid "Preview" +msgstr "Pré-visualizar" + +#: includes/pages/admin_active.php:185 includes/pages/admin_arrive.php:145 +msgid "Nickname" +msgstr "Apelido" + +#: includes/pages/admin_active.php:186 includes/pages/admin_active.php:196 +#: includes/view/User_view.php:191 +msgid "Size" +msgstr "Tamanho" + +#: includes/pages/admin_active.php:187 includes/pages/user_shifts.php:5 +#: includes/view/User_view.php:364 +msgid "Shifts" +msgstr "Turnos" + +#: includes/pages/admin_active.php:188 includes/pages/admin_shifts.php:329 +msgid "Length" +msgstr "Duração" + +#: includes/pages/admin_active.php:189 +msgid "Active?" +msgstr "Ativo?" + +#: includes/pages/admin_active.php:190 includes/view/User_view.php:189 +msgid "Forced" +msgstr "Forçados" + +#: includes/pages/admin_active.php:191 +msgid "T-shirt?" +msgstr "Camiseta?" + +#: includes/pages/admin_active.php:194 +msgid "Shirt statistics" +msgstr "Estatísticas de camiseta" + +#: includes/pages/admin_active.php:197 +msgid "Needed shirts" +msgstr "Camisetas necessárias" + +#: includes/pages/admin_active.php:198 +msgid "Given shirts" +msgstr "Camisetas entregues" + +#: includes/pages/admin_arrive.php:4 +msgid "Arrived angels" +msgstr "Anjos que chegaram" + +#: includes/pages/admin_arrive.php:20 +msgid "Reset done. Angel has not arrived." +msgstr "Reset realizado. Anjo não chegou." + +#: includes/pages/admin_arrive.php:31 +msgid "Angel has been marked as arrived." +msgstr "Chegada do anjo registrada." + +#: includes/pages/admin_arrive.php:71 includes/view/UserAngelTypes_view.php:9 +#: includes/view/UserAngelTypes_view.php:20 +#: includes/view/UserAngelTypes_view.php:31 +#: includes/view/UserAngelTypes_view.php:42 +#: includes/view/UserAngelTypes_view.php:53 +msgid "yes" +msgstr "sim" + +#: includes/pages/admin_arrive.php:72 +msgid "reset" +msgstr "resetar" + +#: includes/pages/admin_arrive.php:72 includes/pages/admin_arrive.php:156 +#: includes/pages/admin_arrive.php:171 includes/pages/admin_arrive.php:186 +#: includes/view/User_view.php:330 +msgid "arrived" +msgstr "chegou" + +#: includes/pages/admin_arrive.php:146 +msgid "Planned arrival" +msgstr "Chegada planejada" + +#: includes/pages/admin_arrive.php:147 +msgid "Arrived?" +msgstr "Chegou?" + +#: includes/pages/admin_arrive.php:148 +msgid "Arrival date" +msgstr "Data de chegada" + +#: includes/pages/admin_arrive.php:149 +msgid "Planned departure" +msgstr "Saída planejada" + +#: includes/pages/admin_arrive.php:154 +msgid "Planned arrival statistics" +msgstr "Estatísticas de chegadas planejadas" + +#: includes/pages/admin_arrive.php:157 includes/pages/admin_arrive.php:172 +#: includes/pages/admin_arrive.php:187 +msgid "arrived sum" +msgstr "soma dos que chegaram" + +#: includes/pages/admin_arrive.php:163 includes/pages/admin_arrive.php:178 +#: includes/pages/admin_arrive.php:193 includes/pages/admin_news.php:30 +#: includes/pages/user_messages.php:76 +msgid "Date" +msgstr "Data" + +#: includes/pages/admin_arrive.php:164 includes/pages/admin_arrive.php:179 +#: includes/pages/admin_arrive.php:194 +msgid "Count" +msgstr "Contar" + +#: includes/pages/admin_arrive.php:169 +msgid "Arrival statistics" +msgstr "Estatísticas de chegadas" + +#: includes/pages/admin_arrive.php:184 +msgid "Planned departure statistics" +msgstr "Estatísticas de saídas planejadas" + +#: includes/pages/admin_free.php:4 +msgid "Free angels" +msgstr "Anjos livres" + +#: includes/pages/admin_free.php:81 includes/view/ShiftTypes_view.php:36 +#: includes/view/UserAngelTypes_view.php:70 +msgid "Angeltype" +msgstr "Tipo de anjo" + +#: includes/pages/admin_free.php:84 +msgid "Only confirmed" +msgstr "Somente confirmados" + +#: includes/pages/admin_free.php:92 includes/pages/guest_login.php:225 +#: includes/pages/guest_login.php:354 includes/view/AngelTypes_view.php:177 +#: includes/view/AngelTypes_view.php:190 includes/view/User_view.php:40 +#: includes/view/User_view.php:97 includes/view/User_view.php:181 +msgid "Nick" +msgstr "Apelido" + +#: includes/pages/admin_free.php:94 includes/pages/guest_login.php:255 +#: includes/view/AngelTypes_view.php:178 includes/view/AngelTypes_view.php:191 +#: includes/view/User_view.php:47 includes/view/User_view.php:184 +msgid "DECT" +msgstr "DECT" + +#: includes/pages/admin_free.php:95 includes/pages/guest_login.php:264 +#: includes/view/User_view.php:52 +msgid "Jabber" +msgstr "Jabber" + +#: includes/pages/admin_free.php:96 includes/pages/guest_login.php:228 +#: includes/view/User_view.php:49 includes/view/User_view.php:386 +msgid "E-Mail" +msgstr "E-Mail" + +#: includes/pages/admin_groups.php:4 +msgid "Grouprights" +msgstr "Direitos de grupo" + +#: includes/pages/admin_groups.php:29 includes/pages/admin_import.php:145 +#: includes/pages/admin_import.php:149 includes/pages/admin_rooms.php:143 +#: includes/pages/admin_rooms.php:189 includes/view/AngelTypes_view.php:66 +#: includes/view/AngelTypes_view.php:268 includes/view/ShiftTypes_view.php:35 +#: includes/view/ShiftTypes_view.php:78 includes/view/User_view.php:183 +msgid "Name" +msgstr "Nome" + +#: includes/pages/admin_groups.php:30 +msgid "Privileges" +msgstr "Privilégios" + +#: includes/pages/admin_groups.php:55 +msgid "Edit group" +msgstr "Editar grupo" + +#: includes/pages/admin_import.php:4 includes/pages/admin_rooms.php:144 +#: includes/pages/admin_rooms.php:190 +msgid "Frab import" +msgstr "Importação Frab" + +#: includes/pages/admin_import.php:26 +msgid "Webserver has no write-permission on import directory." +msgstr "" +"O servidor web não possui permissão de escrita no diretório de importação." + +#: includes/pages/admin_import.php:54 includes/pages/admin_import.php:118 +#: includes/pages/admin_import.php:196 includes/pages/admin_shifts.php:53 +#: includes/pages/admin_shifts.php:59 +msgid "Please select a shift type." +msgstr "Por favor selecione um tipo de turno." + +#: includes/pages/admin_import.php:61 includes/pages/admin_import.php:125 +#: includes/pages/admin_import.php:203 +msgid "Please enter an amount of minutes to add to a talk's begin." +msgstr "" +"Por favor insira um número de minutos para adicionar ao início de uma " +"palestra." + +#: includes/pages/admin_import.php:68 includes/pages/admin_import.php:132 +#: includes/pages/admin_import.php:210 +msgid "Please enter an amount of minutes to add to a talk's end." +msgstr "" +"Por favor insira um número de minutos para adicionar ao término de uma " +"palestra." + +#: includes/pages/admin_import.php:76 +msgid "No valid xml/xcal file provided." +msgstr "Nenhum arquivo xml/xcal válido foi fornecido." + +#: includes/pages/admin_import.php:81 +msgid "File upload went wrong." +msgstr "Falha no upload do arquivo." + +#: includes/pages/admin_import.php:85 +msgid "Please provide some data." +msgstr "Por favor insira alguns dados." + +#: includes/pages/admin_import.php:93 includes/pages/admin_import.php:140 +#: includes/pages/admin_import.php:253 +msgid "File Upload" +msgstr "Enviar arquivo" + +#: includes/pages/admin_import.php:93 includes/pages/admin_import.php:140 +#: includes/pages/admin_import.php:253 +msgid "Validation" +msgstr "Validação" + +#: includes/pages/admin_import.php:93 includes/pages/admin_import.php:102 +#: includes/pages/admin_import.php:140 includes/pages/admin_import.php:179 +#: includes/pages/admin_import.php:253 +msgid "Import" +msgstr "Importar" + +#: includes/pages/admin_import.php:97 +msgid "" +"This import will create/update/delete rooms and shifts by given FRAB-export " +"file. The needed file format is xcal." +msgstr "" +"Esta importação irá criar/atualizar/deletar salas e turnos a partir do " +"arquivo FRAB-Export. O formato necessário é xcal." + +#: includes/pages/admin_import.php:99 +msgid "Add minutes to start" +msgstr "Adicionar minutos ao início" + +#: includes/pages/admin_import.php:100 +msgid "Add minutes to end" +msgstr "Adicionar minutos ao fim" + +#: includes/pages/admin_import.php:101 +msgid "xcal-File (.xcal)" +msgstr "Adicionar minutos ao fim" + +#: includes/pages/admin_import.php:111 includes/pages/admin_import.php:185 +msgid "Missing import file." +msgstr "Arquivo para importar não encontrado." + +#: includes/pages/admin_import.php:144 +msgid "Rooms to create" +msgstr "Salas para criar" + +#: includes/pages/admin_import.php:148 +msgid "Rooms to delete" +msgstr "Salas para apagar" + +#: includes/pages/admin_import.php:152 +msgid "Shifts to create" +msgstr "Turnos para criar" + +#: includes/pages/admin_import.php:154 includes/pages/admin_import.php:163 +#: includes/pages/admin_import.php:172 includes/view/User_view.php:366 +msgid "Day" +msgstr "Dia" + +#: includes/pages/admin_import.php:155 includes/pages/admin_import.php:164 +#: includes/pages/admin_import.php:173 includes/pages/admin_shifts.php:324 +#: includes/view/Shifts_view.php:66 +msgid "Start" +msgstr "Início" + +#: includes/pages/admin_import.php:156 includes/pages/admin_import.php:165 +#: includes/pages/admin_import.php:174 includes/pages/admin_shifts.php:325 +#: includes/view/Shifts_view.php:74 +msgid "End" +msgstr "Fim" + +#: includes/pages/admin_import.php:157 includes/pages/admin_import.php:166 +#: includes/pages/admin_import.php:175 +msgid "Shift type" +msgstr "Tipo de turno" + +#: includes/pages/admin_import.php:159 includes/pages/admin_import.php:168 +#: includes/pages/admin_import.php:177 includes/pages/admin_shifts.php:321 +msgid "Room" +msgstr "Sala" + +#: includes/pages/admin_import.php:161 +msgid "Shifts to update" +msgstr "Turnos para atualizar" + +#: includes/pages/admin_import.php:170 +msgid "Shifts to delete" +msgstr "Turnos para deletar" + +#: includes/pages/admin_import.php:254 +msgid "It's done!" +msgstr "Está feito!" + +#: includes/pages/admin_log.php:4 +msgid "Log" +msgstr "Log" + +#: includes/pages/admin_news.php:10 +msgid "Edit news entry" +msgstr "Editar notícia" + +#: includes/pages/admin_news.php:31 +msgid "Author" +msgstr "Autor" + +#: includes/pages/admin_news.php:32 includes/pages/user_news.php:161 +msgid "Subject" +msgstr "Assunto" + +#: includes/pages/admin_news.php:33 includes/pages/user_messages.php:79 +#: includes/pages/user_news.php:106 includes/pages/user_news.php:162 +msgid "Message" +msgstr "Mensagem" + +#: includes/pages/admin_news.php:34 includes/pages/user_news.php:163 +msgid "Meeting" +msgstr "Reunião" + +#: includes/pages/admin_news.php:38 includes/pages/admin_rooms.php:177 +#: includes/view/User_view.php:129 +msgid "Delete" +msgstr "Apagar" + +#: includes/pages/admin_news.php:52 +msgid "News entry updated." +msgstr "Notícia atualizada." + +#: includes/pages/admin_news.php:61 +msgid "News entry deleted." +msgstr "Notícia deletada." + +#: includes/pages/admin_questions.php:4 +msgid "Answer questions" +msgstr "Responder perguntas" + +#: includes/pages/admin_questions.php:18 +msgid "There are unanswered questions!" +msgstr "Existem perguntas não respondidas!" + +#: includes/pages/admin_questions.php:61 +msgid "Unanswered questions" +msgstr "Perguntas não respondidas" + +#: includes/pages/admin_questions.php:63 includes/pages/admin_questions.php:70 +msgid "From" +msgstr "De" + +#: includes/pages/admin_questions.php:64 includes/pages/admin_questions.php:71 +#: includes/view/Questions_view.php:19 includes/view/Questions_view.php:24 +msgid "Question" +msgstr "Questão" + +#: includes/pages/admin_questions.php:65 includes/pages/admin_questions.php:73 +#: includes/view/Questions_view.php:26 +msgid "Answer" +msgstr "Resposta" + +#: includes/pages/admin_questions.php:68 includes/view/Questions_view.php:22 +msgid "Answered questions" +msgstr "Perguntas respondidas" + +#: includes/pages/admin_questions.php:72 includes/view/Questions_view.php:25 +msgid "Answered by" +msgstr "Respondido por" + +#: includes/pages/admin_rooms.php:4 includes/pages/user_shifts.php:159 +#: includes/sys_menu.php:176 +msgid "Rooms" +msgstr "Salas" + +#: includes/pages/admin_rooms.php:67 +msgid "This name is already in use." +msgstr "Este nome já está em uso." + +#: includes/pages/admin_rooms.php:97 +#, php-format +msgid "Please enter needed angels for type %s." +msgstr "Por favor insira os anjos necessários de tipo %s." + +#: includes/pages/admin_rooms.php:124 +msgid "Room saved." +msgstr "Sala salva" + +#: includes/pages/admin_rooms.php:145 includes/pages/admin_rooms.php:191 +msgid "Public" +msgstr "Público" + +#: includes/pages/admin_rooms.php:146 +msgid "Room number" +msgstr "Número da sala" + +#: includes/pages/admin_rooms.php:151 +msgid "Needed angels:" +msgstr "Anjos necessários:" + +#: includes/pages/admin_rooms.php:167 +#, php-format +msgid "Room %s deleted." +msgstr "Sala %s deletada." + +#: includes/pages/admin_rooms.php:175 +#, php-format +msgid "Do you want to delete room %s?" +msgstr "Você quer deletar as salas %s?" + +#: includes/pages/admin_rooms.php:185 +msgid "add" +msgstr "adicionar" + +#: includes/pages/admin_shifts.php:4 +msgid "Create shifts" +msgstr "Criar turnos" + +#: includes/pages/admin_shifts.php:71 +msgid "Please select a location." +msgstr "Por favor, selecione uma localização." + +#: includes/pages/admin_shifts.php:78 +msgid "Please select a start time." +msgstr "Por favor, selecione um horário de início." + +#: includes/pages/admin_shifts.php:85 +msgid "Please select an end time." +msgstr "Por favor, selecione um horário de término." + +#: includes/pages/admin_shifts.php:90 +msgid "The shifts end has to be after its start." +msgstr "O término do turno deve ser posterior ao seu início." + +#: includes/pages/admin_shifts.php:102 +msgid "Please enter a shift duration in minutes." +msgstr "Por favor insira a duração do turno em minutos." + +#: includes/pages/admin_shifts.php:110 +msgid "Please split the shift-change hours by colons." +msgstr "Por favor divida os horários de mudança de turno por vírgulas." + +#: includes/pages/admin_shifts.php:115 +msgid "Please select a mode." +msgstr "Por favor selecione um modo." + +#: includes/pages/admin_shifts.php:128 +#, php-format +msgid "Please check the needed angels for team %s." +msgstr "Por favor confira os anjos necessários para o time %s." + +#: includes/pages/admin_shifts.php:133 +msgid "There are 0 angels needed. Please enter the amounts of needed angels." +msgstr "" +"Há 0 anjos necessários. Por favor insira o número de anjos necessários." + +#: includes/pages/admin_shifts.php:137 +msgid "Please select a mode for needed angels." +msgstr "Por favor escolha um modo para os anjos necessários." + +#: includes/pages/admin_shifts.php:141 +msgid "Please select needed angels." +msgstr "Por favor selecione os anjos necessários." + +#: includes/pages/admin_shifts.php:268 +msgid "Time and location" +msgstr "Horário e localização" + +#: includes/pages/admin_shifts.php:269 +msgid "Type and title" +msgstr "Tipo e título" + +#: includes/pages/admin_shifts.php:326 +msgid "Mode" +msgstr "Modo" + +#: includes/pages/admin_shifts.php:327 +msgid "Create one shift" +msgstr "Criar um turno" + +#: includes/pages/admin_shifts.php:328 +msgid "Create multiple shifts" +msgstr "Criar múltiplos turnos" + +#: includes/pages/admin_shifts.php:330 +msgid "Create multiple shifts with variable length" +msgstr "Criar múltiplos turnos com duração variável" + +#: includes/pages/admin_shifts.php:331 +msgid "Shift change hours" +msgstr "Mudança de horário do turno" + +#: includes/pages/admin_shifts.php:335 +msgid "Take needed angels from room settings" +msgstr "Pegar os anjos necessários a partir das configurações das salas" + +#: includes/pages/admin_shifts.php:336 +msgid "The following angels are needed" +msgstr "Os seguintes anjos são necessários" + +#: includes/pages/admin_user.php:4 +msgid "All Angels" +msgstr "Todos os anjos" + +#: includes/pages/admin_user.php:20 +msgid "This user does not exist." +msgstr "Esse usuário não existe." + +#: includes/pages/admin_user.php:46 includes/view/AngelTypes_view.php:67 +#: includes/view/AngelTypes_view.php:68 includes/view/AngelTypes_view.php:69 +msgid "Yes" +msgstr "Sim" + +#: includes/pages/admin_user.php:47 includes/view/AngelTypes_view.php:67 +#: includes/view/AngelTypes_view.php:68 includes/view/AngelTypes_view.php:69 +msgid "No" +msgstr "Não" + +#: includes/pages/admin_user.php:60 +msgid "Force active" +msgstr "Forçar ativação" + +#: includes/pages/admin_user.php:79 +msgid "" +"Please visit the angeltypes page or the users profile to manage users " +"angeltypes." +msgstr "" +"Por favor visite a página de tipos de anjo ou o perfil do usuário para " +"gerenciar\n" +"seus tipos de anjo." + +#: includes/pages/admin_user.php:204 +msgid "Edit user" +msgstr "Editar usuário" + +#: includes/pages/guest_credits.php:3 +msgid "Credits" +msgstr "Créditos" + +#: includes/pages/guest_login.php:4 includes/pages/guest_login.php:349 +#: includes/pages/guest_login.php:356 includes/view/User_view.php:95 +#: includes/view/User_view.php:99 +msgid "Login" +msgstr "Login" + +#: includes/pages/guest_login.php:8 includes/pages/guest_login.php:285 +msgid "Register" +msgstr "Registrar" + +#: includes/pages/guest_login.php:12 +msgid "Logout" +msgstr "Logout" + +#: includes/pages/guest_login.php:56 +#, php-format +msgid "Your nick "%s" already exists." +msgstr "Seu apelido "%s" já existe." + +#: includes/pages/guest_login.php:60 +#, php-format +msgid "Your nick "%s" is too short (min. 2 characters)." +msgstr "Seu apelido "%s" é muito pequeno (mínimo 2 caracteres)." + +#: includes/pages/guest_login.php:86 includes/pages/user_settings.php:36 +msgid "Please check your jabber account information." +msgstr "Por favor verifique a informação da sua conta jabber." + +#: includes/pages/guest_login.php:95 +msgid "Please select your shirt size." +msgstr "Por favor escolha o tamanho da camisa." + +#: includes/pages/guest_login.php:106 +#, php-format +msgid "Your password is too short (please use at least %s characters)." +msgstr "Sua senha é muito curta (por favor use pelo menos %s caracteres)." + +#: includes/pages/guest_login.php:115 includes/pages/user_settings.php:52 +msgid "" +"Please enter your planned date of arrival. It should be after the buildup " +"start date and before teardown end date." +msgstr "" +"Por favor insira a data planejada para sua chegada. Ela deve ser posterior à " +"data de montagem e anterior à data de desmontagem." + +#: includes/pages/guest_login.php:189 +msgid "Angel registration successful!" +msgstr "Conta criada com sucesso!" + +#: includes/pages/guest_login.php:217 +msgid "" +"By completing this form you're registering as a Chaos-Angel. This script " +"will create you an account in the angel task scheduler." +msgstr "" +"Ao completar esse formulário você estará se registrando como um voluntário. " +"Esse script criará uma conta no sistema." + +#: includes/pages/guest_login.php:229 includes/view/User_view.php:50 +#, php-format +msgid "" +"The %s is allowed to send me an email (e.g. when my shifts change)" +msgstr "" +"Permito que o %s me envie emails (por exemplo, quando meus turnos " +"mudam)" + +#: includes/pages/guest_login.php:230 includes/view/User_view.php:51 +msgid "Humans are allowed to send me an email (e.g. for ticket vouchers)" +msgstr "Permito que humanos me enviem emails (por exemplo, para um voucher)" + +#: includes/pages/guest_login.php:235 includes/view/User_view.php:43 +msgid "Planned date of arrival" +msgstr "Data planejada de chegada" + +#: includes/pages/guest_login.php:238 includes/view/User_view.php:54 +msgid "Shirt size" +msgstr "Tamanho da camiseta" + +#: includes/pages/guest_login.php:243 includes/pages/guest_login.php:355 +#: includes/view/User_view.php:98 includes/view/User_view.php:400 +msgid "Password" +msgstr "Senha" + +#: includes/pages/guest_login.php:246 includes/view/User_view.php:401 +msgid "Confirm password" +msgstr "Confirme a senha" + +#: includes/pages/guest_login.php:249 +msgid "What do you want to do?" +msgstr "O que você gostaria de fazer?" + +#: includes/pages/guest_login.php:249 +msgid "Description of job types" +msgstr "Descrição dos trabalhos" + +#: includes/pages/guest_login.php:250 +msgid "" +"Restricted angel types need will be confirmed later by a supporter. You can " +"change your selection in the options section." +msgstr "" +"Tipos de anjo restritos precisam de confirmação posterior de um apoiador. " +"Você pode \n" +"mudar sua seleção na seção 'Opções'." + +#: includes/pages/guest_login.php:258 includes/view/User_view.php:48 +msgid "Mobile" +msgstr "Celular" + +#: includes/pages/guest_login.php:261 includes/view/User_view.php:46 +msgid "Phone" +msgstr "Telefone" + +#: includes/pages/guest_login.php:267 includes/view/User_view.php:42 +msgid "First name" +msgstr "Nome" + +#: includes/pages/guest_login.php:270 includes/view/User_view.php:41 +msgid "Last name" +msgstr "Sobrenome" + +#: includes/pages/guest_login.php:275 includes/view/User_view.php:45 +msgid "Age" +msgstr "Idade" + +#: includes/pages/guest_login.php:278 includes/view/User_view.php:53 +msgid "Hometown" +msgstr "Cidade" + +#: includes/pages/guest_login.php:281 includes/view/User_view.php:39 +msgid "Entry required!" +msgstr "Campo necessário!" + +#: includes/pages/guest_login.php:319 +msgid "auth.no-password" +msgstr "Por favor digite uma senha." + +#: includes/pages/guest_login.php:323 +msgid "auth.not-found" +msgstr "" +"Nenhum usuário foi encontrado. Por favor tente novamente. \n" +"Se você continuar com problemas, pergunte a um Dispatcher." + +#: includes/pages/guest_login.php:327 +msgid "auth.no-nickname" +msgstr "Por favor digite um apelido." + +#: includes/pages/guest_login.php:358 includes/view/User_view.php:101 +msgid "I forgot my password" +msgstr "Esqueci minha senha" + +#: includes/pages/guest_login.php:363 includes/view/User_view.php:103 +msgid "Please note: You have to activate cookies!" +msgstr "Nota: você precisa habilitar cookies!" + +#: includes/pages/guest_login.php:374 includes/view/User_view.php:107 +msgid "What can I do?" +msgstr "O que posso fazer?" + +#: includes/pages/guest_login.php:375 includes/view/User_view.php:108 +msgid "Please read about the jobs you can do to help us." +msgstr "Por favor leia sobre as tarefas que pode realizar para nos ajudar." + +#: includes/pages/guest_login.php:390 +msgid "Please sign up, if you want to help us!" +msgstr "Se você quer nos ajudar, por favor se registre!" + +#: includes/pages/user_messages.php:4 +msgid "Messages" +msgstr "Mensagens" + +#: includes/pages/user_messages.php:26 +msgid "Select recipient..." +msgstr "Selecionar recipiente..." + +#: includes/pages/user_messages.php:62 +msgid "mark as read" +msgstr "marcar como lido" + +#: includes/pages/user_messages.php:65 +msgid "delete message" +msgstr "apagar mensagem" + +#: includes/pages/user_messages.php:72 +#, php-format +msgid "Hello %s, here can you leave messages for other angels" +msgstr "Oi %s, aqui você pode deixar mensagens para outros anjos." + +#: includes/pages/user_messages.php:75 +msgid "New" +msgstr "Nova" + +#: includes/pages/user_messages.php:77 +msgid "Transmitted" +msgstr "Enviado" + +#: includes/pages/user_messages.php:78 +msgid "Recipient" +msgstr "Recipiente" + +#: includes/pages/user_messages.php:90 includes/pages/user_messages.php:106 +msgid "Incomplete call, missing Message ID." +msgstr "Chamada incompleta, falta o ID da Mensagem." + +#: includes/pages/user_messages.php:98 includes/pages/user_messages.php:114 +msgid "No Message found." +msgstr "Nenhuma mensagem encontrada." + +#: includes/pages/user_messages.php:122 +msgid "Transmitting was terminated with an Error." +msgstr "Transmissão encerrada com um erro." + +#: includes/pages/user_messages.php:127 +msgid "Wrong action." +msgstr "Ação errada." + +#: includes/pages/user_myshifts.php:23 +msgid "Key changed." +msgstr "Chave modificada." + +#: includes/pages/user_myshifts.php:26 includes/view/User_view.php:335 +msgid "Reset API key" +msgstr "Resetar a chave API" + +#: includes/pages/user_myshifts.php:27 +msgid "" +"If you reset the key, the url to your iCal- and JSON-export and your atom " +"feed changes! You have to update it in every application using one of these " +"exports." +msgstr "" +"Se você reconfigurar a chave, as urls para seu iCal, a exportação em formato " +"JSON \n" +"e seu feed atom será alterada! Você precisará atualizá-las em todas as " +"aplicações que estiverem \n" +"usando uma delas." + +#: includes/pages/user_myshifts.php:28 +msgid "Continue" +msgstr "Continuar" + +#: includes/pages/user_myshifts.php:60 +msgid "Please enter a freeload comment!" +msgstr "Por favor insira um comentário freeload!" + +#: includes/pages/user_myshifts.php:79 +msgid "Shift saved." +msgstr "Turno salvo." + +#: includes/pages/user_myshifts.php:107 +msgid "Shift canceled." +msgstr "Turno cancelado." + +#: includes/pages/user_myshifts.php:109 +msgid "" +"It's too late to sign yourself off the shift. If neccessary, ask the " +"dispatcher to do so." +msgstr "" +"Está muito tarde para se retirar deste turno. Se necessário, peça a \n" +"um dispatcher para removê-lo." + +#: includes/pages/user_news.php:4 +msgid "News comments" +msgstr "Novos comentários" + +#: includes/pages/user_news.php:8 +msgid "News" +msgstr "Novidades" + +#: includes/pages/user_news.php:12 +msgid "Meetings" +msgstr "Encontros" + +#: includes/pages/user_news.php:68 +msgid "Comments" +msgstr "Comentários" + +#: includes/pages/user_news.php:86 includes/pages/user_news.php:127 +msgid "Entry saved." +msgstr "Entrada salva." + +#: includes/pages/user_news.php:104 +msgid "New Comment:" +msgstr "Novo comentário:" + +#: includes/pages/user_news.php:110 +msgid "Invalid request." +msgstr "Requisição inválida." + +#: includes/pages/user_news.php:158 +msgid "Create news:" +msgstr "Criar novidades:" + +#: includes/pages/user_questions.php:4 includes/view/Questions_view.php:29 +msgid "Ask the Heaven" +msgstr "Pergunte ao paraíso" + +#: includes/pages/user_questions.php:27 +msgid "Unable to save question." +msgstr "Não foi possível salvar a sua pergunta." + +#: includes/pages/user_questions.php:29 +msgid "You question was saved." +msgstr "Sua pergunta foi salva." + +#: includes/pages/user_questions.php:33 +msgid "Please enter a question!" +msgstr "Por favor digite sua dúvida!" + +#: includes/pages/user_questions.php:41 +msgid "Incomplete call, missing Question ID." +msgstr "Chamada incompletada, falta o ID da pergunta." + +#: includes/pages/user_questions.php:50 +msgid "No question found." +msgstr "Nenhuma dúvida encontrada." + +#: includes/pages/user_settings.php:4 includes/view/User_view.php:332 +msgid "Settings" +msgstr "Configurações" + +#: includes/pages/user_settings.php:62 +msgid "" +"Please enter your planned date of departure. It should be after your planned " +"arrival date and after buildup start date and before teardown end date." +msgstr "" +"Por favor digite sua data de saída. Ela deve ser posterior à data de " +"chegada\n" +"e ao início da montagem, e anterior à data de desmontagem." + +#: includes/pages/user_settings.php:93 +msgid "-> not OK. Please try again." +msgstr "-> não OK. Por favor tente novamente." + +#: includes/pages/user_settings.php:101 +msgid "Failed setting password." +msgstr "A alteração da senha falhaou." + +#: includes/pages/user_settings.php:126 +msgid "Theme changed." +msgstr "Tema alterado." + +#: includes/pages/user_shifts.php:82 +msgid "The administration has not configured any rooms yet." +msgstr "O administrador não configurou nenhuma sala ainda." + +#: includes/pages/user_shifts.php:94 +msgid "The administration has not configured any shifts yet." +msgstr "O administrador não configurou nenhum turno ainda." + +#: includes/pages/user_shifts.php:104 +msgid "" +"The administration has not configured any angeltypes yet - or you are not " +"subscribed to any angeltype." +msgstr "" +"O administrador ainda não configurou os tipos de anjos - ou você não está\n" +"inscrito em nenhum tipo de anjo." + +#: includes/pages/user_shifts.php:142 +msgid "occupied" +msgstr "ocupado" + +#: includes/pages/user_shifts.php:146 +msgid "free" +msgstr "livre" + +#: includes/pages/user_shifts.php:165 +msgid "Occupancy" +msgstr "Ocupação" + +#: includes/pages/user_shifts.php:166 +msgid "" +"The tasks shown here are influenced by the angeltypes you joined already!" +msgstr "" +"As tarefas mostradas aqui são influenciadas pelos tipos de anjos de que você " +"já faz parte!" + +#: includes/pages/user_shifts.php:166 +msgid "Description of the jobs." +msgstr "Descrição dos trabalhos." + +#: includes/pages/user_shifts.php:168 +msgid "iCal export" +msgstr "Exportar iCal" + +#: includes/pages/user_shifts.php:168 +#, php-format +msgid "" +"Export of shown shifts. iCal format or JSON format available (please keep secret, otherwise reset the api key)." +msgstr "" +"Exportar os turnos mostrados. formato iCal ou formato JSON disponíveis (por favor mantenha secreto, ou resete a chave API)." + +#: includes/pages/user_shifts.php:169 +msgid "Filter" +msgstr "Filtro" + +#: includes/pages/user_shifts.php:191 includes/view/ShiftTypes_view.php:23 +msgid "All" +msgstr "Todos" + +#: includes/pages/user_shifts.php:192 +msgid "None" +msgstr "Nenhum" + +#: includes/sys_menu.php:139 +msgid "Admin" +msgstr "Admin" + +#: includes/sys_menu.php:163 +msgid "Manage rooms" +msgstr "Gerenciar salas" + +#: includes/sys_template.php:166 +msgid "No data found." +msgstr "Nenhum dado encontrado." + +#: includes/view/AngelTypes_view.php:27 includes/view/AngelTypes_view.php:244 +msgid "Unconfirmed" +msgstr "Não confirmado" + +#: includes/view/AngelTypes_view.php:29 includes/view/AngelTypes_view.php:33 +msgid "Supporter" +msgstr "Apoiador" + +#: includes/view/AngelTypes_view.php:31 includes/view/AngelTypes_view.php:35 +msgid "Member" +msgstr "Membro" + +#: includes/view/AngelTypes_view.php:42 +#, php-format +msgid "Do you want to delete angeltype %s?" +msgstr "Você deseja apagar o tipo de anjo %s?" + +#: includes/view/AngelTypes_view.php:44 includes/view/ShiftTypes_view.php:15 +#: includes/view/UserAngelTypes_view.php:8 +#: includes/view/UserAngelTypes_view.php:19 +#: includes/view/UserAngelTypes_view.php:30 +#: includes/view/UserAngelTypes_view.php:41 +#: includes/view/UserAngelTypes_view.php:52 +#: includes/view/UserAngelTypes_view.php:82 +msgid "cancel" +msgstr "cancelar" + +#: includes/view/AngelTypes_view.php:67 includes/view/AngelTypes_view.php:269 +msgid "Restricted" +msgstr "Restrito" + +#: includes/view/AngelTypes_view.php:68 +msgid "No Self Sign Up" +msgstr "Auto inscrição não permitida" + +#: includes/view/AngelTypes_view.php:69 +msgid "Requires driver license" +msgstr "Requer carteira de motorista" + +#: includes/view/AngelTypes_view.php:73 +msgid "" +"Restricted angel types can only be used by an angel if enabled by a " +"supporter (double opt-in)." +msgstr "" +"Tipos de anjo restritos só podem ser usados por um anjo quando autorizados " +"por \n" +"um apoiador (duplo opt-in)." + +#: includes/view/AngelTypes_view.php:74 includes/view/AngelTypes_view.php:205 +#: includes/view/ShiftTypes_view.php:37 includes/view/ShiftTypes_view.php:58 +#: includes/view/Shifts_view.php:92 +msgid "Description" +msgstr "Descrição" + +#: includes/view/AngelTypes_view.php:75 includes/view/ShiftTypes_view.php:38 +msgid "Please use markdown for the description." +msgstr "Por favor use markdown para a descrição." + +#: includes/view/AngelTypes_view.php:90 +msgid "my driving license" +msgstr "Minha carteira de motorista" + +#: includes/view/AngelTypes_view.php:97 +msgid "" +"This angeltype requires a driver license. Please enter your driver license " +"information!" +msgstr "" +"Esse tipo de anjo requer carteira de motorista. Por favor digite sua " +"carteira de motorista." + +#: includes/view/AngelTypes_view.php:101 +#, php-format +msgid "" +"You are unconfirmed for this angeltype. Please go to the introduction for %s " +"to get confirmed." +msgstr "" +"Você não está confirmado para esse tipo de anjo. Por favor vá para a " +"apresentação para %s\n" +"para ser confirmado." + +#: includes/view/AngelTypes_view.php:140 +msgid "confirm" +msgstr "confirmar" + +#: includes/view/AngelTypes_view.php:141 +msgid "deny" +msgstr "rejeitar" + +#: includes/view/AngelTypes_view.php:157 +msgid "remove" +msgstr "remover" + +#: includes/view/AngelTypes_view.php:179 +msgid "Driver" +msgstr "Motorista" + +#: includes/view/AngelTypes_view.php:180 +msgid "Has car" +msgstr "Tem carro" + +#: includes/view/AngelTypes_view.php:181 +#: includes/view/UserDriverLicenses_view.php:27 +msgid "Car" +msgstr "Carro" + +#: includes/view/AngelTypes_view.php:182 +msgid "3,5t Transporter" +msgstr "Transporte 3,5t" + +#: includes/view/AngelTypes_view.php:183 +msgid "7,5t Truck" +msgstr "Caminhão 7,5t" + +#: includes/view/AngelTypes_view.php:184 +msgid "12,5t Truck" +msgstr "Caminhão 12,5t" + +#: includes/view/AngelTypes_view.php:185 +#: includes/view/UserDriverLicenses_view.php:31 +msgid "Forklift" +msgstr "Empilhadeira" + +#: includes/view/AngelTypes_view.php:215 +msgid "Supporters" +msgstr "Apoiadores" + +#: includes/view/AngelTypes_view.php:235 +msgid "Members" +msgstr "Membros" + +#: includes/view/AngelTypes_view.php:238 +#: includes/view/UserAngelTypes_view.php:72 +msgid "Add" +msgstr "Adicionar" + +#: includes/view/AngelTypes_view.php:246 +msgid "confirm all" +msgstr "confirmar todos" + +#: includes/view/AngelTypes_view.php:247 +msgid "deny all" +msgstr "rejeitar todos" + +#: includes/view/AngelTypes_view.php:264 +msgid "New angeltype" +msgstr "Novo tipo de anjo" + +#: includes/view/AngelTypes_view.php:270 +msgid "Self Sign Up Allowed" +msgstr "Auto Inscrição autorizada" + +#: includes/view/AngelTypes_view.php:271 +msgid "Membership" +msgstr "Membro" + +#: includes/view/AngelTypes_view.php:296 +msgid "" +"This angeltype is restricted by double-opt-in by a team supporter. Please " +"show up at the according introduction meetings." +msgstr "" +"Esse tipo de anjo é restrito por um opt-in duplo por um time de apoio. Por " +"favor\n" +"compareça de acordo com os encontros de introdução." + +#: includes/view/AngelTypes_view.php:317 +msgid "FAQ" +msgstr "FAQ" + +#: includes/view/AngelTypes_view.php:319 +msgid "" +"Here is the list of teams and their tasks. If you have questions, read the " +"FAQ." +msgstr "" +"Aqui está uma lista dos times e suas tarefas. Se você tem dúvidas, leia a\n" +"FAQ." + +#: includes/view/EventConfig_view.php:10 includes/view/EventConfig_view.php:18 +#, php-format +msgid "Welcome to the %s!" +msgstr "Bem vindo a %s!" + +#: includes/view/EventConfig_view.php:24 +msgid "Buildup starts" +msgstr "Início da montagem" + +#: includes/view/EventConfig_view.php:26 includes/view/EventConfig_view.php:34 +#: includes/view/EventConfig_view.php:42 includes/view/EventConfig_view.php:50 +#: includes/view/EventConfig_view.php:67 includes/view/EventConfig_view.php:72 +#: includes/view/EventConfig_view.php:77 includes/view/Shifts_view.php:68 +#: includes/view/Shifts_view.php:76 +msgid "Y-m-d" +msgstr "d/m/Y" + +#: includes/view/EventConfig_view.php:32 +msgid "Event starts" +msgstr "O evento começa em" + +#: includes/view/EventConfig_view.php:40 +msgid "Event ends" +msgstr "O evento termina em" + +#: includes/view/EventConfig_view.php:48 +msgid "Teardown ends" +msgstr "Desmontagem termina" + +#: includes/view/EventConfig_view.php:67 +#, php-format +msgid "%s, from %s to %s" +msgstr "%s, de %s para %s" + +#: includes/view/EventConfig_view.php:72 +#, php-format +msgid "%s, starting %s" +msgstr "%s, começando %s" + +#: includes/view/EventConfig_view.php:77 +#, php-format +msgid "Event from %s to %s" +msgstr "Evento de %s para %s" + +#: includes/view/EventConfig_view.php:106 +msgid "Event Name" +msgstr "Nome do evento" + +#: includes/view/EventConfig_view.php:107 +msgid "Event Name is shown on the start page." +msgstr "Nome do evento é mostrado na página inicial." + +#: includes/view/EventConfig_view.php:108 +msgid "Event Welcome Message" +msgstr "Mensagem de boas vindas do evento" + +#: includes/view/EventConfig_view.php:109 +msgid "" +"Welcome message is shown after successful registration. You can use markdown." +msgstr "" +"A mensagem de boas vindas é mostrada após a inscrição. Você pode usar " +"markdown." + +#: includes/view/EventConfig_view.php:112 +msgid "Buildup date" +msgstr "Data da montagem" + +#: includes/view/EventConfig_view.php:113 +msgid "Event start date" +msgstr "Data de início do evento" + +#: includes/view/EventConfig_view.php:116 +msgid "Teardown end date" +msgstr "Data da desmontagem" + +#: includes/view/EventConfig_view.php:117 +msgid "Event end date" +msgstr "Data de término do evento" + +#: includes/view/Questions_view.php:17 +msgid "Open questions" +msgstr "Dúvidas abertas" + +#: includes/view/Questions_view.php:31 +msgid "Your Question:" +msgstr "Sua dúvida:" + +#: includes/view/ShiftCalendarRenderer.php:209 includes/view/User_view.php:367 +msgid "Time" +msgstr "Hora" + +#: includes/view/ShiftCalendarRenderer.php:248 +msgid "Your shift" +msgstr "Seu turno" + +#: includes/view/ShiftCalendarRenderer.php:249 +msgid "Help needed" +msgstr "Necessita ajuda" + +#: includes/view/ShiftCalendarRenderer.php:250 +msgid "Other angeltype needed / collides with my shifts" +msgstr "Outro tipo de anjo necessário / colide com seus turnos" + +#: includes/view/ShiftCalendarRenderer.php:251 +msgid "Shift is full" +msgstr "O turno está lotado" + +#: includes/view/ShiftCalendarRenderer.php:252 +msgid "Shift running/ended" +msgstr "Turno em andamento/finalizado" + +#: includes/view/ShiftCalendarShiftRenderer.php:96 +msgid "Add more angels" +msgstr "Adicionar mais anjos" + +#: includes/view/ShiftCalendarShiftRenderer.php:127 +#, php-format +msgid "%d helper needed" +msgid_plural "%d helpers needed" +msgstr[0] "%d necessita de ajuda" +msgstr[1] "%d necessitam de ajuda" + +#: includes/view/ShiftCalendarShiftRenderer.php:132 +#: includes/view/Shifts_view.php:23 +msgid "Sign up" +msgstr "Registrar" + +#: includes/view/ShiftCalendarShiftRenderer.php:137 +msgid "ended" +msgstr "encerrado" + +#: includes/view/ShiftCalendarShiftRenderer.php:146 +#: includes/view/Shifts_view.php:25 +#, php-format +msgid "Become %s" +msgstr "Tornar-se %s" + +#: includes/view/ShiftEntry_view.php:18 includes/view/User_view.php:267 +#: includes/view/User_view.php:269 +msgid "Freeloaded" +msgstr "Freeloaded" + +#: includes/view/ShiftEntry_view.php:19 +msgid "Freeload comment (Only for shift coordination):" +msgstr "Comentário freeload (Apenas para coordenação de turno):" + +#: includes/view/ShiftEntry_view.php:22 +msgid "Edit shift entry" +msgstr "Editar entrada de turno" + +#: includes/view/ShiftEntry_view.php:25 +msgid "Angel:" +msgstr "Anjo:" + +#: includes/view/ShiftEntry_view.php:26 +msgid "Date, Duration:" +msgstr "Data, Duração:" + +#: includes/view/ShiftEntry_view.php:27 +msgid "Location:" +msgstr "Local:" + +#: includes/view/ShiftEntry_view.php:28 +msgid "Title:" +msgstr "Título:" + +#: includes/view/ShiftEntry_view.php:29 +msgid "Type:" +msgstr "Tipo:" + +#: includes/view/ShiftEntry_view.php:30 +msgid "Comment (for your eyes only):" +msgstr "Comentário (apenas para ler):" + +#: includes/view/ShiftTypes_view.php:13 +#, php-format +msgid "Do you want to delete shifttype %s?" +msgstr "Você quer apagar o turno %s?" + +#: includes/view/ShiftTypes_view.php:29 +msgid "Edit shifttype" +msgstr "Editar tipo de turno" + +#: includes/view/ShiftTypes_view.php:29 +msgid "Create shifttype" +msgstr "Criar tipo de turno" + +#: includes/view/ShiftTypes_view.php:48 +#, php-format +msgid "for team %s" +msgstr "para o time %s" + +#: includes/view/ShiftTypes_view.php:75 +msgid "New shifttype" +msgstr "Novo tipo de turno" + +#: includes/view/Shifts_view.php:7 +#, php-format +msgid "created at %s by %s" +msgstr "criado em %s por %s" + +#: includes/view/Shifts_view.php:10 +#, php-format +msgid "edited at %s by %s" +msgstr "editado em %s por %s" + +#: includes/view/Shifts_view.php:52 +msgid "This shift collides with one of your shifts." +msgstr "Esse turno colide com um dos seus outros turnos." + +#: includes/view/Shifts_view.php:53 +msgid "You are signed up for this shift." +msgstr "Você foi designado para esse turno." + +#: includes/view/Shifts_view.php:82 includes/view/User_view.php:368 +msgid "Location" +msgstr "Local" + +#: includes/view/UserAngelTypes_view.php:6 +#, php-format +msgid "Do you really want to add supporter rights for %s to %s?" +msgstr "Você realmente quer dar permissão de apoiador de %s para %s?" + +#: includes/view/UserAngelTypes_view.php:6 +#, php-format +msgid "Do you really want to remove supporter rights for %s from %s?" +msgstr "Você realmente quer remover a permissão de apoiador de %s para %s?" + +#: includes/view/UserAngelTypes_view.php:17 +#, php-format +msgid "Do you really want to deny all users for %s?" +msgstr "Você realmente quer negar todos os usuários para %s?" + +#: includes/view/UserAngelTypes_view.php:28 +#, php-format +msgid "Do you really want to confirm all users for %s?" +msgstr "Você realmente quer confirmar todos os usuários para %s?" + +#: includes/view/UserAngelTypes_view.php:39 +#, php-format +msgid "Do you really want to confirm %s for %s?" +msgstr "Você realmente quer confirmar %s para %s?" + +#: includes/view/UserAngelTypes_view.php:50 +#, php-format +msgid "Do you really want to delete %s from %s?" +msgstr "Você realmente quer apagar %s de %s?" + +#: includes/view/UserAngelTypes_view.php:71 +msgid "User" +msgstr "Usuário" + +#: includes/view/UserAngelTypes_view.php:80 +#, php-format +msgid "Do you really want to add %s to %s?" +msgstr "Você realmente quer adicionar %s em %s?" + +#: includes/view/UserAngelTypes_view.php:83 +msgid "save" +msgstr "salvar" + +#: includes/view/UserDriverLicenses_view.php:17 +msgid "Back to profile" +msgstr "Voltar para o perfil" + +#: includes/view/UserDriverLicenses_view.php:21 +msgid "Privacy" +msgstr "Privacidade" + +#: includes/view/UserDriverLicenses_view.php:21 +msgid "" +"Your driving license information is only visible for supporters and admins." +msgstr "" +"Os dados da sua carteira de motorista são apenas visíveis para os apoiadores " +"e os admins." + +#: includes/view/UserDriverLicenses_view.php:22 +msgid "I am willing to drive a car for the event" +msgstr "Eu desejo dirigir carros para o evento" + +#: includes/view/UserDriverLicenses_view.php:25 +msgid "" +"I have my own car with me and am willing to use it for the event (You'll get " +"reimbursed for fuel)" +msgstr "" +"Eu tenho meu próprio carro e estou disposto a usá-lo no evento\n" +"(Você terá o combustível reembolsado)" + +#: includes/view/UserDriverLicenses_view.php:26 +msgid "Driver license" +msgstr "Carteira de motorista" + +#: includes/view/UserDriverLicenses_view.php:28 +msgid "Transporter 3,5t" +msgstr "Transportador 3,5t" + +#: includes/view/UserDriverLicenses_view.php:29 +msgid "Truck 7,5t" +msgstr "Caminhão 7,5t" + +#: includes/view/UserDriverLicenses_view.php:30 +msgid "Truck 12,5t" +msgstr "Caminhão 12,5t" + +#: includes/view/User_view.php:7 +msgid "Please select..." +msgstr "Por favor selecione..." + +#: includes/view/User_view.php:38 +msgid "Here you can change your user details." +msgstr "Aqui você pode mudar os seus detalhes de usuário." + +#: includes/view/User_view.php:44 +msgid "Planned date of departure" +msgstr "Data planejada para saída" + +#: includes/view/User_view.php:55 +msgid "Please visit the angeltypes page to manage your angeltypes." +msgstr "" +"Por favor visite a página de tipos de anjo para gerenciar os tipos de anjo" + +#: includes/view/User_view.php:61 +msgid "Here you can change your password." +msgstr "Aqui você pode mudar sua senha." + +#: includes/view/User_view.php:62 +msgid "Old password:" +msgstr "Senha antiga:" + +#: includes/view/User_view.php:63 +msgid "New password:" +msgstr "Nova senha:" + +#: includes/view/User_view.php:64 +msgid "Password confirmation:" +msgstr "Confirmação de senha:" + +#: includes/view/User_view.php:68 +msgid "Here you can choose your color settings:" +msgstr "Aqui você pode selecionar sua configuração de cor:" + +#: includes/view/User_view.php:69 +msgid "Color settings:" +msgstr "Configuração de cor:" + +#: includes/view/User_view.php:73 +msgid "Here you can choose your language:" +msgstr "Aqui você pode selecionar seu idioma:" + +#: includes/view/User_view.php:74 +msgid "Language:" +msgstr "Idioma:" + +#: includes/view/User_view.php:88 +msgid "Registration successful" +msgstr "Registrado com sucesso" + +#: includes/view/User_view.php:126 +msgid "" +"Do you really want to delete the user including all his shifts and every " +"other piece of his data?" +msgstr "" +"Você realmente quer apagar o usuário, incluindo todos seus turnos e todos\n" +"os seus dados?" + +#: includes/view/User_view.php:128 +msgid "Your password" +msgstr "Sua senha" + +#: includes/view/User_view.php:143 +#, php-format +msgid "Angel should receive at least %d vouchers." +msgstr "Um anjo deve receber no mínimo %d vouchers." + +#: includes/view/User_view.php:145 +msgid "Number of vouchers given out" +msgstr "Número de vouchers dados" + +#: includes/view/User_view.php:159 +msgid "m/d/Y h:i a" +msgstr "d/m/Y H:i" + +#: includes/view/User_view.php:178 +msgid "New user" +msgstr "Novo usuário" + +#: includes/view/User_view.php:182 +msgid "Prename" +msgstr "Nome" + +#: includes/view/User_view.php:185 includes/view/User_view.php:350 +msgid "Arrived" +msgstr "Chegou" + +#: includes/view/User_view.php:186 +msgid "Voucher" +msgstr "Voucher" + +#: includes/view/User_view.php:187 +msgid "Freeloads" +msgstr "Freeloads" + +#: includes/view/User_view.php:188 includes/view/User_view.php:352 +msgid "Active" +msgstr "Ativo" + +#: includes/view/User_view.php:190 includes/view/User_view.php:353 +msgid "T-Shirt" +msgstr "Camiseta" + +#: includes/view/User_view.php:192 +msgid "Last login" +msgstr "Último login" + +#: includes/view/User_view.php:209 +msgid "Free" +msgstr "Livre" + +#: includes/view/User_view.php:214 includes/view/User_view.php:216 +#, php-format +msgid "Next shift %c" +msgstr "Próximo turno %c" + +#: includes/view/User_view.php:221 +#, php-format +msgid "Shift starts %c" +msgstr "Turno inicia em %c" + +#: includes/view/User_view.php:223 +#, php-format +msgid "Shift ends %c" +msgstr "Turno termina em %c" + +#: includes/view/User_view.php:280 +msgid "sign off" +msgstr "sair" + +#: includes/view/User_view.php:305 +msgid "Sum:" +msgstr "Soma:" + +#: includes/view/User_view.php:329 +msgid "driving license" +msgstr "carteira de motorista" + +#: includes/view/User_view.php:331 +msgid "Edit vouchers" +msgstr "Editar vouchers" + +#: includes/view/User_view.php:333 +msgid "iCal Export" +msgstr "Exportar iCal" + +#: includes/view/User_view.php:334 +msgid "JSON Export" +msgstr "Exportar em formato JSON" + +#: includes/view/User_view.php:347 +msgid "User state" +msgstr "Status" + +#: includes/view/User_view.php:350 +#, php-format +msgid "Arrived at %s" +msgstr "Chegous às %s" + +#: includes/view/User_view.php:350 +#, php-format +msgid "Not arrived (Planned: %s)" +msgstr "Não chegou (Planejado: %s)" + +#: includes/view/User_view.php:350 +msgid "Not arrived" +msgstr "Não chegou" + +#: includes/view/User_view.php:351 +#, php-format +msgid "Got %s voucher" +msgid_plural "Got %s vouchers" +msgstr[0] "Einen Voucher bekommen" +msgstr[1] "%s Voucher bekommen" + +#: includes/view/User_view.php:351 +msgid "Got no vouchers" +msgstr "Pegou voucher %s" + +#: includes/view/User_view.php:360 +msgid "Rights" +msgstr "Permissões" + +#: includes/view/User_view.php:369 +msgid "Name & workmates" +msgstr "Nome & colegas" + +#: includes/view/User_view.php:370 +msgid "Comment" +msgstr "Comentar" + +#: includes/view/User_view.php:371 +msgid "Action" +msgstr "Ação" + +#: includes/view/User_view.php:373 +#, php-format +msgid "Your night shifts between %d and %d am count twice." +msgstr "Os seus turnos noturnos entre %dh e %dh contam como dois." + +#: includes/view/User_view.php:374 +#, php-format +msgid "" +"Go to the shifts table to sign yourself up for some " +"shifts." +msgstr "" +"Vá para a tabela de turnos para se inscrever em alguns\n" +"turnos." + +#: includes/view/User_view.php:384 +msgid "" +"We will send you an e-mail with a password recovery link. Please use the " +"email address you used for registration." +msgstr "" +"Nós enviaremos um email com um link para recuperação de senha. Por favor use " +"o \n" +"endereço de email informado no seu registro." + +#: includes/view/User_view.php:387 +msgid "Recover" +msgstr "Recuperar" + +#: includes/view/User_view.php:398 +msgid "Please enter a new password." +msgstr "Por favor digite uma nova senha." + +#: includes/view/User_view.php:447 +msgid "" +"Please enter your planned date of departure on your settings page to give us " +"a feeling for teardown capacities." +msgstr "" +"Por favor digite sua data planejada de saída na sua página de configurações " +"para\n" +"termos uma noção da nossa capacidade de desmontagem." + +#: includes/view/User_view.php:457 +#, php-format +msgid "" +"You freeloaded at least %s shifts. Shift signup is locked. Please go to " +"heavens desk to be unlocked again." +msgstr "" +"Você deixou de participar de pelo menos %s dos turnos. O registro em turnos " +"está suspenso.\n" +"Por favor vá até a mesa do paraíso para ser desbloqueado novamente." + +#: includes/view/User_view.php:468 +msgid "" +"You are not marked as arrived. Please go to heaven's desk, get your angel " +"badge and/or tell them that you arrived already." +msgstr "" +"Sua chegada não foi marcada. Por favor vá até a mesa do paraíso, pegue sua " +"credencial\n" +"de anjo e/ou informe que você já chegou." + +#: includes/view/User_view.php:478 +msgid "You need to specify a tshirt size in your settings!" +msgstr "Você precisa especificar o tamanho de camiseta nas suas configurações!" + +#: includes/view/User_view.php:488 +msgid "" +"You need to specify a DECT phone number in your settings! If you don't have " +"a DECT phone, just enter \"-\"." +msgstr "" +"Você precisa especificar um número DECT de telefone nas suas configuracões!\n" +"Se você não tem um telefone DECT, apenas digite \\-\\." + +#: public/index.php:155 +msgid "No Access" +msgstr "Sem acesso" + +#: public/index.php:156 +msgid "" +"You don't have permission to view this page. You probably have to sign in or " +"register in order to gain access!" +msgstr "" +"Você não tem permissão para ver essa página. Você provavelmente terá que " +"fazer login ou se registrar para ganhar acesso!" + +#~ msgid "Registration is disabled." +#~ msgstr "Registros estão desabilitados." + +#~ msgid "Please enter your planned date of arrival." +#~ msgstr "Por favor digite seu horario planificado de chagada " + +#~ msgid "Password could not be updated." +#~ msgstr "Nao foi possivel atualizar a senha" + +#~ msgid "We got no information about the event right now." +#~ msgstr "Nao tem info sobre o evento agora" + +#~ msgid "from %s to %s" +#~ msgstr "desde %s ate %s" + +#~ msgid "Please enter your planned date of departure." +#~ msgstr "Por favor pone seu horario planificado de ida" + +#~ msgid "Please select a user." +#~ msgstr "Seleciona um usuario" + +#~ msgid "Unable to load user." +#~ msgstr "Nao foi possivel carregar o usuario" + +#~ msgid "Entries" +#~ msgstr "Entradas" + +#~ msgid "Use new style if possible" +#~ msgstr "Usa umo estilo novo se possivel" + +#~ msgid "Coordinator" +#~ msgstr "Coordinador" + +#~ msgid "Coordinators" +#~ msgstr "Coordinadores" + +#~ msgid " vouchers." +#~ msgstr " vouchers." + +#~ msgid "" +#~ "This is a automatically calculated MINIMUM value, you can of course give " +#~ "out more if appropriate!" +#~ msgstr "" +#~ "Esso e' calucula automaticamente o valor MINIMO, voce pode claramente " +#~ "mudar isso com umo mais appropriado! " + +#~ msgid "You have been signed off from the shift." +#~ msgstr "Voce se desconnecto do seu turno" + +#~ msgid "planned departure" +#~ msgstr "saida planejada" + +#~ msgid "Tasks" +#~ msgstr "tarefas" + +#~ msgid "User didnt got vouchers." +#~ msgstr "O usuario nao tem vouchers." + +#~ msgid "Remove vouchers" +#~ msgstr "Apaga voucher" + +#~ msgid "" +#~ "This shift is running now or ended already. Please contact a dispatcher " +#~ "to join the shift." +#~ msgstr "" +#~ "Esse turno esta ativo agora o ja acabou. Por favor contata o coordinador " +#~ "para partecipar nesse turno" + +#~ msgid "" +#~ "You already subscribed to shift in the same timeslot. Please contact a " +#~ "dispatcher to join the shift." +#~ msgstr "" +#~ "Voce ja se registrou al turno no mesmo timeslot. Por favor contata o " +#~ "coordinador para partecipar a esse turno." + +#~ msgid "" +#~ "Hello %s, here you can change your personal settings i.e. password, color " +#~ "settings etc." +#~ msgstr "" +#~ "Oi %s, aqui pode mudar as tuas configuraçeos pessoal (i.e. senha, " +#~ "cor, ...)" + +#~ msgid "Name/Description:" +#~ msgstr "Nome/Descriçao:" + +#~ msgid "Timeslot" +#~ msgstr "Timeslot" + +#~ msgid "The first wants to join %s." +#~ msgstr "O primeiro que quer partecipar %s" + +#~ msgid "Groups" +#~ msgstr "Grupos" + +#~ msgid "ICQ" +#~ msgstr "ICQ" + +#~ msgid "You are not confirmed for this angel type." +#~ msgstr "Voce nao ta confirmado por esse tipo de anjo." + +#~ msgid "Exports" +#~ msgstr "Esporta" + +#~ msgid "Add new angeltype" +#~ msgstr "Adicione um novo tipo de anjo" + +#~ msgid "Language" +#~ msgstr "Idioma" + +#~ msgid "You have %s new message." +#~ msgid_plural "You have %s new messages." +#~ msgstr[0] "Voce tem %s novo message" +#~ msgstr[1] "" + +#~ msgid "" +#~ "These are your shifts.
Please try to appear 15 minutes before " +#~ "your shift begins!
You can remove yourself from a shift up to %d " +#~ "hours before it starts." +#~ msgstr "" +#~ "Esses som teu turnos.
Por favor tenta chegar 15 minudos antes " +#~ "que seu turno comença!
Voce pode se tirar desse turno ate %d horas " +#~ "antes dele començar." + +#~ msgid "Page:" +#~ msgstr "Pagina" + +#~ msgid "Message:" +#~ msgstr "Messagem:" + +#~ msgid "Wakeup" +#~ msgstr "Wakeup" + +#~ msgid "Incomplete call, missing wake-up ID." +#~ msgstr "chamada incompleta, falta o wake-up ID" + +#~ msgid "Wake-up call deleted." +#~ msgstr "wake-up chamada apagada" + +#~ msgid "No wake-up found." +#~ msgstr "Nao encontrei nenhum wake-up" + +#~ msgid "" +#~ "Hello %s, here you can register for a wake-up call. Simply say when and " +#~ "where the angel should come to wake you." +#~ msgstr "" +#~ "Oi %s, aqui voce pode se registrar para a chamada wake-up. So tem que " +#~ "dizer quando e onde os anjos tem que chegar para te acordar (wake up)" + +#~ msgid "All ordered wake-up calls, next first." +#~ msgstr "Todos os ordem wake-up, o proximo primeiro" + +#~ msgid "Place" +#~ msgstr "Lugar" + +#~ msgid "Notes" +#~ msgstr "Notas" + +#~ msgid "Schedule a new wake-up here:" +#~ msgstr "Planifica um novo wake-up aqui:" + +#~ msgid "User %s confirmed as %s." +#~ msgstr "Usuario %s confirmado como %s" + +#~ msgid "" +#~ "Resistance is futile! Your biological and physical parameters will be " +#~ "added to our collectiv! Assimilating angel:" +#~ msgstr "" +#~ "Resistir e' inútil! Seus parâmetros biológico e físico serão adicionados " +#~ "dentro do nosso coletivo! Anjo assimilado: " + +#~ msgid "Confirmed all." +#~ msgstr "Tudo confirmado." + +#~ msgid "asdf" +#~ msgstr "asdf" diff --git a/resources/lang/pt_BR.UTF.8/LC_MESSAGES/pt_BR.mo b/resources/lang/pt_BR.UTF.8/LC_MESSAGES/pt_BR.mo deleted file mode 100644 index 95251feb..00000000 Binary files a/resources/lang/pt_BR.UTF.8/LC_MESSAGES/pt_BR.mo and /dev/null differ diff --git a/resources/lang/pt_BR.UTF.8/LC_MESSAGES/pt_BR.po b/resources/lang/pt_BR.UTF.8/LC_MESSAGES/pt_BR.po deleted file mode 100644 index e7307e5d..00000000 --- a/resources/lang/pt_BR.UTF.8/LC_MESSAGES/pt_BR.po +++ /dev/null @@ -1,2647 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: Engelsystem 2.0\n" -"POT-Creation-Date: 2017-04-25 05:23+0200\n" -"PO-Revision-Date: 2018-10-05 15:35+0200\n" -"Last-Translator: samba \n" -"Language-Team: \n" -"Language: pt_BR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.1\n" -"X-Poedit-KeywordsList: _;gettext;gettext_noop\n" -"X-Poedit-Basepath: ../../..\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Poedit-SourceCharset: UTF-8\n" -"X-Poedit-SearchPath-0: .\n" - -#: includes/controller/angeltypes_controller.php:7 -#: includes/pages/user_shifts.php:164 includes/view/AngelTypes_view.php:62 -#: includes/view/AngelTypes_view.php:86 includes/view/User_view.php:356 -msgid "Angeltypes" -msgstr "Tipo de Anjo" - -#: includes/controller/angeltypes_controller.php:53 -#: includes/pages/guest_login.php:377 includes/view/AngelTypes_view.php:265 -#: includes/view/AngelTypes_view.php:326 includes/view/User_view.php:110 -msgid "Teams/Job description" -msgstr "Time/Descrição do trabalho" - -#: includes/controller/angeltypes_controller.php:72 -#, php-format -msgid "Angeltype %s deleted." -msgstr "Tipo de anjo %s apagado." - -#: includes/controller/angeltypes_controller.php:77 -#: includes/view/AngelTypes_view.php:41 -#, php-format -msgid "Delete angeltype %s" -msgstr "Apagar tipo de anjo %s" - -#: includes/controller/angeltypes_controller.php:116 -msgid "Please check the name. Maybe it already exists." -msgstr "Por favor verifique o nome. Pode ser que já exista." - -#: includes/controller/angeltypes_controller.php:141 -#: includes/view/AngelTypes_view.php:60 -#, php-format -msgid "Edit %s" -msgstr "Editar %s" - -#: includes/controller/angeltypes_controller.php:162 -#: includes/view/AngelTypes_view.php:252 -#, php-format -msgid "Team %s" -msgstr "Time %s" - -#: includes/controller/angeltypes_controller.php:181 -#: includes/view/User_view.php:274 -msgid "view" -msgstr "ver" - -#: includes/controller/angeltypes_controller.php:185 -#: includes/pages/admin_free.php:71 includes/pages/admin_groups.php:23 -#: includes/pages/admin_rooms.php:16 includes/view/AngelTypes_view.php:107 -#: includes/view/ShiftTypes_view.php:55 includes/view/ShiftTypes_view.php:67 -#: includes/view/Shifts_view.php:55 includes/view/User_view.php:277 -#: includes/view/User_view.php:328 -msgid "edit" -msgstr "editar" - -#: includes/controller/angeltypes_controller.php:186 -#: includes/controller/shifts_controller.php:178 -#: includes/pages/admin_questions.php:42 includes/pages/admin_questions.php:56 -#: includes/pages/admin_rooms.php:17 includes/pages/admin_user.php:120 -#: includes/view/AngelTypes_view.php:45 includes/view/AngelTypes_view.php:110 -#: includes/view/Questions_view.php:5 includes/view/Questions_view.php:12 -#: includes/view/ShiftTypes_view.php:16 includes/view/ShiftTypes_view.php:56 -#: includes/view/ShiftTypes_view.php:68 includes/view/Shifts_view.php:56 -msgid "delete" -msgstr "deletar" - -#: includes/controller/angeltypes_controller.php:191 -#: includes/view/AngelTypes_view.php:103 includes/view/AngelTypes_view.php:288 -msgid "leave" -msgstr "sair" - -#: includes/controller/angeltypes_controller.php:193 -#: includes/view/AngelTypes_view.php:94 includes/view/AngelTypes_view.php:290 -msgid "join" -msgstr "entrar" - -#: includes/controller/angeltypes_controller.php:220 -#: includes/controller/user_angeltypes_controller.php:29 -#: includes/controller/user_angeltypes_controller.php:35 -#: includes/controller/user_angeltypes_controller.php:65 -#: includes/controller/user_angeltypes_controller.php:71 -#: includes/controller/user_angeltypes_controller.php:119 -#: includes/controller/user_angeltypes_controller.php:170 -#: includes/controller/user_angeltypes_controller.php:235 -msgid "Angeltype doesn't exist." -msgstr "Esse tipo de anjo não existe." - -#: includes/controller/event_config_controller.php:4 -msgid "Event config" -msgstr "Configuração do evento" - -#: includes/controller/event_config_controller.php:48 -msgid "Please enter buildup start date." -msgstr "Por favor digite a data de início da montagem." - -#: includes/controller/event_config_controller.php:52 -msgid "Please enter event start date." -msgstr "Por favor digite a data de início do evento." - -#: includes/controller/event_config_controller.php:56 -msgid "Please enter event end date." -msgstr "Por favor digite a data de término do evento." - -#: includes/controller/event_config_controller.php:60 -msgid "Please enter teardown end date." -msgstr "Por favor digite a data de desmontagem do evento" - -#: includes/controller/event_config_controller.php:66 -msgid "The buildup start date has to be before the event start date." -msgstr "A data de montagem deve ser anterior a data de início do evento." - -#: includes/controller/event_config_controller.php:71 -msgid "The event start date has to be before the event end date." -msgstr "" -"A data de início do evento deve ser anterior a data de término do evento." - -#: includes/controller/event_config_controller.php:76 -msgid "The event end date has to be before the teardown end date." -msgstr "A data de término deve ser anterior a data de desmontagem do evento." - -#: includes/controller/event_config_controller.php:81 -msgid "The buildup start date has to be before the teardown end date." -msgstr "A data de montagem deve ser anterior a data de desmontagem do evento." - -#: includes/controller/event_config_controller.php:92 -#: includes/pages/user_settings.php:77 -msgid "Settings saved." -msgstr "Configurações salvas." - -#: includes/controller/shift_entries_controller.php:56 -msgid "" -"You are not allowed to sign up for this shift. Maybe shift is full or " -"already running." -msgstr "" -"Você não tem permissão para se inscrever nesse turno. Talvez o turno esteja " -"lotado ou já esteja em andamento." - -#: includes/controller/shift_entries_controller.php:103 -msgid "You are subscribed. Thank you!" -msgstr "Você já está inscrito. Obrigado!" - -#: includes/controller/shift_entries_controller.php:103 -#: includes/pages/user_myshifts.php:4 -msgid "My shifts" -msgstr "Meus turnos" - -#: includes/controller/shift_entries_controller.php:111 -#: includes/view/User_view.php:348 -msgid "Freeloader" -msgstr "Freeloader" - -#: includes/controller/shift_entries_controller.php:180 -msgid "Shift entry deleted." -msgstr "O turno foi deletado." - -#: includes/controller/shift_entries_controller.php:182 -msgid "Entry not found." -msgstr "Entrada não encontrada." - -#: includes/controller/shifts_controller.php:63 -msgid "Please select a room." -msgstr "Por favor selecione uma sala." - -#: includes/controller/shifts_controller.php:70 -msgid "Please select a shifttype." -msgstr "Por favor selecione um tssipo de turno." - -#: includes/controller/shifts_controller.php:77 -msgid "Please enter a valid starting time for the shifts." -msgstr "Por favor entre com um horário de início válido para os turnos." - -#: includes/controller/shifts_controller.php:84 -msgid "Please enter a valid ending time for the shifts." -msgstr "Por favor entre com um horário de término válido para os turnos." - -#: includes/controller/shifts_controller.php:89 -msgid "The ending time has to be after the starting time." -msgstr "O horário de término deve ser após o horário de início." - -#: includes/controller/shifts_controller.php:97 -#, php-format -msgid "Please check your input for needed angels of type %s." -msgstr "Por favor verifique seu input para os anjos de tipo %s necessários." - -#: includes/controller/shifts_controller.php:120 -msgid "Shift updated." -msgstr "Turno atualizado." - -#: includes/controller/shifts_controller.php:135 -msgid "This page is much more comfortable with javascript." -msgstr "Esta página é muito mais confortável com javascript" - -#: includes/controller/shifts_controller.php:137 -#: includes/pages/admin_import.php:98 includes/pages/admin_shifts.php:319 -msgid "Shifttype" -msgstr "Tipo de turno" - -#: includes/controller/shifts_controller.php:138 -#: includes/pages/admin_import.php:158 includes/pages/admin_import.php:167 -#: includes/pages/admin_import.php:176 includes/pages/admin_shifts.php:320 -#: includes/view/Shifts_view.php:62 -msgid "Title" -msgstr "Título" - -#: includes/controller/shifts_controller.php:139 -msgid "Room:" -msgstr "Sala:" - -#: includes/controller/shifts_controller.php:140 -msgid "Start:" -msgstr "Início:" - -#: includes/controller/shifts_controller.php:141 -msgid "End:" -msgstr "Fim:" - -#: includes/controller/shifts_controller.php:142 -#: includes/pages/admin_shifts.php:270 includes/pages/admin_shifts.php:334 -#: includes/view/Shifts_view.php:88 -msgid "Needed angels" -msgstr "Anjos necessários" - -#: includes/controller/shifts_controller.php:144 -#: includes/pages/admin_groups.php:54 includes/pages/admin_news.php:35 -#: includes/pages/admin_questions.php:40 includes/pages/admin_rooms.php:157 -#: includes/pages/admin_shifts.php:272 includes/pages/user_messages.php:44 -#: includes/pages/user_news.php:107 includes/pages/user_news.php:164 -#: includes/view/AngelTypes_view.php:76 includes/view/EventConfig_view.php:122 -#: includes/view/Questions_view.php:32 includes/view/ShiftEntry_view.php:32 -#: includes/view/ShiftTypes_view.php:39 -#: includes/view/UserDriverLicenses_view.php:34 includes/view/User_view.php:56 -#: includes/view/User_view.php:65 includes/view/User_view.php:70 -#: includes/view/User_view.php:75 includes/view/User_view.php:146 -#: includes/view/User_view.php:402 -msgid "Save" -msgstr "Salvar" - -#: includes/controller/shifts_controller.php:172 -msgid "Shift deleted." -msgstr "Turno deletado." - -#: includes/controller/shifts_controller.php:177 -#, php-format -msgid "Do you want to delete the shift %s from %s to %s?" -msgstr "Você quer deletar o turno %s de %s para %s?" - -#: includes/controller/shifts_controller.php:195 -msgid "Shift could not be found." -msgstr "O turno não pôde ser encontrado." - -#: includes/controller/shifttypes_controller.php:31 -#, php-format -msgid "Shifttype %s deleted." -msgstr "Tipo de turno %s deletado." - -#: includes/controller/shifttypes_controller.php:36 -#: includes/view/ShiftTypes_view.php:12 -#, php-format -msgid "Delete shifttype %s" -msgstr "Apagar tipo de turno %s" - -#: includes/controller/shifttypes_controller.php:58 -msgid "Shifttype not found." -msgstr "Tipo de turno não encontrado." - -#: includes/controller/shifttypes_controller.php:74 -#: includes/pages/admin_rooms.php:71 -msgid "Please enter a name." -msgstr "Por favor digite um nome." - -#: includes/controller/shifttypes_controller.php:94 -msgid "Updated shifttype." -msgstr "Tipo de turno atualizado." - -#: includes/controller/shifttypes_controller.php:101 -msgid "Created shifttype." -msgstr "Tipo de turno criado" - -#: includes/controller/shifttypes_controller.php:155 -msgid "Shifttypes" -msgstr "Tipos de turno" - -#: includes/controller/user_angeltypes_controller.php:19 -#, php-format -msgid "There is %d unconfirmed angeltype." -msgid_plural "There are %d unconfirmed angeltypes." -msgstr[0] "Há %d anjo não confirmado." -msgstr[1] "There are %d unconfirmed angeltypes." - -#: includes/controller/user_angeltypes_controller.php:19 -msgid "Angel types which need approvals:" -msgstr "Tipos de anjo que precisam de aprovações:" - -#: includes/controller/user_angeltypes_controller.php:40 -msgid "You are not allowed to delete all users for this angeltype." -msgstr "" -"Você não têm permissão para apagar todos os usuários desse tipo de anjo." - -#: includes/controller/user_angeltypes_controller.php:48 -#, php-format -msgid "Denied all users for angeltype %s." -msgstr "Todos os usuários com tipo de anjo %s negados." - -#: includes/controller/user_angeltypes_controller.php:53 -#: includes/view/UserAngelTypes_view.php:15 -msgid "Deny all users" -msgstr "Negar todos os usuários" - -#: includes/controller/user_angeltypes_controller.php:77 -#: includes/controller/user_angeltypes_controller.php:107 -#: includes/controller/user_angeltypes_controller.php:113 -#: includes/controller/user_angeltypes_controller.php:158 -#: includes/controller/user_angeltypes_controller.php:164 -#: includes/controller/user_angeltypes_controller.php:216 -#: includes/controller/user_angeltypes_controller.php:229 -msgid "User angeltype doesn't exist." -msgstr "O tipo de anjo deste usuário não existe." - -#: includes/controller/user_angeltypes_controller.php:82 -msgid "You are not allowed to confirm all users for this angeltype." -msgstr "" -"Você não tem permissão para confirmar todos os usuários com este tipo de " -"anjo." - -#: includes/controller/user_angeltypes_controller.php:90 -#, php-format -msgid "Confirmed all users for angeltype %s." -msgstr "Todos os usuários com tipo de anjo %s confirmados." - -#: includes/controller/user_angeltypes_controller.php:95 -#: includes/view/UserAngelTypes_view.php:26 -msgid "Confirm all users" -msgstr "Confirmar todos usuários" - -#: includes/controller/user_angeltypes_controller.php:124 -msgid "You are not allowed to confirm this users angeltype." -msgstr "Você não tem permissão para confirmar o tipo de anjo deste usuário." - -#: includes/controller/user_angeltypes_controller.php:130 -#: includes/controller/user_angeltypes_controller.php:176 -#: includes/controller/user_angeltypes_controller.php:241 -#: includes/controller/users_controller.php:312 -msgid "User doesn't exist." -msgstr "Usuário não existente." - -#: includes/controller/user_angeltypes_controller.php:141 -#, php-format -msgid "%s confirmed for angeltype %s." -msgstr "%s confirmado para o tipo de anjo %s." - -#: includes/controller/user_angeltypes_controller.php:146 -#: includes/view/UserAngelTypes_view.php:37 -msgid "Confirm angeltype for user" -msgstr "Confirme o tipo de anjo para o usuário" - -#: includes/controller/user_angeltypes_controller.php:181 -msgid "You are not allowed to delete this users angeltype." -msgstr "Você não tem permissão para deletar o tipo de anjo deste usuário." - -#: includes/controller/user_angeltypes_controller.php:191 -#, php-format -msgid "User %s removed from %s." -msgstr "Usuário %s removido de %s." - -#: includes/controller/user_angeltypes_controller.php:199 -#: includes/view/UserAngelTypes_view.php:48 -msgid "Remove angeltype" -msgstr "Remover esse tipo de anjo" - -#: includes/controller/user_angeltypes_controller.php:211 -msgid "You are not allowed to set supporter rights." -msgstr "Você não tem autorização para definir permissões de apoiadores." - -#: includes/controller/user_angeltypes_controller.php:223 -msgid "No supporter update given." -msgstr "Nenhuma atualização de apoiador informada." - -#: includes/controller/user_angeltypes_controller.php:248 -#, php-format -msgid "Added supporter rights for %s to %s." -msgstr "Permissões de apoiador incluídos para %s a %s." - -#: includes/controller/user_angeltypes_controller.php:248 -#, php-format -msgid "Removed supporter rights for %s from %s." -msgstr "Permissões de apoiador removidos para %s a %s." - -#: includes/controller/user_angeltypes_controller.php:256 -#: includes/view/AngelTypes_view.php:156 -#: includes/view/UserAngelTypes_view.php:4 -msgid "Add supporter rights" -msgstr "Adicionar permissão ao apoiador" - -#: includes/controller/user_angeltypes_controller.php:256 -#: includes/view/AngelTypes_view.php:147 -#: includes/view/UserAngelTypes_view.php:4 -msgid "Remove supporter rights" -msgstr "Remover permissões de apoiador" - -#: includes/controller/user_angeltypes_controller.php:289 -#, php-format -msgid "User %s added to %s." -msgstr "Usuário %s adicionado a %s." - -#: includes/controller/user_angeltypes_controller.php:299 -#: includes/view/UserAngelTypes_view.php:64 -msgid "Add user to angeltype" -msgstr "Adicionar usuário a tipo de anjo" - -#: includes/controller/user_angeltypes_controller.php:312 -#, php-format -msgid "You are already a %s." -msgstr "Você já é %s." - -#: includes/controller/user_angeltypes_controller.php:319 -#, php-format -msgid "You joined %s." -msgstr "Você se juntou a %s." - -#: includes/controller/user_angeltypes_controller.php:332 -#: includes/view/UserAngelTypes_view.php:78 -#, php-format -msgid "Become a %s" -msgstr "Torne-se %s" - -#: includes/controller/user_driver_licenses_controller.php:19 -#, php-format -msgid "" -"You joined an angeltype which requires a driving license. Please edit your " -"driving license information here: %s." -msgstr "" -"Você se tornou um tipo de anjo que requer carteira de motorista. Por favor " -"inclua \n" -"seus dados aqui: %s." - -#: includes/controller/user_driver_licenses_controller.php:19 -msgid "driving license information" -msgstr "dados da carteira de motorista" - -#: includes/controller/user_driver_licenses_controller.php:113 -msgid "Your driver license information has been saved." -msgstr "Dados da carteira de motorista salvos." - -#: includes/controller/user_driver_licenses_controller.php:116 -msgid "Please select at least one driving license." -msgstr "Selecione pelo menos uma carteira de motorista." - -#: includes/controller/user_driver_licenses_controller.php:121 -msgid "Your driver license information has been removed." -msgstr "Seus dados de carteira de motorista foram removidos." - -#: includes/controller/user_driver_licenses_controller.php:127 -#: includes/view/UserDriverLicenses_view.php:15 -#, php-format -msgid "Edit %s driving license information" -msgstr "Editar dados da carteira de motorista de %s" - -#: includes/controller/users_controller.php:52 -msgid "You cannot delete yourself." -msgstr "Você não pode se deletar." - -#: includes/controller/users_controller.php:61 -#: includes/pages/guest_login.php:315 -msgid "Your password is incorrect. Please try it again." -msgstr "Sua senha está incorreta. Por favor, tente novamente." - -#: includes/controller/users_controller.php:71 -msgid "User deleted." -msgstr "Usuário deletado." - -#: includes/controller/users_controller.php:79 includes/view/User_view.php:121 -#, php-format -msgid "Delete %s" -msgstr "Apagar %s" - -#: includes/controller/users_controller.php:120 -msgid "Please enter a valid number of vouchers." -msgstr "Por favor, entre com um número válido de vouchers." - -#: includes/controller/users_controller.php:131 -msgid "Saved the number of vouchers." -msgstr "Número de vouchers salvo." - -#: includes/controller/users_controller.php:139 includes/view/User_view.php:138 -#, php-format -msgid "%s's vouchers" -msgstr "Vouchers de %s" - -#: includes/controller/users_controller.php:151 -msgid "User not found." -msgstr "Usuário não encontrado." - -#: includes/controller/users_controller.php:205 includes/view/User_view.php:175 -msgid "All users" -msgstr "Todos usuários" - -#: includes/controller/users_controller.php:217 -msgid "Token is not correct." -msgstr "O token não está correto." - -#: includes/controller/users_controller.php:227 -#: includes/pages/guest_login.php:102 includes/pages/user_settings.php:97 -msgid "Your passwords don't match." -msgstr "Suas senhas não correspondem." - -#: includes/controller/users_controller.php:231 -#: includes/pages/user_settings.php:95 -msgid "Your password is to short (please use at least 6 characters)." -msgstr "Sua senha é muito curta (por favor use no mínimo 6 caracteres)." - -#: includes/controller/users_controller.php:236 -#: includes/pages/user_settings.php:99 -msgid "Password saved." -msgstr "Sua senha foi salva." - -#: includes/controller/users_controller.php:257 -#: includes/controller/users_controller.php:261 -#: includes/pages/guest_login.php:67 includes/pages/user_settings.php:21 -msgid "E-mail address is not correct." -msgstr "E-mail não está correto." - -#: includes/controller/users_controller.php:265 -#: includes/pages/guest_login.php:71 includes/pages/user_settings.php:25 -msgid "Please enter your e-mail." -msgstr "Por favor digite seu e-mail." - -#: includes/controller/users_controller.php:270 -#: includes/controller/users_controller.php:295 -msgid "Password recovery" -msgstr "Recuperação de senha" - -#: includes/controller/users_controller.php:270 -#, php-format -msgid "Please visit %s to recover your password." -msgstr "Por favor visite %s para recuperar sua senha" - -#: includes/controller/users_controller.php:271 -msgid "We sent an email containing your password recovery link." -msgstr "Nós enviamos um email com o link para recuperação da sua senha." - -#: includes/helper/email_helper.php:12 -#, php-format -msgid "Hi %s," -msgstr "Oi %s," - -#: includes/helper/email_helper.php:12 -#, php-format -msgid "here is a message for you from the %s:" -msgstr "aqui está uma mensagem do %s para você:" - -#: includes/helper/email_helper.php:12 -#, php-format -msgid "" -"This email is autogenerated and has not been signed. You got this email " -"because you are registered in the %s." -msgstr "Você recebeu esse email porque está registrado no %s." - -#: includes/mailer/shifts_mailer.php:10 -msgid "A Shift you are registered on has changed:" -msgstr "Um turno em que você estava registrado foi modificado:" - -#: includes/mailer/shifts_mailer.php:14 -#, php-format -msgid "* Shift type changed from %s to %s" -msgstr "* Tipo de turno alterado de %s para %s" - -#: includes/mailer/shifts_mailer.php:19 -#, php-format -msgid "* Shift title changed from %s to %s" -msgstr "* Título do turno alterado de %s para %s" - -#: includes/mailer/shifts_mailer.php:24 -#, php-format -msgid "* Shift Start changed from %s to %s" -msgstr "* Início do turno alterado de %s para %s" - -#: includes/mailer/shifts_mailer.php:29 -#, php-format -msgid "* Shift End changed from %s to %s" -msgstr "* Término do turno alterado de %s para %s" - -#: includes/mailer/shifts_mailer.php:34 -#, php-format -msgid "* Shift Location changed from %s to %s" -msgstr "* Local do turno alterado de %s para %s" - -#: includes/mailer/shifts_mailer.php:44 -msgid "The updated Shift:" -msgstr "Turno atualizado:" - -#: includes/mailer/shifts_mailer.php:53 -msgid "Your Shift has changed" -msgstr "O seu turno foi modificado" - -#: includes/mailer/shifts_mailer.php:62 -msgid "A Shift you are registered on was deleted:" -msgstr "Um turno em que você estava registrado foi apagado:" - -#: includes/mailer/shifts_mailer.php:71 -msgid "Your Shift was deleted" -msgstr "Seu turno foi apagado" - -#: includes/mailer/shifts_mailer.php:80 -msgid "You have been assigned to a Shift:" -msgstr "Você foi alocado a um turno:" - -#: includes/mailer/shifts_mailer.php:86 -msgid "Assigned to Shift" -msgstr "Alocado ao turno" - -#: includes/mailer/shifts_mailer.php:94 -msgid "You have been removed from a Shift:" -msgstr "Você foi removido de um turno:" - -#: includes/mailer/shifts_mailer.php:100 -msgid "Removed from Shift" -msgstr "Removido do turno" - -#: includes/mailer/users_mailer.php:7 -msgid "Your account has been deleted" -msgstr "A sua conta foi deletada." - -#: includes/mailer/users_mailer.php:7 -msgid "" -"Your angelsystem account has been deleted. If you have any questions " -"regarding your account deletion, please contact heaven." -msgstr "" -"Sua conta engelsystem foi deletada. Se você tiver questões sobre a deleção " -"da sua conta, por favor entre em contato com o paraíso." - -#: includes/pages/admin_active.php:4 -msgid "Active angels" -msgstr "Anjos ativos" - -#: includes/pages/admin_active.php:29 -#, php-format -msgid "" -"At least %s angels are forced to be active. The number has to be greater." -msgstr "No mínimo %s anjos precisam estar ativos. O número deve ser maior." - -#: includes/pages/admin_active.php:34 -msgid "Please enter a number of angels to be marked as active." -msgstr "Por favor insira o número de anjos a marcar como ativos." - -#: includes/pages/admin_active.php:59 -msgid "Marked angels." -msgstr "Anjos marcados." - -#: includes/pages/admin_active.php:61 includes/pages/admin_rooms.php:137 -#: includes/pages/admin_rooms.php:173 includes/pages/admin_shifts.php:266 -#: includes/view/UserAngelTypes_view.php:67 includes/view/User_view.php:124 -#: includes/view/User_view.php:141 -msgid "back" -msgstr "voltar" - -#: includes/pages/admin_active.php:61 -msgid "apply" -msgstr "aplicar" - -#: includes/pages/admin_active.php:71 -msgid "Angel has been marked as active." -msgstr "Anjo marcado como ativo." - -#: includes/pages/admin_active.php:73 includes/pages/admin_active.php:83 -#: includes/pages/admin_active.php:103 includes/pages/admin_arrive.php:23 -#: includes/pages/admin_arrive.php:34 -msgid "Angel not found." -msgstr "Anjo não encontrado." - -#: includes/pages/admin_active.php:81 -msgid "Angel has been marked as not active." -msgstr "Anjo marcado como não ativo." - -#: includes/pages/admin_active.php:91 -msgid "Angel has got a t-shirt." -msgstr "Anjo tem uma camiseta." - -#: includes/pages/admin_active.php:101 -msgid "Angel has got no t-shirt." -msgstr "Anjo não tem camiseta." - -#: includes/pages/admin_active.php:142 -msgid "set active" -msgstr "definir ativo" - -#: includes/pages/admin_active.php:145 -msgid "remove active" -msgstr "remover ativo" - -#: includes/pages/admin_active.php:146 -msgid "got t-shirt" -msgstr "pegou camiseta" - -#: includes/pages/admin_active.php:149 -msgid "remove t-shirt" -msgstr "remover camiseta" - -#: includes/pages/admin_active.php:168 includes/pages/admin_arrive.php:165 -#: includes/pages/admin_arrive.php:180 includes/pages/admin_arrive.php:195 -#: includes/view/AngelTypes_view.php:221 includes/view/AngelTypes_view.php:229 -#: includes/view/User_view.php:165 -msgid "Sum" -msgstr "Somatória" - -#: includes/pages/admin_active.php:175 -msgid "Search angel:" -msgstr "Buscar Anjo:" - -#: includes/pages/admin_active.php:176 -msgid "Show all shifts" -msgstr "Mostrar todos os turnos" - -#: includes/pages/admin_active.php:177 includes/pages/admin_arrive.php:141 -#: includes/pages/admin_arrive.php:142 includes/pages/admin_free.php:78 -#: includes/pages/admin_free.php:87 includes/pages/admin_log.php:23 -#: includes/pages/admin_log.php:24 -msgid "Search" -msgstr "Buscar" - -#: includes/pages/admin_active.php:180 -msgid "How much angels should be active?" -msgstr "Quantos anjos deverão estar ativos?" - -#: includes/pages/admin_active.php:181 includes/pages/admin_shifts.php:254 -#: includes/pages/admin_shifts.php:342 -msgid "Preview" -msgstr "Pré-visualizar" - -#: includes/pages/admin_active.php:185 includes/pages/admin_arrive.php:145 -msgid "Nickname" -msgstr "Apelido" - -#: includes/pages/admin_active.php:186 includes/pages/admin_active.php:196 -#: includes/view/User_view.php:191 -msgid "Size" -msgstr "Tamanho" - -#: includes/pages/admin_active.php:187 includes/pages/user_shifts.php:5 -#: includes/view/User_view.php:364 -msgid "Shifts" -msgstr "Turnos" - -#: includes/pages/admin_active.php:188 includes/pages/admin_shifts.php:329 -msgid "Length" -msgstr "Duração" - -#: includes/pages/admin_active.php:189 -msgid "Active?" -msgstr "Ativo?" - -#: includes/pages/admin_active.php:190 includes/view/User_view.php:189 -msgid "Forced" -msgstr "Forçados" - -#: includes/pages/admin_active.php:191 -msgid "T-shirt?" -msgstr "Camiseta?" - -#: includes/pages/admin_active.php:194 -msgid "Shirt statistics" -msgstr "Estatísticas de camiseta" - -#: includes/pages/admin_active.php:197 -msgid "Needed shirts" -msgstr "Camisetas necessárias" - -#: includes/pages/admin_active.php:198 -msgid "Given shirts" -msgstr "Camisetas entregues" - -#: includes/pages/admin_arrive.php:4 -msgid "Arrived angels" -msgstr "Anjos que chegaram" - -#: includes/pages/admin_arrive.php:20 -msgid "Reset done. Angel has not arrived." -msgstr "Reset realizado. Anjo não chegou." - -#: includes/pages/admin_arrive.php:31 -msgid "Angel has been marked as arrived." -msgstr "Chegada do anjo registrada." - -#: includes/pages/admin_arrive.php:71 includes/view/UserAngelTypes_view.php:9 -#: includes/view/UserAngelTypes_view.php:20 -#: includes/view/UserAngelTypes_view.php:31 -#: includes/view/UserAngelTypes_view.php:42 -#: includes/view/UserAngelTypes_view.php:53 -msgid "yes" -msgstr "sim" - -#: includes/pages/admin_arrive.php:72 -msgid "reset" -msgstr "resetar" - -#: includes/pages/admin_arrive.php:72 includes/pages/admin_arrive.php:156 -#: includes/pages/admin_arrive.php:171 includes/pages/admin_arrive.php:186 -#: includes/view/User_view.php:330 -msgid "arrived" -msgstr "chegou" - -#: includes/pages/admin_arrive.php:146 -msgid "Planned arrival" -msgstr "Chegada planejada" - -#: includes/pages/admin_arrive.php:147 -msgid "Arrived?" -msgstr "Chegou?" - -#: includes/pages/admin_arrive.php:148 -msgid "Arrival date" -msgstr "Data de chegada" - -#: includes/pages/admin_arrive.php:149 -msgid "Planned departure" -msgstr "Saída planejada" - -#: includes/pages/admin_arrive.php:154 -msgid "Planned arrival statistics" -msgstr "Estatísticas de chegadas planejadas" - -#: includes/pages/admin_arrive.php:157 includes/pages/admin_arrive.php:172 -#: includes/pages/admin_arrive.php:187 -msgid "arrived sum" -msgstr "soma dos que chegaram" - -#: includes/pages/admin_arrive.php:163 includes/pages/admin_arrive.php:178 -#: includes/pages/admin_arrive.php:193 includes/pages/admin_news.php:30 -#: includes/pages/user_messages.php:76 -msgid "Date" -msgstr "Data" - -#: includes/pages/admin_arrive.php:164 includes/pages/admin_arrive.php:179 -#: includes/pages/admin_arrive.php:194 -msgid "Count" -msgstr "Contar" - -#: includes/pages/admin_arrive.php:169 -msgid "Arrival statistics" -msgstr "Estatísticas de chegadas" - -#: includes/pages/admin_arrive.php:184 -msgid "Planned departure statistics" -msgstr "Estatísticas de saídas planejadas" - -#: includes/pages/admin_free.php:4 -msgid "Free angels" -msgstr "Anjos livres" - -#: includes/pages/admin_free.php:81 includes/view/ShiftTypes_view.php:36 -#: includes/view/UserAngelTypes_view.php:70 -msgid "Angeltype" -msgstr "Tipo de anjo" - -#: includes/pages/admin_free.php:84 -msgid "Only confirmed" -msgstr "Somente confirmados" - -#: includes/pages/admin_free.php:92 includes/pages/guest_login.php:225 -#: includes/pages/guest_login.php:354 includes/view/AngelTypes_view.php:177 -#: includes/view/AngelTypes_view.php:190 includes/view/User_view.php:40 -#: includes/view/User_view.php:97 includes/view/User_view.php:181 -msgid "Nick" -msgstr "Apelido" - -#: includes/pages/admin_free.php:94 includes/pages/guest_login.php:255 -#: includes/view/AngelTypes_view.php:178 includes/view/AngelTypes_view.php:191 -#: includes/view/User_view.php:47 includes/view/User_view.php:184 -msgid "DECT" -msgstr "DECT" - -#: includes/pages/admin_free.php:95 includes/pages/guest_login.php:264 -#: includes/view/User_view.php:52 -msgid "Jabber" -msgstr "Jabber" - -#: includes/pages/admin_free.php:96 includes/pages/guest_login.php:228 -#: includes/view/User_view.php:49 includes/view/User_view.php:386 -msgid "E-Mail" -msgstr "E-Mail" - -#: includes/pages/admin_groups.php:4 -msgid "Grouprights" -msgstr "Direitos de grupo" - -#: includes/pages/admin_groups.php:29 includes/pages/admin_import.php:145 -#: includes/pages/admin_import.php:149 includes/pages/admin_rooms.php:143 -#: includes/pages/admin_rooms.php:189 includes/view/AngelTypes_view.php:66 -#: includes/view/AngelTypes_view.php:268 includes/view/ShiftTypes_view.php:35 -#: includes/view/ShiftTypes_view.php:78 includes/view/User_view.php:183 -msgid "Name" -msgstr "Nome" - -#: includes/pages/admin_groups.php:30 -msgid "Privileges" -msgstr "Privilégios" - -#: includes/pages/admin_groups.php:55 -msgid "Edit group" -msgstr "Editar grupo" - -#: includes/pages/admin_import.php:4 includes/pages/admin_rooms.php:144 -#: includes/pages/admin_rooms.php:190 -msgid "Frab import" -msgstr "Importação Frab" - -#: includes/pages/admin_import.php:26 -msgid "Webserver has no write-permission on import directory." -msgstr "" -"O servidor web não possui permissão de escrita no diretório de importação." - -#: includes/pages/admin_import.php:54 includes/pages/admin_import.php:118 -#: includes/pages/admin_import.php:196 includes/pages/admin_shifts.php:53 -#: includes/pages/admin_shifts.php:59 -msgid "Please select a shift type." -msgstr "Por favor selecione um tipo de turno." - -#: includes/pages/admin_import.php:61 includes/pages/admin_import.php:125 -#: includes/pages/admin_import.php:203 -msgid "Please enter an amount of minutes to add to a talk's begin." -msgstr "" -"Por favor insira um número de minutos para adicionar ao início de uma " -"palestra." - -#: includes/pages/admin_import.php:68 includes/pages/admin_import.php:132 -#: includes/pages/admin_import.php:210 -msgid "Please enter an amount of minutes to add to a talk's end." -msgstr "" -"Por favor insira um número de minutos para adicionar ao término de uma " -"palestra." - -#: includes/pages/admin_import.php:76 -msgid "No valid xml/xcal file provided." -msgstr "Nenhum arquivo xml/xcal válido foi fornecido." - -#: includes/pages/admin_import.php:81 -msgid "File upload went wrong." -msgstr "Falha no upload do arquivo." - -#: includes/pages/admin_import.php:85 -msgid "Please provide some data." -msgstr "Por favor insira alguns dados." - -#: includes/pages/admin_import.php:93 includes/pages/admin_import.php:140 -#: includes/pages/admin_import.php:253 -msgid "File Upload" -msgstr "Enviar arquivo" - -#: includes/pages/admin_import.php:93 includes/pages/admin_import.php:140 -#: includes/pages/admin_import.php:253 -msgid "Validation" -msgstr "Validação" - -#: includes/pages/admin_import.php:93 includes/pages/admin_import.php:102 -#: includes/pages/admin_import.php:140 includes/pages/admin_import.php:179 -#: includes/pages/admin_import.php:253 -msgid "Import" -msgstr "Importar" - -#: includes/pages/admin_import.php:97 -msgid "" -"This import will create/update/delete rooms and shifts by given FRAB-export " -"file. The needed file format is xcal." -msgstr "" -"Esta importação irá criar/atualizar/deletar salas e turnos a partir do " -"arquivo FRAB-Export. O formato necessário é xcal." - -#: includes/pages/admin_import.php:99 -msgid "Add minutes to start" -msgstr "Adicionar minutos ao início" - -#: includes/pages/admin_import.php:100 -msgid "Add minutes to end" -msgstr "Adicionar minutos ao fim" - -#: includes/pages/admin_import.php:101 -msgid "xcal-File (.xcal)" -msgstr "Adicionar minutos ao fim" - -#: includes/pages/admin_import.php:111 includes/pages/admin_import.php:185 -msgid "Missing import file." -msgstr "Arquivo para importar não encontrado." - -#: includes/pages/admin_import.php:144 -msgid "Rooms to create" -msgstr "Salas para criar" - -#: includes/pages/admin_import.php:148 -msgid "Rooms to delete" -msgstr "Salas para apagar" - -#: includes/pages/admin_import.php:152 -msgid "Shifts to create" -msgstr "Turnos para criar" - -#: includes/pages/admin_import.php:154 includes/pages/admin_import.php:163 -#: includes/pages/admin_import.php:172 includes/view/User_view.php:366 -msgid "Day" -msgstr "Dia" - -#: includes/pages/admin_import.php:155 includes/pages/admin_import.php:164 -#: includes/pages/admin_import.php:173 includes/pages/admin_shifts.php:324 -#: includes/view/Shifts_view.php:66 -msgid "Start" -msgstr "Início" - -#: includes/pages/admin_import.php:156 includes/pages/admin_import.php:165 -#: includes/pages/admin_import.php:174 includes/pages/admin_shifts.php:325 -#: includes/view/Shifts_view.php:74 -msgid "End" -msgstr "Fim" - -#: includes/pages/admin_import.php:157 includes/pages/admin_import.php:166 -#: includes/pages/admin_import.php:175 -msgid "Shift type" -msgstr "Tipo de turno" - -#: includes/pages/admin_import.php:159 includes/pages/admin_import.php:168 -#: includes/pages/admin_import.php:177 includes/pages/admin_shifts.php:321 -msgid "Room" -msgstr "Sala" - -#: includes/pages/admin_import.php:161 -msgid "Shifts to update" -msgstr "Turnos para atualizar" - -#: includes/pages/admin_import.php:170 -msgid "Shifts to delete" -msgstr "Turnos para deletar" - -#: includes/pages/admin_import.php:254 -msgid "It's done!" -msgstr "Está feito!" - -#: includes/pages/admin_log.php:4 -msgid "Log" -msgstr "Log" - -#: includes/pages/admin_news.php:10 -msgid "Edit news entry" -msgstr "Editar notícia" - -#: includes/pages/admin_news.php:31 -msgid "Author" -msgstr "Autor" - -#: includes/pages/admin_news.php:32 includes/pages/user_news.php:161 -msgid "Subject" -msgstr "Assunto" - -#: includes/pages/admin_news.php:33 includes/pages/user_messages.php:79 -#: includes/pages/user_news.php:106 includes/pages/user_news.php:162 -msgid "Message" -msgstr "Mensagem" - -#: includes/pages/admin_news.php:34 includes/pages/user_news.php:163 -msgid "Meeting" -msgstr "Reunião" - -#: includes/pages/admin_news.php:38 includes/pages/admin_rooms.php:177 -#: includes/view/User_view.php:129 -msgid "Delete" -msgstr "Apagar" - -#: includes/pages/admin_news.php:52 -msgid "News entry updated." -msgstr "Notícia atualizada." - -#: includes/pages/admin_news.php:61 -msgid "News entry deleted." -msgstr "Notícia deletada." - -#: includes/pages/admin_questions.php:4 -msgid "Answer questions" -msgstr "Responder perguntas" - -#: includes/pages/admin_questions.php:18 -msgid "There are unanswered questions!" -msgstr "Existem perguntas não respondidas!" - -#: includes/pages/admin_questions.php:61 -msgid "Unanswered questions" -msgstr "Perguntas não respondidas" - -#: includes/pages/admin_questions.php:63 includes/pages/admin_questions.php:70 -msgid "From" -msgstr "De" - -#: includes/pages/admin_questions.php:64 includes/pages/admin_questions.php:71 -#: includes/view/Questions_view.php:19 includes/view/Questions_view.php:24 -msgid "Question" -msgstr "Questão" - -#: includes/pages/admin_questions.php:65 includes/pages/admin_questions.php:73 -#: includes/view/Questions_view.php:26 -msgid "Answer" -msgstr "Resposta" - -#: includes/pages/admin_questions.php:68 includes/view/Questions_view.php:22 -msgid "Answered questions" -msgstr "Perguntas respondidas" - -#: includes/pages/admin_questions.php:72 includes/view/Questions_view.php:25 -msgid "Answered by" -msgstr "Respondido por" - -#: includes/pages/admin_rooms.php:4 includes/pages/user_shifts.php:159 -#: includes/sys_menu.php:176 -msgid "Rooms" -msgstr "Salas" - -#: includes/pages/admin_rooms.php:67 -msgid "This name is already in use." -msgstr "Este nome já está em uso." - -#: includes/pages/admin_rooms.php:97 -#, php-format -msgid "Please enter needed angels for type %s." -msgstr "Por favor insira os anjos necessários de tipo %s." - -#: includes/pages/admin_rooms.php:124 -msgid "Room saved." -msgstr "Sala salva" - -#: includes/pages/admin_rooms.php:145 includes/pages/admin_rooms.php:191 -msgid "Public" -msgstr "Público" - -#: includes/pages/admin_rooms.php:146 -msgid "Room number" -msgstr "Número da sala" - -#: includes/pages/admin_rooms.php:151 -msgid "Needed angels:" -msgstr "Anjos necessários:" - -#: includes/pages/admin_rooms.php:167 -#, php-format -msgid "Room %s deleted." -msgstr "Sala %s deletada." - -#: includes/pages/admin_rooms.php:175 -#, php-format -msgid "Do you want to delete room %s?" -msgstr "Você quer deletar as salas %s?" - -#: includes/pages/admin_rooms.php:185 -msgid "add" -msgstr "adicionar" - -#: includes/pages/admin_shifts.php:4 -msgid "Create shifts" -msgstr "Criar turnos" - -#: includes/pages/admin_shifts.php:71 -msgid "Please select a location." -msgstr "Por favor, selecione uma localização." - -#: includes/pages/admin_shifts.php:78 -msgid "Please select a start time." -msgstr "Por favor, selecione um horário de início." - -#: includes/pages/admin_shifts.php:85 -msgid "Please select an end time." -msgstr "Por favor, selecione um horário de término." - -#: includes/pages/admin_shifts.php:90 -msgid "The shifts end has to be after its start." -msgstr "O término do turno deve ser posterior ao seu início." - -#: includes/pages/admin_shifts.php:102 -msgid "Please enter a shift duration in minutes." -msgstr "Por favor insira a duração do turno em minutos." - -#: includes/pages/admin_shifts.php:110 -msgid "Please split the shift-change hours by colons." -msgstr "Por favor divida os horários de mudança de turno por vírgulas." - -#: includes/pages/admin_shifts.php:115 -msgid "Please select a mode." -msgstr "Por favor selecione um modo." - -#: includes/pages/admin_shifts.php:128 -#, php-format -msgid "Please check the needed angels for team %s." -msgstr "Por favor confira os anjos necessários para o time %s." - -#: includes/pages/admin_shifts.php:133 -msgid "There are 0 angels needed. Please enter the amounts of needed angels." -msgstr "" -"Há 0 anjos necessários. Por favor insira o número de anjos necessários." - -#: includes/pages/admin_shifts.php:137 -msgid "Please select a mode for needed angels." -msgstr "Por favor escolha um modo para os anjos necessários." - -#: includes/pages/admin_shifts.php:141 -msgid "Please select needed angels." -msgstr "Por favor selecione os anjos necessários." - -#: includes/pages/admin_shifts.php:268 -msgid "Time and location" -msgstr "Horário e localização" - -#: includes/pages/admin_shifts.php:269 -msgid "Type and title" -msgstr "Tipo e título" - -#: includes/pages/admin_shifts.php:326 -msgid "Mode" -msgstr "Modo" - -#: includes/pages/admin_shifts.php:327 -msgid "Create one shift" -msgstr "Criar um turno" - -#: includes/pages/admin_shifts.php:328 -msgid "Create multiple shifts" -msgstr "Criar múltiplos turnos" - -#: includes/pages/admin_shifts.php:330 -msgid "Create multiple shifts with variable length" -msgstr "Criar múltiplos turnos com duração variável" - -#: includes/pages/admin_shifts.php:331 -msgid "Shift change hours" -msgstr "Mudança de horário do turno" - -#: includes/pages/admin_shifts.php:335 -msgid "Take needed angels from room settings" -msgstr "Pegar os anjos necessários a partir das configurações das salas" - -#: includes/pages/admin_shifts.php:336 -msgid "The following angels are needed" -msgstr "Os seguintes anjos são necessários" - -#: includes/pages/admin_user.php:4 -msgid "All Angels" -msgstr "Todos os anjos" - -#: includes/pages/admin_user.php:20 -msgid "This user does not exist." -msgstr "Esse usuário não existe." - -#: includes/pages/admin_user.php:46 includes/view/AngelTypes_view.php:67 -#: includes/view/AngelTypes_view.php:68 includes/view/AngelTypes_view.php:69 -msgid "Yes" -msgstr "Sim" - -#: includes/pages/admin_user.php:47 includes/view/AngelTypes_view.php:67 -#: includes/view/AngelTypes_view.php:68 includes/view/AngelTypes_view.php:69 -msgid "No" -msgstr "Não" - -#: includes/pages/admin_user.php:60 -msgid "Force active" -msgstr "Forçar ativação" - -#: includes/pages/admin_user.php:79 -msgid "" -"Please visit the angeltypes page or the users profile to manage users " -"angeltypes." -msgstr "" -"Por favor visite a página de tipos de anjo ou o perfil do usuário para " -"gerenciar\n" -"seus tipos de anjo." - -#: includes/pages/admin_user.php:204 -msgid "Edit user" -msgstr "Editar usuário" - -#: includes/pages/guest_credits.php:3 -msgid "Credits" -msgstr "Créditos" - -#: includes/pages/guest_login.php:4 includes/pages/guest_login.php:349 -#: includes/pages/guest_login.php:356 includes/view/User_view.php:95 -#: includes/view/User_view.php:99 -msgid "Login" -msgstr "Login" - -#: includes/pages/guest_login.php:8 includes/pages/guest_login.php:285 -msgid "Register" -msgstr "Registrar" - -#: includes/pages/guest_login.php:12 -msgid "Logout" -msgstr "Logout" - -#: includes/pages/guest_login.php:56 -#, php-format -msgid "Your nick "%s" already exists." -msgstr "Seu apelido "%s" já existe." - -#: includes/pages/guest_login.php:60 -#, php-format -msgid "Your nick "%s" is too short (min. 2 characters)." -msgstr "Seu apelido "%s" é muito pequeno (mínimo 2 caracteres)." - -#: includes/pages/guest_login.php:86 includes/pages/user_settings.php:36 -msgid "Please check your jabber account information." -msgstr "Por favor verifique a informação da sua conta jabber." - -#: includes/pages/guest_login.php:95 -msgid "Please select your shirt size." -msgstr "Por favor escolha o tamanho da camisa." - -#: includes/pages/guest_login.php:106 -#, php-format -msgid "Your password is too short (please use at least %s characters)." -msgstr "Sua senha é muito curta (por favor use pelo menos %s caracteres)." - -#: includes/pages/guest_login.php:115 includes/pages/user_settings.php:52 -msgid "" -"Please enter your planned date of arrival. It should be after the buildup " -"start date and before teardown end date." -msgstr "" -"Por favor insira a data planejada para sua chegada. Ela deve ser posterior à " -"data de montagem e anterior à data de desmontagem." - -#: includes/pages/guest_login.php:189 -msgid "Angel registration successful!" -msgstr "Conta criada com sucesso!" - -#: includes/pages/guest_login.php:217 -msgid "" -"By completing this form you're registering as a Chaos-Angel. This script " -"will create you an account in the angel task scheduler." -msgstr "" -"Ao completar esse formulário você estará se registrando como um voluntário. " -"Esse script criará uma conta no sistema." - -#: includes/pages/guest_login.php:229 includes/view/User_view.php:50 -#, php-format -msgid "" -"The %s is allowed to send me an email (e.g. when my shifts change)" -msgstr "" -"Permito que o %s me envie emails (por exemplo, quando meus turnos " -"mudam)" - -#: includes/pages/guest_login.php:230 includes/view/User_view.php:51 -msgid "Humans are allowed to send me an email (e.g. for ticket vouchers)" -msgstr "Permito que humanos me enviem emails (por exemplo, para um voucher)" - -#: includes/pages/guest_login.php:235 includes/view/User_view.php:43 -msgid "Planned date of arrival" -msgstr "Data planejada de chegada" - -#: includes/pages/guest_login.php:238 includes/view/User_view.php:54 -msgid "Shirt size" -msgstr "Tamanho da camiseta" - -#: includes/pages/guest_login.php:243 includes/pages/guest_login.php:355 -#: includes/view/User_view.php:98 includes/view/User_view.php:400 -msgid "Password" -msgstr "Senha" - -#: includes/pages/guest_login.php:246 includes/view/User_view.php:401 -msgid "Confirm password" -msgstr "Confirme a senha" - -#: includes/pages/guest_login.php:249 -msgid "What do you want to do?" -msgstr "O que você gostaria de fazer?" - -#: includes/pages/guest_login.php:249 -msgid "Description of job types" -msgstr "Descrição dos trabalhos" - -#: includes/pages/guest_login.php:250 -msgid "" -"Restricted angel types need will be confirmed later by a supporter. You can " -"change your selection in the options section." -msgstr "" -"Tipos de anjo restritos precisam de confirmação posterior de um apoiador. " -"Você pode \n" -"mudar sua seleção na seção 'Opções'." - -#: includes/pages/guest_login.php:258 includes/view/User_view.php:48 -msgid "Mobile" -msgstr "Celular" - -#: includes/pages/guest_login.php:261 includes/view/User_view.php:46 -msgid "Phone" -msgstr "Telefone" - -#: includes/pages/guest_login.php:267 includes/view/User_view.php:42 -msgid "First name" -msgstr "Nome" - -#: includes/pages/guest_login.php:270 includes/view/User_view.php:41 -msgid "Last name" -msgstr "Sobrenome" - -#: includes/pages/guest_login.php:275 includes/view/User_view.php:45 -msgid "Age" -msgstr "Idade" - -#: includes/pages/guest_login.php:278 includes/view/User_view.php:53 -msgid "Hometown" -msgstr "Cidade" - -#: includes/pages/guest_login.php:281 includes/view/User_view.php:39 -msgid "Entry required!" -msgstr "Campo necessário!" - -#: includes/pages/guest_login.php:319 -msgid "Please enter a password." -msgstr "Por favor digite uma senha." - -#: includes/pages/guest_login.php:323 -msgid "" -"No user was found with that Nickname. Please try again. If you are still " -"having problems, ask a Dispatcher." -msgstr "" -"Nenhum usuário com esse apelido foi encontrado. Por favor tente novamente. \n" -"Se você continuar com problemas, pergunte a um Dispatcher." - -#: includes/pages/guest_login.php:327 -msgid "Please enter a nickname." -msgstr "Por favor digite um apelido." - -#: includes/pages/guest_login.php:358 includes/view/User_view.php:101 -msgid "I forgot my password" -msgstr "Esqueci minha senha" - -#: includes/pages/guest_login.php:363 includes/view/User_view.php:103 -msgid "Please note: You have to activate cookies!" -msgstr "Nota: você precisa habilitar cookies!" - -#: includes/pages/guest_login.php:374 includes/view/User_view.php:107 -msgid "What can I do?" -msgstr "O que posso fazer?" - -#: includes/pages/guest_login.php:375 includes/view/User_view.php:108 -msgid "Please read about the jobs you can do to help us." -msgstr "Por favor leia sobre as tarefas que pode realizar para nos ajudar." - -#: includes/pages/guest_login.php:390 -msgid "Please sign up, if you want to help us!" -msgstr "Se você quer nos ajudar, por favor se registre!" - -#: includes/pages/user_messages.php:4 -msgid "Messages" -msgstr "Mensagens" - -#: includes/pages/user_messages.php:26 -msgid "Select recipient..." -msgstr "Selecionar recipiente..." - -#: includes/pages/user_messages.php:62 -msgid "mark as read" -msgstr "marcar como lido" - -#: includes/pages/user_messages.php:65 -msgid "delete message" -msgstr "apagar mensagem" - -#: includes/pages/user_messages.php:72 -#, php-format -msgid "Hello %s, here can you leave messages for other angels" -msgstr "Oi %s, aqui você pode deixar mensagens para outros anjos." - -#: includes/pages/user_messages.php:75 -msgid "New" -msgstr "Nova" - -#: includes/pages/user_messages.php:77 -msgid "Transmitted" -msgstr "Enviado" - -#: includes/pages/user_messages.php:78 -msgid "Recipient" -msgstr "Recipiente" - -#: includes/pages/user_messages.php:90 includes/pages/user_messages.php:106 -msgid "Incomplete call, missing Message ID." -msgstr "Chamada incompleta, falta o ID da Mensagem." - -#: includes/pages/user_messages.php:98 includes/pages/user_messages.php:114 -msgid "No Message found." -msgstr "Nenhuma mensagem encontrada." - -#: includes/pages/user_messages.php:122 -msgid "Transmitting was terminated with an Error." -msgstr "Transmissão encerrada com um erro." - -#: includes/pages/user_messages.php:127 -msgid "Wrong action." -msgstr "Ação errada." - -#: includes/pages/user_myshifts.php:23 -msgid "Key changed." -msgstr "Chave modificada." - -#: includes/pages/user_myshifts.php:26 includes/view/User_view.php:335 -msgid "Reset API key" -msgstr "Resetar a chave API" - -#: includes/pages/user_myshifts.php:27 -msgid "" -"If you reset the key, the url to your iCal- and JSON-export and your atom " -"feed changes! You have to update it in every application using one of these " -"exports." -msgstr "" -"Se você reconfigurar a chave, as urls para seu iCal, a exportação em formato " -"JSON \n" -"e seu feed atom será alterada! Você precisará atualizá-las em todas as " -"aplicações que estiverem \n" -"usando uma delas." - -#: includes/pages/user_myshifts.php:28 -msgid "Continue" -msgstr "Continuar" - -#: includes/pages/user_myshifts.php:60 -msgid "Please enter a freeload comment!" -msgstr "Por favor insira um comentário freeload!" - -#: includes/pages/user_myshifts.php:79 -msgid "Shift saved." -msgstr "Turno salvo." - -#: includes/pages/user_myshifts.php:107 -msgid "Shift canceled." -msgstr "Turno cancelado." - -#: includes/pages/user_myshifts.php:109 -msgid "" -"It's too late to sign yourself off the shift. If neccessary, ask the " -"dispatcher to do so." -msgstr "" -"Está muito tarde para se retirar deste turno. Se necessário, peça a \n" -"um dispatcher para removê-lo." - -#: includes/pages/user_news.php:4 -msgid "News comments" -msgstr "Novos comentários" - -#: includes/pages/user_news.php:8 -msgid "News" -msgstr "Novidades" - -#: includes/pages/user_news.php:12 -msgid "Meetings" -msgstr "Encontros" - -#: includes/pages/user_news.php:68 -msgid "Comments" -msgstr "Comentários" - -#: includes/pages/user_news.php:86 includes/pages/user_news.php:127 -msgid "Entry saved." -msgstr "Entrada salva." - -#: includes/pages/user_news.php:104 -msgid "New Comment:" -msgstr "Novo comentário:" - -#: includes/pages/user_news.php:110 -msgid "Invalid request." -msgstr "Requisição inválida." - -#: includes/pages/user_news.php:158 -msgid "Create news:" -msgstr "Criar novidades:" - -#: includes/pages/user_questions.php:4 includes/view/Questions_view.php:29 -msgid "Ask the Heaven" -msgstr "Pergunte ao paraíso" - -#: includes/pages/user_questions.php:27 -msgid "Unable to save question." -msgstr "Não foi possível salvar a sua pergunta." - -#: includes/pages/user_questions.php:29 -msgid "You question was saved." -msgstr "Sua pergunta foi salva." - -#: includes/pages/user_questions.php:33 -msgid "Please enter a question!" -msgstr "Por favor digite sua dúvida!" - -#: includes/pages/user_questions.php:41 -msgid "Incomplete call, missing Question ID." -msgstr "Chamada incompletada, falta o ID da pergunta." - -#: includes/pages/user_questions.php:50 -msgid "No question found." -msgstr "Nenhuma dúvida encontrada." - -#: includes/pages/user_settings.php:4 includes/view/User_view.php:332 -msgid "Settings" -msgstr "Configurações" - -#: includes/pages/user_settings.php:62 -msgid "" -"Please enter your planned date of departure. It should be after your planned " -"arrival date and after buildup start date and before teardown end date." -msgstr "" -"Por favor digite sua data de saída. Ela deve ser posterior à data de " -"chegada\n" -"e ao início da montagem, e anterior à data de desmontagem." - -#: includes/pages/user_settings.php:93 -msgid "-> not OK. Please try again." -msgstr "-> não OK. Por favor tente novamente." - -#: includes/pages/user_settings.php:101 -msgid "Failed setting password." -msgstr "A alteração da senha falhaou." - -#: includes/pages/user_settings.php:126 -msgid "Theme changed." -msgstr "Tema alterado." - -#: includes/pages/user_shifts.php:82 -msgid "The administration has not configured any rooms yet." -msgstr "O administrador não configurou nenhuma sala ainda." - -#: includes/pages/user_shifts.php:94 -msgid "The administration has not configured any shifts yet." -msgstr "O administrador não configurou nenhum turno ainda." - -#: includes/pages/user_shifts.php:104 -msgid "" -"The administration has not configured any angeltypes yet - or you are not " -"subscribed to any angeltype." -msgstr "" -"O administrador ainda não configurou os tipos de anjos - ou você não está\n" -"inscrito em nenhum tipo de anjo." - -#: includes/pages/user_shifts.php:142 -msgid "occupied" -msgstr "ocupado" - -#: includes/pages/user_shifts.php:146 -msgid "free" -msgstr "livre" - -#: includes/pages/user_shifts.php:165 -msgid "Occupancy" -msgstr "Ocupação" - -#: includes/pages/user_shifts.php:166 -msgid "" -"The tasks shown here are influenced by the angeltypes you joined already!" -msgstr "" -"As tarefas mostradas aqui são influenciadas pelos tipos de anjos de que você " -"já faz parte!" - -#: includes/pages/user_shifts.php:166 -msgid "Description of the jobs." -msgstr "Descrição dos trabalhos." - -#: includes/pages/user_shifts.php:168 -msgid "iCal export" -msgstr "Exportar iCal" - -#: includes/pages/user_shifts.php:168 -#, php-format -msgid "" -"Export of shown shifts. iCal format or JSON format available (please keep secret, otherwise reset the api key)." -msgstr "" -"Exportar os turnos mostrados. formato iCal ou formato JSON disponíveis (por favor mantenha secreto, ou resete a chave API)." - -#: includes/pages/user_shifts.php:169 -msgid "Filter" -msgstr "Filtro" - -#: includes/pages/user_shifts.php:191 includes/view/ShiftTypes_view.php:23 -msgid "All" -msgstr "Todos" - -#: includes/pages/user_shifts.php:192 -msgid "None" -msgstr "Nenhum" - -#: includes/sys_menu.php:139 -msgid "Admin" -msgstr "Admin" - -#: includes/sys_menu.php:163 -msgid "Manage rooms" -msgstr "Gerenciar salas" - -#: includes/sys_template.php:166 -msgid "No data found." -msgstr "Nenhum dado encontrado." - -#: includes/view/AngelTypes_view.php:27 includes/view/AngelTypes_view.php:244 -msgid "Unconfirmed" -msgstr "Não confirmado" - -#: includes/view/AngelTypes_view.php:29 includes/view/AngelTypes_view.php:33 -msgid "Supporter" -msgstr "Apoiador" - -#: includes/view/AngelTypes_view.php:31 includes/view/AngelTypes_view.php:35 -msgid "Member" -msgstr "Membro" - -#: includes/view/AngelTypes_view.php:42 -#, php-format -msgid "Do you want to delete angeltype %s?" -msgstr "Você deseja apagar o tipo de anjo %s?" - -#: includes/view/AngelTypes_view.php:44 includes/view/ShiftTypes_view.php:15 -#: includes/view/UserAngelTypes_view.php:8 -#: includes/view/UserAngelTypes_view.php:19 -#: includes/view/UserAngelTypes_view.php:30 -#: includes/view/UserAngelTypes_view.php:41 -#: includes/view/UserAngelTypes_view.php:52 -#: includes/view/UserAngelTypes_view.php:82 -msgid "cancel" -msgstr "cancelar" - -#: includes/view/AngelTypes_view.php:67 includes/view/AngelTypes_view.php:269 -msgid "Restricted" -msgstr "Restrito" - -#: includes/view/AngelTypes_view.php:68 -msgid "No Self Sign Up" -msgstr "Auto inscrição não permitida" - -#: includes/view/AngelTypes_view.php:69 -msgid "Requires driver license" -msgstr "Requer carteira de motorista" - -#: includes/view/AngelTypes_view.php:73 -msgid "" -"Restricted angel types can only be used by an angel if enabled by a " -"supporter (double opt-in)." -msgstr "" -"Tipos de anjo restritos só podem ser usados por um anjo quando autorizados " -"por \n" -"um apoiador (duplo opt-in)." - -#: includes/view/AngelTypes_view.php:74 includes/view/AngelTypes_view.php:205 -#: includes/view/ShiftTypes_view.php:37 includes/view/ShiftTypes_view.php:58 -#: includes/view/Shifts_view.php:92 -msgid "Description" -msgstr "Descrição" - -#: includes/view/AngelTypes_view.php:75 includes/view/ShiftTypes_view.php:38 -msgid "Please use markdown for the description." -msgstr "Por favor use markdown para a descrição." - -#: includes/view/AngelTypes_view.php:90 -msgid "my driving license" -msgstr "Minha carteira de motorista" - -#: includes/view/AngelTypes_view.php:97 -msgid "" -"This angeltype requires a driver license. Please enter your driver license " -"information!" -msgstr "" -"Esse tipo de anjo requer carteira de motorista. Por favor digite sua " -"carteira de motorista." - -#: includes/view/AngelTypes_view.php:101 -#, php-format -msgid "" -"You are unconfirmed for this angeltype. Please go to the introduction for %s " -"to get confirmed." -msgstr "" -"Você não está confirmado para esse tipo de anjo. Por favor vá para a " -"apresentação para %s\n" -"para ser confirmado." - -#: includes/view/AngelTypes_view.php:140 -msgid "confirm" -msgstr "confirmar" - -#: includes/view/AngelTypes_view.php:141 -msgid "deny" -msgstr "rejeitar" - -#: includes/view/AngelTypes_view.php:157 -msgid "remove" -msgstr "remover" - -#: includes/view/AngelTypes_view.php:179 -msgid "Driver" -msgstr "Motorista" - -#: includes/view/AngelTypes_view.php:180 -msgid "Has car" -msgstr "Tem carro" - -#: includes/view/AngelTypes_view.php:181 -#: includes/view/UserDriverLicenses_view.php:27 -msgid "Car" -msgstr "Carro" - -#: includes/view/AngelTypes_view.php:182 -msgid "3,5t Transporter" -msgstr "Transporte 3,5t" - -#: includes/view/AngelTypes_view.php:183 -msgid "7,5t Truck" -msgstr "Caminhão 7,5t" - -#: includes/view/AngelTypes_view.php:184 -msgid "12,5t Truck" -msgstr "Caminhão 12,5t" - -#: includes/view/AngelTypes_view.php:185 -#: includes/view/UserDriverLicenses_view.php:31 -msgid "Forklift" -msgstr "Empilhadeira" - -#: includes/view/AngelTypes_view.php:215 -msgid "Supporters" -msgstr "Apoiadores" - -#: includes/view/AngelTypes_view.php:235 -msgid "Members" -msgstr "Membros" - -#: includes/view/AngelTypes_view.php:238 -#: includes/view/UserAngelTypes_view.php:72 -msgid "Add" -msgstr "Adicionar" - -#: includes/view/AngelTypes_view.php:246 -msgid "confirm all" -msgstr "confirmar todos" - -#: includes/view/AngelTypes_view.php:247 -msgid "deny all" -msgstr "rejeitar todos" - -#: includes/view/AngelTypes_view.php:264 -msgid "New angeltype" -msgstr "Novo tipo de anjo" - -#: includes/view/AngelTypes_view.php:270 -msgid "Self Sign Up Allowed" -msgstr "Auto Inscrição autorizada" - -#: includes/view/AngelTypes_view.php:271 -msgid "Membership" -msgstr "Membro" - -#: includes/view/AngelTypes_view.php:296 -msgid "" -"This angeltype is restricted by double-opt-in by a team supporter. Please " -"show up at the according introduction meetings." -msgstr "" -"Esse tipo de anjo é restrito por um opt-in duplo por um time de apoio. Por " -"favor\n" -"compareça de acordo com os encontros de introdução." - -#: includes/view/AngelTypes_view.php:317 -msgid "FAQ" -msgstr "FAQ" - -#: includes/view/AngelTypes_view.php:319 -msgid "" -"Here is the list of teams and their tasks. If you have questions, read the " -"FAQ." -msgstr "" -"Aqui está uma lista dos times e suas tarefas. Se você tem dúvidas, leia a\n" -"FAQ." - -#: includes/view/EventConfig_view.php:10 includes/view/EventConfig_view.php:18 -#, php-format -msgid "Welcome to the %s!" -msgstr "Bem vindo a %s!" - -#: includes/view/EventConfig_view.php:24 -msgid "Buildup starts" -msgstr "Início da montagem" - -#: includes/view/EventConfig_view.php:26 includes/view/EventConfig_view.php:34 -#: includes/view/EventConfig_view.php:42 includes/view/EventConfig_view.php:50 -#: includes/view/EventConfig_view.php:67 includes/view/EventConfig_view.php:72 -#: includes/view/EventConfig_view.php:77 includes/view/Shifts_view.php:68 -#: includes/view/Shifts_view.php:76 -msgid "Y-m-d" -msgstr "d/m/Y" - -#: includes/view/EventConfig_view.php:32 -msgid "Event starts" -msgstr "O evento começa em" - -#: includes/view/EventConfig_view.php:40 -msgid "Event ends" -msgstr "O evento termina em" - -#: includes/view/EventConfig_view.php:48 -msgid "Teardown ends" -msgstr "Desmontagem termina" - -#: includes/view/EventConfig_view.php:67 -#, php-format -msgid "%s, from %s to %s" -msgstr "%s, de %s para %s" - -#: includes/view/EventConfig_view.php:72 -#, php-format -msgid "%s, starting %s" -msgstr "%s, começando %s" - -#: includes/view/EventConfig_view.php:77 -#, php-format -msgid "Event from %s to %s" -msgstr "Evento de %s para %s" - -#: includes/view/EventConfig_view.php:106 -msgid "Event Name" -msgstr "Nome do evento" - -#: includes/view/EventConfig_view.php:107 -msgid "Event Name is shown on the start page." -msgstr "Nome do evento é mostrado na página inicial." - -#: includes/view/EventConfig_view.php:108 -msgid "Event Welcome Message" -msgstr "Mensagem de boas vindas do evento" - -#: includes/view/EventConfig_view.php:109 -msgid "" -"Welcome message is shown after successful registration. You can use markdown." -msgstr "" -"A mensagem de boas vindas é mostrada após a inscrição. Você pode usar " -"markdown." - -#: includes/view/EventConfig_view.php:112 -msgid "Buildup date" -msgstr "Data da montagem" - -#: includes/view/EventConfig_view.php:113 -msgid "Event start date" -msgstr "Data de início do evento" - -#: includes/view/EventConfig_view.php:116 -msgid "Teardown end date" -msgstr "Data da desmontagem" - -#: includes/view/EventConfig_view.php:117 -msgid "Event end date" -msgstr "Data de término do evento" - -#: includes/view/Questions_view.php:17 -msgid "Open questions" -msgstr "Dúvidas abertas" - -#: includes/view/Questions_view.php:31 -msgid "Your Question:" -msgstr "Sua dúvida:" - -#: includes/view/ShiftCalendarRenderer.php:209 includes/view/User_view.php:367 -msgid "Time" -msgstr "Hora" - -#: includes/view/ShiftCalendarRenderer.php:248 -msgid "Your shift" -msgstr "Seu turno" - -#: includes/view/ShiftCalendarRenderer.php:249 -msgid "Help needed" -msgstr "Necessita ajuda" - -#: includes/view/ShiftCalendarRenderer.php:250 -msgid "Other angeltype needed / collides with my shifts" -msgstr "Outro tipo de anjo necessário / colide com seus turnos" - -#: includes/view/ShiftCalendarRenderer.php:251 -msgid "Shift is full" -msgstr "O turno está lotado" - -#: includes/view/ShiftCalendarRenderer.php:252 -msgid "Shift running/ended" -msgstr "Turno em andamento/finalizado" - -#: includes/view/ShiftCalendarShiftRenderer.php:96 -msgid "Add more angels" -msgstr "Adicionar mais anjos" - -#: includes/view/ShiftCalendarShiftRenderer.php:127 -#, php-format -msgid "%d helper needed" -msgid_plural "%d helpers needed" -msgstr[0] "%d necessita de ajuda" -msgstr[1] "%d necessitam de ajuda" - -#: includes/view/ShiftCalendarShiftRenderer.php:132 -#: includes/view/Shifts_view.php:23 -msgid "Sign up" -msgstr "Registrar" - -#: includes/view/ShiftCalendarShiftRenderer.php:137 -msgid "ended" -msgstr "encerrado" - -#: includes/view/ShiftCalendarShiftRenderer.php:146 -#: includes/view/Shifts_view.php:25 -#, php-format -msgid "Become %s" -msgstr "Tornar-se %s" - -#: includes/view/ShiftEntry_view.php:18 includes/view/User_view.php:267 -#: includes/view/User_view.php:269 -msgid "Freeloaded" -msgstr "Freeloaded" - -#: includes/view/ShiftEntry_view.php:19 -msgid "Freeload comment (Only for shift coordination):" -msgstr "Comentário freeload (Apenas para coordenação de turno):" - -#: includes/view/ShiftEntry_view.php:22 -msgid "Edit shift entry" -msgstr "Editar entrada de turno" - -#: includes/view/ShiftEntry_view.php:25 -msgid "Angel:" -msgstr "Anjo:" - -#: includes/view/ShiftEntry_view.php:26 -msgid "Date, Duration:" -msgstr "Data, Duração:" - -#: includes/view/ShiftEntry_view.php:27 -msgid "Location:" -msgstr "Local:" - -#: includes/view/ShiftEntry_view.php:28 -msgid "Title:" -msgstr "Título:" - -#: includes/view/ShiftEntry_view.php:29 -msgid "Type:" -msgstr "Tipo:" - -#: includes/view/ShiftEntry_view.php:30 -msgid "Comment (for your eyes only):" -msgstr "Comentário (apenas para ler):" - -#: includes/view/ShiftTypes_view.php:13 -#, php-format -msgid "Do you want to delete shifttype %s?" -msgstr "Você quer apagar o turno %s?" - -#: includes/view/ShiftTypes_view.php:29 -msgid "Edit shifttype" -msgstr "Editar tipo de turno" - -#: includes/view/ShiftTypes_view.php:29 -msgid "Create shifttype" -msgstr "Criar tipo de turno" - -#: includes/view/ShiftTypes_view.php:48 -#, php-format -msgid "for team %s" -msgstr "para o time %s" - -#: includes/view/ShiftTypes_view.php:75 -msgid "New shifttype" -msgstr "Novo tipo de turno" - -#: includes/view/Shifts_view.php:7 -#, php-format -msgid "created at %s by %s" -msgstr "criado em %s por %s" - -#: includes/view/Shifts_view.php:10 -#, php-format -msgid "edited at %s by %s" -msgstr "editado em %s por %s" - -#: includes/view/Shifts_view.php:52 -msgid "This shift collides with one of your shifts." -msgstr "Esse turno colide com um dos seus outros turnos." - -#: includes/view/Shifts_view.php:53 -msgid "You are signed up for this shift." -msgstr "Você foi designado para esse turno." - -#: includes/view/Shifts_view.php:82 includes/view/User_view.php:368 -msgid "Location" -msgstr "Local" - -#: includes/view/UserAngelTypes_view.php:6 -#, php-format -msgid "Do you really want to add supporter rights for %s to %s?" -msgstr "Você realmente quer dar permissão de apoiador de %s para %s?" - -#: includes/view/UserAngelTypes_view.php:6 -#, php-format -msgid "Do you really want to remove supporter rights for %s from %s?" -msgstr "Você realmente quer remover a permissão de apoiador de %s para %s?" - -#: includes/view/UserAngelTypes_view.php:17 -#, php-format -msgid "Do you really want to deny all users for %s?" -msgstr "Você realmente quer negar todos os usuários para %s?" - -#: includes/view/UserAngelTypes_view.php:28 -#, php-format -msgid "Do you really want to confirm all users for %s?" -msgstr "Você realmente quer confirmar todos os usuários para %s?" - -#: includes/view/UserAngelTypes_view.php:39 -#, php-format -msgid "Do you really want to confirm %s for %s?" -msgstr "Você realmente quer confirmar %s para %s?" - -#: includes/view/UserAngelTypes_view.php:50 -#, php-format -msgid "Do you really want to delete %s from %s?" -msgstr "Você realmente quer apagar %s de %s?" - -#: includes/view/UserAngelTypes_view.php:71 -msgid "User" -msgstr "Usuário" - -#: includes/view/UserAngelTypes_view.php:80 -#, php-format -msgid "Do you really want to add %s to %s?" -msgstr "Você realmente quer adicionar %s em %s?" - -#: includes/view/UserAngelTypes_view.php:83 -msgid "save" -msgstr "salvar" - -#: includes/view/UserDriverLicenses_view.php:17 -msgid "Back to profile" -msgstr "Voltar para o perfil" - -#: includes/view/UserDriverLicenses_view.php:21 -msgid "Privacy" -msgstr "Privacidade" - -#: includes/view/UserDriverLicenses_view.php:21 -msgid "" -"Your driving license information is only visible for supporters and admins." -msgstr "" -"Os dados da sua carteira de motorista são apenas visíveis para os apoiadores " -"e os admins." - -#: includes/view/UserDriverLicenses_view.php:22 -msgid "I am willing to drive a car for the event" -msgstr "Eu desejo dirigir carros para o evento" - -#: includes/view/UserDriverLicenses_view.php:25 -msgid "" -"I have my own car with me and am willing to use it for the event (You'll get " -"reimbursed for fuel)" -msgstr "" -"Eu tenho meu próprio carro e estou disposto a usá-lo no evento\n" -"(Você terá o combustível reembolsado)" - -#: includes/view/UserDriverLicenses_view.php:26 -msgid "Driver license" -msgstr "Carteira de motorista" - -#: includes/view/UserDriverLicenses_view.php:28 -msgid "Transporter 3,5t" -msgstr "Transportador 3,5t" - -#: includes/view/UserDriverLicenses_view.php:29 -msgid "Truck 7,5t" -msgstr "Caminhão 7,5t" - -#: includes/view/UserDriverLicenses_view.php:30 -msgid "Truck 12,5t" -msgstr "Caminhão 12,5t" - -#: includes/view/User_view.php:7 -msgid "Please select..." -msgstr "Por favor selecione..." - -#: includes/view/User_view.php:38 -msgid "Here you can change your user details." -msgstr "Aqui você pode mudar os seus detalhes de usuário." - -#: includes/view/User_view.php:44 -msgid "Planned date of departure" -msgstr "Data planejada para saída" - -#: includes/view/User_view.php:55 -msgid "Please visit the angeltypes page to manage your angeltypes." -msgstr "" -"Por favor visite a página de tipos de anjo para gerenciar os tipos de anjo" - -#: includes/view/User_view.php:61 -msgid "Here you can change your password." -msgstr "Aqui você pode mudar sua senha." - -#: includes/view/User_view.php:62 -msgid "Old password:" -msgstr "Senha antiga:" - -#: includes/view/User_view.php:63 -msgid "New password:" -msgstr "Nova senha:" - -#: includes/view/User_view.php:64 -msgid "Password confirmation:" -msgstr "Confirmação de senha:" - -#: includes/view/User_view.php:68 -msgid "Here you can choose your color settings:" -msgstr "Aqui você pode selecionar sua configuração de cor:" - -#: includes/view/User_view.php:69 -msgid "Color settings:" -msgstr "Configuração de cor:" - -#: includes/view/User_view.php:73 -msgid "Here you can choose your language:" -msgstr "Aqui você pode selecionar seu idioma:" - -#: includes/view/User_view.php:74 -msgid "Language:" -msgstr "Idioma:" - -#: includes/view/User_view.php:88 -msgid "Registration successful" -msgstr "Registrado com sucesso" - -#: includes/view/User_view.php:126 -msgid "" -"Do you really want to delete the user including all his shifts and every " -"other piece of his data?" -msgstr "" -"Você realmente quer apagar o usuário, incluindo todos seus turnos e todos\n" -"os seus dados?" - -#: includes/view/User_view.php:128 -msgid "Your password" -msgstr "Sua senha" - -#: includes/view/User_view.php:143 -#, php-format -msgid "Angel should receive at least %d vouchers." -msgstr "Um anjo deve receber no mínimo %d vouchers." - -#: includes/view/User_view.php:145 -msgid "Number of vouchers given out" -msgstr "Número de vouchers dados" - -#: includes/view/User_view.php:159 -msgid "m/d/Y h:i a" -msgstr "d/m/Y H:i" - -#: includes/view/User_view.php:178 -msgid "New user" -msgstr "Novo usuário" - -#: includes/view/User_view.php:182 -msgid "Prename" -msgstr "Nome" - -#: includes/view/User_view.php:185 includes/view/User_view.php:350 -msgid "Arrived" -msgstr "Chegou" - -#: includes/view/User_view.php:186 -msgid "Voucher" -msgstr "Voucher" - -#: includes/view/User_view.php:187 -msgid "Freeloads" -msgstr "Freeloads" - -#: includes/view/User_view.php:188 includes/view/User_view.php:352 -msgid "Active" -msgstr "Ativo" - -#: includes/view/User_view.php:190 includes/view/User_view.php:353 -msgid "T-Shirt" -msgstr "Camiseta" - -#: includes/view/User_view.php:192 -msgid "Last login" -msgstr "Último login" - -#: includes/view/User_view.php:209 -msgid "Free" -msgstr "Livre" - -#: includes/view/User_view.php:214 includes/view/User_view.php:216 -#, php-format -msgid "Next shift %c" -msgstr "Próximo turno %c" - -#: includes/view/User_view.php:221 -#, php-format -msgid "Shift starts %c" -msgstr "Turno inicia em %c" - -#: includes/view/User_view.php:223 -#, php-format -msgid "Shift ends %c" -msgstr "Turno termina em %c" - -#: includes/view/User_view.php:280 -msgid "sign off" -msgstr "sair" - -#: includes/view/User_view.php:305 -msgid "Sum:" -msgstr "Soma:" - -#: includes/view/User_view.php:329 -msgid "driving license" -msgstr "carteira de motorista" - -#: includes/view/User_view.php:331 -msgid "Edit vouchers" -msgstr "Editar vouchers" - -#: includes/view/User_view.php:333 -msgid "iCal Export" -msgstr "Exportar iCal" - -#: includes/view/User_view.php:334 -msgid "JSON Export" -msgstr "Exportar em formato JSON" - -#: includes/view/User_view.php:347 -msgid "User state" -msgstr "Status" - -#: includes/view/User_view.php:350 -#, php-format -msgid "Arrived at %s" -msgstr "Chegous às %s" - -#: includes/view/User_view.php:350 -#, php-format -msgid "Not arrived (Planned: %s)" -msgstr "Não chegou (Planejado: %s)" - -#: includes/view/User_view.php:350 -msgid "Not arrived" -msgstr "Não chegou" - -#: includes/view/User_view.php:351 -#, php-format -msgid "Got %s voucher" -msgid_plural "Got %s vouchers" -msgstr[0] "Einen Voucher bekommen" -msgstr[1] "%s Voucher bekommen" - -#: includes/view/User_view.php:351 -msgid "Got no vouchers" -msgstr "Pegou voucher %s" - -#: includes/view/User_view.php:360 -msgid "Rights" -msgstr "Permissões" - -#: includes/view/User_view.php:369 -msgid "Name & workmates" -msgstr "Nome & colegas" - -#: includes/view/User_view.php:370 -msgid "Comment" -msgstr "Comentar" - -#: includes/view/User_view.php:371 -msgid "Action" -msgstr "Ação" - -#: includes/view/User_view.php:373 -#, php-format -msgid "Your night shifts between %d and %d am count twice." -msgstr "Os seus turnos noturnos entre %dh e %dh contam como dois." - -#: includes/view/User_view.php:374 -#, php-format -msgid "" -"Go to the shifts table to sign yourself up for some " -"shifts." -msgstr "" -"Vá para a tabela de turnos para se inscrever em alguns\n" -"turnos." - -#: includes/view/User_view.php:384 -msgid "" -"We will send you an e-mail with a password recovery link. Please use the " -"email address you used for registration." -msgstr "" -"Nós enviaremos um email com um link para recuperação de senha. Por favor use " -"o \n" -"endereço de email informado no seu registro." - -#: includes/view/User_view.php:387 -msgid "Recover" -msgstr "Recuperar" - -#: includes/view/User_view.php:398 -msgid "Please enter a new password." -msgstr "Por favor digite uma nova senha." - -#: includes/view/User_view.php:447 -msgid "" -"Please enter your planned date of departure on your settings page to give us " -"a feeling for teardown capacities." -msgstr "" -"Por favor digite sua data planejada de saída na sua página de configurações " -"para\n" -"termos uma noção da nossa capacidade de desmontagem." - -#: includes/view/User_view.php:457 -#, php-format -msgid "" -"You freeloaded at least %s shifts. Shift signup is locked. Please go to " -"heavens desk to be unlocked again." -msgstr "" -"Você deixou de participar de pelo menos %s dos turnos. O registro em turnos " -"está suspenso.\n" -"Por favor vá até a mesa do paraíso para ser desbloqueado novamente." - -#: includes/view/User_view.php:468 -msgid "" -"You are not marked as arrived. Please go to heaven's desk, get your angel " -"badge and/or tell them that you arrived already." -msgstr "" -"Sua chegada não foi marcada. Por favor vá até a mesa do paraíso, pegue sua " -"credencial\n" -"de anjo e/ou informe que você já chegou." - -#: includes/view/User_view.php:478 -msgid "You need to specify a tshirt size in your settings!" -msgstr "Você precisa especificar o tamanho de camiseta nas suas configurações!" - -#: includes/view/User_view.php:488 -msgid "" -"You need to specify a DECT phone number in your settings! If you don't have " -"a DECT phone, just enter \"-\"." -msgstr "" -"Você precisa especificar um número DECT de telefone nas suas configuracões!\n" -"Se você não tem um telefone DECT, apenas digite \\-\\." - -#: public/index.php:155 -msgid "No Access" -msgstr "Sem acesso" - -#: public/index.php:156 -msgid "" -"You don't have permission to view this page. You probably have to sign in or " -"register in order to gain access!" -msgstr "" -"Você não tem permissão para ver essa página. Você provavelmente terá que " -"fazer login ou se registrar para ganhar acesso!" - -#~ msgid "Registration is disabled." -#~ msgstr "Registros estão desabilitados." - -#~ msgid "Please enter your planned date of arrival." -#~ msgstr "Por favor digite seu horario planificado de chagada " - -#~ msgid "Password could not be updated." -#~ msgstr "Nao foi possivel atualizar a senha" - -#~ msgid "We got no information about the event right now." -#~ msgstr "Nao tem info sobre o evento agora" - -#~ msgid "from %s to %s" -#~ msgstr "desde %s ate %s" - -#~ msgid "Please enter your planned date of departure." -#~ msgstr "Por favor pone seu horario planificado de ida" - -#~ msgid "Please select a user." -#~ msgstr "Seleciona um usuario" - -#~ msgid "Unable to load user." -#~ msgstr "Nao foi possivel carregar o usuario" - -#~ msgid "Entries" -#~ msgstr "Entradas" - -#~ msgid "Use new style if possible" -#~ msgstr "Usa umo estilo novo se possivel" - -#~ msgid "Coordinator" -#~ msgstr "Coordinador" - -#~ msgid "Coordinators" -#~ msgstr "Coordinadores" - -#~ msgid " vouchers." -#~ msgstr " vouchers." - -#~ msgid "" -#~ "This is a automatically calculated MINIMUM value, you can of course give " -#~ "out more if appropriate!" -#~ msgstr "" -#~ "Esso e' calucula automaticamente o valor MINIMO, voce pode claramente " -#~ "mudar isso com umo mais appropriado! " - -#~ msgid "You have been signed off from the shift." -#~ msgstr "Voce se desconnecto do seu turno" - -#~ msgid "planned departure" -#~ msgstr "saida planejada" - -#~ msgid "Tasks" -#~ msgstr "tarefas" - -#~ msgid "User didnt got vouchers." -#~ msgstr "O usuario nao tem vouchers." - -#~ msgid "Remove vouchers" -#~ msgstr "Apaga voucher" - -#~ msgid "" -#~ "This shift is running now or ended already. Please contact a dispatcher " -#~ "to join the shift." -#~ msgstr "" -#~ "Esse turno esta ativo agora o ja acabou. Por favor contata o coordinador " -#~ "para partecipar nesse turno" - -#~ msgid "" -#~ "You already subscribed to shift in the same timeslot. Please contact a " -#~ "dispatcher to join the shift." -#~ msgstr "" -#~ "Voce ja se registrou al turno no mesmo timeslot. Por favor contata o " -#~ "coordinador para partecipar a esse turno." - -#~ msgid "" -#~ "Hello %s, here you can change your personal settings i.e. password, color " -#~ "settings etc." -#~ msgstr "" -#~ "Oi %s, aqui pode mudar as tuas configuraçeos pessoal (i.e. senha, " -#~ "cor, ...)" - -#~ msgid "Name/Description:" -#~ msgstr "Nome/Descriçao:" - -#~ msgid "Timeslot" -#~ msgstr "Timeslot" - -#~ msgid "The first wants to join %s." -#~ msgstr "O primeiro que quer partecipar %s" - -#~ msgid "Groups" -#~ msgstr "Grupos" - -#~ msgid "ICQ" -#~ msgstr "ICQ" - -#~ msgid "You are not confirmed for this angel type." -#~ msgstr "Voce nao ta confirmado por esse tipo de anjo." - -#~ msgid "Exports" -#~ msgstr "Esporta" - -#~ msgid "Add new angeltype" -#~ msgstr "Adicione um novo tipo de anjo" - -#~ msgid "Language" -#~ msgstr "Idioma" - -#~ msgid "You have %s new message." -#~ msgid_plural "You have %s new messages." -#~ msgstr[0] "Voce tem %s novo message" -#~ msgstr[1] "" - -#~ msgid "" -#~ "These are your shifts.
Please try to appear 15 minutes before " -#~ "your shift begins!
You can remove yourself from a shift up to %d " -#~ "hours before it starts." -#~ msgstr "" -#~ "Esses som teu turnos.
Por favor tenta chegar 15 minudos antes " -#~ "que seu turno comença!
Voce pode se tirar desse turno ate %d horas " -#~ "antes dele començar." - -#~ msgid "Page:" -#~ msgstr "Pagina" - -#~ msgid "Message:" -#~ msgstr "Messagem:" - -#~ msgid "Wakeup" -#~ msgstr "Wakeup" - -#~ msgid "Incomplete call, missing wake-up ID." -#~ msgstr "chamada incompleta, falta o wake-up ID" - -#~ msgid "Wake-up call deleted." -#~ msgstr "wake-up chamada apagada" - -#~ msgid "No wake-up found." -#~ msgstr "Nao encontrei nenhum wake-up" - -#~ msgid "" -#~ "Hello %s, here you can register for a wake-up call. Simply say when and " -#~ "where the angel should come to wake you." -#~ msgstr "" -#~ "Oi %s, aqui voce pode se registrar para a chamada wake-up. So tem que " -#~ "dizer quando e onde os anjos tem que chegar para te acordar (wake up)" - -#~ msgid "All ordered wake-up calls, next first." -#~ msgstr "Todos os ordem wake-up, o proximo primeiro" - -#~ msgid "Place" -#~ msgstr "Lugar" - -#~ msgid "Notes" -#~ msgstr "Notas" - -#~ msgid "Schedule a new wake-up here:" -#~ msgstr "Planifica um novo wake-up aqui:" - -#~ msgid "User %s confirmed as %s." -#~ msgstr "Usuario %s confirmado como %s" - -#~ msgid "" -#~ "Resistance is futile! Your biological and physical parameters will be " -#~ "added to our collectiv! Assimilating angel:" -#~ msgstr "" -#~ "Resistir e' inútil! Seus parâmetros biológico e físico serão adicionados " -#~ "dentro do nosso coletivo! Anjo assimilado: " - -#~ msgid "Confirmed all." -#~ msgstr "Tudo confirmado." - -#~ msgid "asdf" -#~ msgstr "asdf" diff --git a/resources/views/errors/405.twig b/resources/views/errors/405.twig new file mode 100644 index 00000000..cbbb94ea --- /dev/null +++ b/resources/views/errors/405.twig @@ -0,0 +1,5 @@ +{% extends "errors/default.twig" %} + +{% block title %}{{ __("405: Method not allowed") }}{% endblock %} + +{% block content_headline_text %}{{ __("405: Method not allowed") }}{% endblock %} diff --git a/resources/views/macros/base.twig b/resources/views/macros/base.twig new file mode 100644 index 00000000..94287bd4 --- /dev/null +++ b/resources/views/macros/base.twig @@ -0,0 +1,11 @@ +{% macro angel() %} + +{% endmacro %} + +{% macro glyphicon(glyph) %} + +{% endmacro %} + +{% macro alert(message, type) %} +
{{ message }}
+{% endmacro %} diff --git a/resources/views/pages/login.twig b/resources/views/pages/login.twig new file mode 100644 index 00000000..75b98aa1 --- /dev/null +++ b/resources/views/pages/login.twig @@ -0,0 +1,104 @@ +{% extends "layouts/app.twig" %} +{% import 'macros/base.twig' as m %} + +{% block title %}{{ __('Login') }}{% endblock %} + +{% block content %} +
+
+
+

{{ __('Welcome to the %s!', [config('name') ~ m.angel() ~ (config('app_name')|upper) ])|raw }}

+
+
+ +
+ {% for name,date in { + (__('Buildup starts')): config('buildup_start'), + (__('Event starts')): config('event_start'), + (__('Event ends')): config('event_end'), + (__('Teardown ends')): config('teardown_end') + } if date %} + {% if date > date() %} + + {% endif %} + {% endfor %} +
+ +
+
+
+ +
{{ m.angel }} {{ __('Login') }}
+ +
+ {% for message in errors|default([]) %} + {{ m.alert(__(message), 'danger') }} + {% endfor %} + +
+ {{ csrf() }} +
+ +
+ +
+ +
+ +
+
+ + + {% if show_password_recovery|default(false) %} + + {{ __('I forgot my password') }} + + {% endif %} +
+
+ +
+
+ + + +
+
+
+ +
+
+

{{ __('Register') }}

+ {% if has_permission_to('register') and config('registration_enabled') %} +

{{ __('Please sign up, if you want to help us!') }}

+ + {% else %} + {{ m.alert(__('Registration is disabled.'), 'danger') }} + {% endif %} +
+ +
+

{{ __('What can I do?') }}

+

{{ __('Please read about the jobs you can do to help us.') }}

+ +
+
+ +
+{% endblock %} diff --git a/src/Controllers/AuthController.php b/src/Controllers/AuthController.php index cdaee167..e5fc40e3 100644 --- a/src/Controllers/AuthController.php +++ b/src/Controllers/AuthController.php @@ -2,8 +2,12 @@ namespace Engelsystem\Controllers; +use Carbon\Carbon; +use Engelsystem\Helpers\Authenticator; +use Engelsystem\Http\Request; use Engelsystem\Http\Response; use Engelsystem\Http\UrlGeneratorInterface; +use Engelsystem\Models\User\User; use Symfony\Component\HttpFoundation\Session\SessionInterface; class AuthController extends BaseController @@ -17,20 +21,100 @@ class AuthController extends BaseController /** @var UrlGeneratorInterface */ protected $url; - public function __construct(Response $response, SessionInterface $session, UrlGeneratorInterface $url) - { + /** @var Authenticator */ + protected $auth; + + /** @var array */ + protected $permissions = [ + 'login' => 'login', + 'postLogin' => 'login', + ]; + + /** + * @param Response $response + * @param SessionInterface $session + * @param UrlGeneratorInterface $url + * @param Authenticator $auth + */ + public function __construct( + Response $response, + SessionInterface $session, + UrlGeneratorInterface $url, + Authenticator $auth + ) { $this->response = $response; $this->session = $session; $this->url = $url; + $this->auth = $auth; + } + + /** + * @return Response + */ + public function login() + { + return $this->response->withView('pages/login'); + } + + /** + * Posted login form + * + * @param Request $request + * @return Response + */ + public function postLogin(Request $request): Response + { + $return = $this->authenticateUser($request->get('login', ''), $request->get('password', '')); + if (!$return instanceof User) { + return $this->response->withView( + 'pages/login', + ['errors' => [$return], 'show_password_recovery' => true] + ); + } + + $user = $return; + + $this->session->invalidate(); + $this->session->set('user_id', $user->id); + $this->session->set('locale', $user->settings->language); + + $user->last_login_at = new Carbon(); + $user->save(['touch' => false]); + + return $this->response->redirectTo('news'); } /** * @return Response */ - public function logout() + public function logout(): Response { $this->session->invalidate(); return $this->response->redirectTo($this->url->to('/')); } + + /** + * Verify the user and password + * + * @param $login + * @param $password + * @return User|string + */ + protected function authenticateUser(string $login, string $password) + { + if (!$login) { + return 'auth.no-nickname'; + } + + if (!$password) { + return 'auth.no-password'; + } + + if (!$user = $this->auth->authenticate($login, $password)) { + return 'auth.not-found'; + } + + return $user; + } } diff --git a/src/Helpers/Authenticator.php b/src/Helpers/Authenticator.php index 61d07980..db33339b 100644 --- a/src/Helpers/Authenticator.php +++ b/src/Helpers/Authenticator.php @@ -25,6 +25,9 @@ class Authenticator /** @var string[] */ protected $permissions; + /** @var int */ + protected $passwordAlgorithm = PASSWORD_DEFAULT; + /** * @param ServerRequestInterface $request * @param Session $session @@ -48,7 +51,7 @@ class Authenticator return $this->user; } - $userId = $this->session->get('uid'); + $userId = $this->session->get('user_id'); if (!$userId) { return null; } @@ -104,17 +107,15 @@ class Authenticator $abilities = (array)$abilities; if (empty($this->permissions)) { - $userId = $this->user ? $this->user->id : $this->session->get('uid'); + $user = $this->user(); - if ($userId) { - if ($user = $this->user()) { - $this->permissions = $this->getPermissionsByUser($user); + if ($user) { + $this->permissions = $this->getPermissionsByUser($user); - $user->last_login_at = new Carbon(); - $user->save(); - } else { - $this->session->remove('uid'); - } + $user->last_login_at = new Carbon(); + $user->save(); + } elseif ($this->session->get('user_id')) { + $this->session->remove('user_id'); } if (empty($this->permissions)) { @@ -131,6 +132,78 @@ class Authenticator return true; } + /** + * @param string $login + * @param string $password + * @return User|null + */ + public function authenticate(string $login, string $password) + { + /** @var User $user */ + $user = $this->userRepository->whereName($login)->first(); + if (!$user) { + $user = $this->userRepository->whereEmail($login)->first(); + } + + if (!$user) { + return null; + } + + if (!$this->verifyPassword($user, $password)) { + return null; + } + + return $user; + } + + /** + * @param User $user + * @param string $password + * @return bool + */ + public function verifyPassword(User $user, string $password) + { + $algorithm = $this->passwordAlgorithm; + + if (!password_verify($password, $user->password)) { + return false; + } + + if (password_needs_rehash($user->password, $algorithm)) { + $this->setPassword($user, $password); + } + + return true; + } + + /** + * @param UserRepository $user + * @param string $password + */ + public function setPassword(User $user, string $password) + { + $algorithm = $this->passwordAlgorithm; + + $user->password = password_hash($password, $algorithm); + $user->save(); + } + + /** + * @return int + */ + public function getPasswordAlgorithm() + { + return $this->passwordAlgorithm; + } + + /** + * @param int $passwordAlgorithm + */ + public function setPasswordAlgorithm(int $passwordAlgorithm) + { + $this->passwordAlgorithm = $passwordAlgorithm; + } + /** * @param User $user * @return array diff --git a/src/Helpers/AuthenticatorServiceProvider.php b/src/Helpers/AuthenticatorServiceProvider.php index 715a592f..f06e635d 100644 --- a/src/Helpers/AuthenticatorServiceProvider.php +++ b/src/Helpers/AuthenticatorServiceProvider.php @@ -2,14 +2,18 @@ namespace Engelsystem\Helpers; +use Engelsystem\Config\Config; use Engelsystem\Container\ServiceProvider; class AuthenticatorServiceProvider extends ServiceProvider { public function register() { + /** @var Config $config */ + $config = $this->app->get('config'); /** @var Authenticator $authenticator */ $authenticator = $this->app->make(Authenticator::class); + $authenticator->setPasswordAlgorithm($config->get('password_algorithm')); $this->app->instance(Authenticator::class, $authenticator); $this->app->instance('authenticator', $authenticator); diff --git a/src/Middleware/LegacyMiddleware.php b/src/Middleware/LegacyMiddleware.php index af2c6a70..7adcc88d 100644 --- a/src/Middleware/LegacyMiddleware.php +++ b/src/Middleware/LegacyMiddleware.php @@ -19,7 +19,6 @@ class LegacyMiddleware implements MiddlewareInterface 'angeltypes', 'atom', 'ical', - 'login', 'public_dashboard', 'rooms', 'shift_entries', @@ -175,10 +174,6 @@ class LegacyMiddleware implements MiddlewareInterface $title = settings_title(); $content = user_settings(); return [$title, $content]; - case 'login': - $title = login_title(); - $content = guest_login(); - return [$title, $content]; case 'register': $title = register_title(); $content = guest_register(); diff --git a/tests/Unit/Controllers/AuthControllerTest.php b/tests/Unit/Controllers/AuthControllerTest.php index c5349cda..0fad3b6d 100644 --- a/tests/Unit/Controllers/AuthControllerTest.php +++ b/tests/Unit/Controllers/AuthControllerTest.php @@ -3,40 +3,154 @@ namespace Engelsystem\Test\Unit\Controllers; use Engelsystem\Controllers\AuthController; +use Engelsystem\Helpers\Authenticator; +use Engelsystem\Http\Request; use Engelsystem\Http\Response; use Engelsystem\Http\UrlGeneratorInterface; +use Engelsystem\Models\User\Settings; +use Engelsystem\Models\User\User; +use Engelsystem\Test\Unit\HasDatabase; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Symfony\Component\HttpFoundation\Session\SessionInterface; class AuthControllerTest extends TestCase { + use HasDatabase; + /** * @covers \Engelsystem\Controllers\AuthController::__construct - * @covers \Engelsystem\Controllers\AuthController::logout + * @covers \Engelsystem\Controllers\AuthController::login */ - public function testLogout() + public function testLogin() { /** @var Response|MockObject $response */ $response = $this->createMock(Response::class); /** @var SessionInterface|MockObject $session */ - $session = $this->getMockForAbstractClass(SessionInterface::class); /** @var UrlGeneratorInterface|MockObject $url */ - $url = $this->getMockForAbstractClass(UrlGeneratorInterface::class); + /** @var Authenticator|MockObject $auth */ + list(, $session, $url, $auth) = $this->getMocks(); - $session->expects($this->once()) - ->method('invalidate'); + $response->expects($this->once()) + ->method('withView') + ->with('pages/login') + ->willReturn($response); + + $controller = new AuthController($response, $session, $url, $auth); + $controller->login(); + } + + /** + * @covers \Engelsystem\Controllers\AuthController::postLogin + * @covers \Engelsystem\Controllers\AuthController::authenticateUser + */ + public function testPostLogin() + { + $this->initDatabase(); + $request = new Request(); + /** @var Response|MockObject $response */ + $response = $this->createMock(Response::class); + /** @var SessionInterface|MockObject $session */ + /** @var UrlGeneratorInterface|MockObject $url */ + /** @var Authenticator|MockObject $auth */ + list(, $session, $url, $auth) = $this->getMocks(); + + $user = new User([ + 'name' => 'foo', + 'password' => '', + 'email' => '', + 'api_key' => '', + 'last_login_at' => null, + ]); + $user->forceFill(['id' => 42,]); + $user->save(); + + $settings = new Settings(['language' => 'de_DE', 'theme' => '']); + $settings->user() + ->associate($user) + ->save(); + + $auth->expects($this->exactly(2)) + ->method('authenticate') + ->with('foo', 'bar') + ->willReturnOnConsecutiveCalls(null, $user); + + $response->expects($this->exactly(3)) + ->method('withView') + ->withConsecutive( + ['pages/login', ['errors' => ['auth.no-nickname'], 'show_password_recovery' => true]], + ['pages/login', ['errors' => ['auth.no-password'], 'show_password_recovery' => true]], + ['pages/login', ['errors' => ['auth.not-found'], 'show_password_recovery' => true]]) + ->willReturn($response); $response->expects($this->once()) ->method('redirectTo') - ->with('https://foo.bar/'); + ->with('news') + ->willReturn($response); + + $session->expects($this->once()) + ->method('invalidate'); + + $session->expects($this->exactly(2)) + ->method('set') + ->withConsecutive( + ['user_id', 42], + ['locale', 'de_DE'] + ); + + $controller = new AuthController($response, $session, $url, $auth); + $controller->postLogin($request); + + $request = new Request(['login' => 'foo']); + $controller->postLogin($request); + + $request = new Request(['login' => 'foo', 'password' => 'bar']); + // No user found + $controller->postLogin($request); + // Authenticated user + $controller->postLogin($request); + + $this->assertNotNull($user->last_login_at); + } + + /** + * @covers \Engelsystem\Controllers\AuthController::logout + */ + public function testLogout() + { + /** @var Response $response */ + /** @var SessionInterface|MockObject $session */ + /** @var UrlGeneratorInterface|MockObject $url */ + /** @var Authenticator|MockObject $auth */ + list($response, $session, $url, $auth) = $this->getMocks(); + + $session->expects($this->once()) + ->method('invalidate'); $url->expects($this->once()) ->method('to') ->with('/') ->willReturn('https://foo.bar/'); - $controller = new AuthController($response, $session, $url); - $controller->logout(); + $controller = new AuthController($response, $session, $url, $auth); + $return = $controller->logout(); + + $this->assertEquals(['https://foo.bar/'], $return->getHeader('location')); + } + + /** + * @return array + */ + protected function getMocks() + { + $response = new Response(); + /** @var SessionInterface|MockObject $session */ + $session = $this->getMockForAbstractClass(SessionInterface::class); + /** @var UrlGeneratorInterface|MockObject $url */ + $url = $this->getMockForAbstractClass(UrlGeneratorInterface::class); + /** @var Authenticator|MockObject $auth */ + $auth = $this->createMock(Authenticator::class); + + return [$response, $session, $url, $auth]; } } diff --git a/tests/Unit/Controllers/Stub/ControllerImplementation.php b/tests/Unit/Controllers/Stub/ControllerImplementation.php index 01d9f250..a8bf538c 100644 --- a/tests/Unit/Controllers/Stub/ControllerImplementation.php +++ b/tests/Unit/Controllers/Stub/ControllerImplementation.php @@ -14,12 +14,4 @@ class ControllerImplementation extends BaseController 'dolor', ], ]; - - /** - * @param array $permissions - */ - public function setPermissions(array $permissions) - { - $this->permissions = $permissions; - } } diff --git a/tests/Unit/Helpers/AuthenticatorServiceProviderTest.php b/tests/Unit/Helpers/AuthenticatorServiceProviderTest.php index b1767ebc..ab9b23ec 100644 --- a/tests/Unit/Helpers/AuthenticatorServiceProviderTest.php +++ b/tests/Unit/Helpers/AuthenticatorServiceProviderTest.php @@ -3,6 +3,7 @@ namespace Engelsystem\Test\Unit\Helpers; use Engelsystem\Application; +use Engelsystem\Config\Config; use Engelsystem\Helpers\Authenticator; use Engelsystem\Helpers\AuthenticatorServiceProvider; use Engelsystem\Http\Request; @@ -19,11 +20,19 @@ class AuthenticatorServiceProviderTest extends ServiceProviderTest $app = new Application(); $app->bind(ServerRequestInterface::class, Request::class); + $config = new Config(); + $config->set('password_algorithm', PASSWORD_DEFAULT); + $app->instance('config', $config); + $serviceProvider = new AuthenticatorServiceProvider($app); $serviceProvider->register(); $this->assertInstanceOf(Authenticator::class, $app->get(Authenticator::class)); $this->assertInstanceOf(Authenticator::class, $app->get('authenticator')); $this->assertInstanceOf(Authenticator::class, $app->get('auth')); + + /** @var Authenticator $auth */ + $auth = $app->get(Authenticator::class); + $this->assertEquals(PASSWORD_DEFAULT, $auth->getPasswordAlgorithm()); } } diff --git a/tests/Unit/Helpers/AuthenticatorTest.php b/tests/Unit/Helpers/AuthenticatorTest.php index 400278f2..83dc72ad 100644 --- a/tests/Unit/Helpers/AuthenticatorTest.php +++ b/tests/Unit/Helpers/AuthenticatorTest.php @@ -4,6 +4,7 @@ namespace Engelsystem\Test\Unit\Helpers; use Engelsystem\Helpers\Authenticator; use Engelsystem\Models\User\User; +use Engelsystem\Test\Unit\HasDatabase; use Engelsystem\Test\Unit\Helpers\Stub\UserModelImplementation; use Engelsystem\Test\Unit\ServiceProviderTest; use PHPUnit\Framework\MockObject\MockObject; @@ -12,6 +13,8 @@ use Symfony\Component\HttpFoundation\Session\Session; class AuthenticatorTest extends ServiceProviderTest { + use HasDatabase; + /** * @covers \Engelsystem\Helpers\Authenticator::__construct( * @covers \Engelsystem\Helpers\Authenticator::user @@ -29,7 +32,7 @@ class AuthenticatorTest extends ServiceProviderTest $session->expects($this->exactly(3)) ->method('get') - ->with('uid') + ->with('user_id') ->willReturnOnConsecutiveCalls( null, 42, @@ -114,16 +117,13 @@ class AuthenticatorTest extends ServiceProviderTest /** @var User|MockObject $user */ $user = $this->createMock(User::class); - $user->expects($this->once()) - ->method('save'); - - $session->expects($this->exactly(2)) + $session->expects($this->once()) ->method('get') - ->with('uid') + ->with('user_id') ->willReturn(42); $session->expects($this->once()) ->method('remove') - ->with('uid'); + ->with('user_id'); /** @var Authenticator|MockObject $auth */ $auth = $this->getMockBuilder(Authenticator::class) @@ -151,4 +151,115 @@ class AuthenticatorTest extends ServiceProviderTest // Permissions cached $this->assertTrue($auth->can('bar')); } + + /** + * @covers \Engelsystem\Helpers\Authenticator::authenticate + */ + public function testAuthenticate() + { + $this->initDatabase(); + + /** @var ServerRequestInterface|MockObject $request */ + $request = $this->getMockForAbstractClass(ServerRequestInterface::class); + /** @var Session|MockObject $session */ + $session = $this->createMock(Session::class); + $userRepository = new User(); + + (new User([ + 'name' => 'lorem', + 'password' => password_hash('testing', PASSWORD_DEFAULT), + 'email' => 'lorem@foo.bar', + 'api_key' => '', + ]))->save(); + (new User([ + 'name' => 'ipsum', + 'password' => '', + 'email' => 'ipsum@foo.bar', + 'api_key' => '', + ]))->save(); + + $auth = new Authenticator($request, $session, $userRepository); + $this->assertNull($auth->authenticate('not-existing', 'foo')); + $this->assertNull($auth->authenticate('ipsum', 'wrong-password')); + $this->assertInstanceOf(User::class, $auth->authenticate('lorem', 'testing')); + $this->assertInstanceOf(User::class, $auth->authenticate('lorem@foo.bar', 'testing')); + } + + /** + * @covers \Engelsystem\Helpers\Authenticator::verifyPassword + */ + public function testVerifyPassword() + { + $this->initDatabase(); + $password = password_hash('testing', PASSWORD_ARGON2I); + $user = new User([ + 'name' => 'lorem', + 'password' => $password, + 'email' => 'lorem@foo.bar', + 'api_key' => '', + ]); + $user->save(); + + /** @var Authenticator|MockObject $auth */ + $auth = $this->getMockBuilder(Authenticator::class) + ->disableOriginalConstructor() + ->setMethods(['setPassword']) + ->getMock(); + + $auth->expects($this->once()) + ->method('setPassword') + ->with($user, 'testing'); + $auth->setPasswordAlgorithm(PASSWORD_BCRYPT); + + $this->assertFalse($auth->verifyPassword($user, 'randomStuff')); + $this->assertTrue($auth->verifyPassword($user, 'testing')); + } + + /** + * @covers \Engelsystem\Helpers\Authenticator::setPassword + */ + public function testSetPassword() + { + $this->initDatabase(); + $user = new User([ + 'name' => 'ipsum', + 'password' => '', + 'email' => 'ipsum@foo.bar', + 'api_key' => '', + ]); + $user->save(); + + $auth = $this->getAuthenticator(); + $auth->setPasswordAlgorithm(PASSWORD_ARGON2I); + + $auth->setPassword($user, 'FooBar'); + $this->assertTrue($user->isClean()); + + $this->assertTrue(password_verify('FooBar', $user->password)); + $this->assertFalse(password_needs_rehash($user->password, PASSWORD_ARGON2I)); + } + + /** + * @covers \Engelsystem\Helpers\Authenticator::setPasswordAlgorithm + * @covers \Engelsystem\Helpers\Authenticator::getPasswordAlgorithm + */ + public function testPasswordAlgorithm() + { + $auth = $this->getAuthenticator(); + + $auth->setPasswordAlgorithm(PASSWORD_ARGON2I); + $this->assertEquals(PASSWORD_ARGON2I, $auth->getPasswordAlgorithm()); + } + + /** + * @return Authenticator + */ + protected function getAuthenticator() + { + return new class extends Authenticator + { + /** @noinspection PhpMissingParentConstructorInspection */ + public function __construct() { } + }; + } } diff --git a/tests/Unit/Http/UrlGeneratorServiceProviderTest.php b/tests/Unit/Http/UrlGeneratorServiceProviderTest.php index 61bf3e7c..6d18f160 100644 --- a/tests/Unit/Http/UrlGeneratorServiceProviderTest.php +++ b/tests/Unit/Http/UrlGeneratorServiceProviderTest.php @@ -19,7 +19,7 @@ class UrlGeneratorServiceProviderTest extends ServiceProviderTest $urlGenerator = $this->getMockBuilder(UrlGenerator::class) ->getMock(); - $app = $this->getApp(); + $app = $this->getApp(['make', 'instance', 'bind']); $this->setExpects($app, 'make', [UrlGenerator::class], $urlGenerator); $app->expects($this->exactly(2)) @@ -29,6 +29,9 @@ class UrlGeneratorServiceProviderTest extends ServiceProviderTest ['http.urlGenerator', $urlGenerator], [UrlGeneratorInterface::class, $urlGenerator] ); + $app->expects($this->once()) + ->method('bind') + ->with(UrlGeneratorInterface::class, UrlGenerator::class); $serviceProvider = new UrlGeneratorServiceProvider($app); $serviceProvider->register(); -- cgit v1.2.3 From e9f157ec5ccdfae73b4c9e82c9ae7c37bcfa1513 Mon Sep 17 00:00:00 2001 From: Igor Scheller Date: Mon, 3 Dec 2018 23:39:50 +0100 Subject: Renderer: Added shared data --- src/Controllers/Metrics/MetricsEngine.php | 18 ++++++++---- src/Renderer/Engine.php | 22 +++++++++++++++ src/Renderer/EngineInterface.php | 10 +++++-- src/Renderer/HtmlEngine.php | 8 ++++-- src/Renderer/TwigEngine.php | 8 ++++-- .../Unit/Controllers/Metrics/MetricsEngineTest.php | 11 ++++++++ tests/Unit/Renderer/EngineTest.php | 25 +++++++++++++++++ tests/Unit/Renderer/HtmlEngineTest.php | 5 ++-- tests/Unit/Renderer/Stub/EngineImplementation.php | 32 ++++++++++++++++++++++ tests/Unit/Renderer/TwigEngineTest.php | 12 ++++---- 10 files changed, 130 insertions(+), 21 deletions(-) create mode 100644 src/Renderer/Engine.php create mode 100644 tests/Unit/Renderer/EngineTest.php create mode 100644 tests/Unit/Renderer/Stub/EngineImplementation.php diff --git a/src/Controllers/Metrics/MetricsEngine.php b/src/Controllers/Metrics/MetricsEngine.php index 1e0f6957..21ae8fd0 100644 --- a/src/Controllers/Metrics/MetricsEngine.php +++ b/src/Controllers/Metrics/MetricsEngine.php @@ -9,13 +9,13 @@ class MetricsEngine implements EngineInterface /** * Render metrics * - * @example $data = ['foo' => [['labels' => ['foo'=>'bar'], 'value'=>42]], 'bar'=>123] - * * @param string $path * @param mixed[] $data * @return string + * + * @example $data = ['foo' => [['labels' => ['foo'=>'bar'], 'value'=>42]], 'bar'=>123] */ - public function get($path, $data = []): string + public function get(string $path, array $data = []): string { $return = []; foreach ($data as $name => $list) { @@ -52,7 +52,7 @@ class MetricsEngine implements EngineInterface * @param string $path * @return bool */ - public function canRender($path): bool + public function canRender(string $path): bool { return $path == '/metrics'; } @@ -60,8 +60,8 @@ class MetricsEngine implements EngineInterface /** * @param string $name * @param array|mixed $row - * @see https://prometheus.io/docs/instrumenting/exposition_formats/ * @return string + * @see https://prometheus.io/docs/instrumenting/exposition_formats/ */ protected function formatData($name, $row): string { @@ -135,4 +135,12 @@ class MetricsEngine implements EngineInterface $value ); } + + /** + * Does nothing as shared data will onyly result in unexpected behaviour + * + * @param string|mixed[] $key + * @param mixed $value + */ + public function share($key, $value = null) { } } diff --git a/src/Renderer/Engine.php b/src/Renderer/Engine.php new file mode 100644 index 00000000..60f1d686 --- /dev/null +++ b/src/Renderer/Engine.php @@ -0,0 +1,22 @@ + $value]; + } + + $this->sharedData = array_replace_recursive($this->sharedData, $key); + } +} diff --git a/src/Renderer/EngineInterface.php b/src/Renderer/EngineInterface.php index ca468db5..3bce9c02 100644 --- a/src/Renderer/EngineInterface.php +++ b/src/Renderer/EngineInterface.php @@ -11,11 +11,17 @@ interface EngineInterface * @param mixed[] $data * @return string */ - public function get($path, $data = []); + public function get(string $path, array $data = []): string; /** * @param string $path * @return bool */ - public function canRender($path); + public function canRender(string $path): bool; + + /** + * @param string|mixed[] $key + * @param mixed $value + */ + public function share($key, $value = null); } diff --git a/src/Renderer/HtmlEngine.php b/src/Renderer/HtmlEngine.php index 1feafcda..0ccffa65 100644 --- a/src/Renderer/HtmlEngine.php +++ b/src/Renderer/HtmlEngine.php @@ -2,7 +2,7 @@ namespace Engelsystem\Renderer; -class HtmlEngine implements EngineInterface +class HtmlEngine extends Engine { /** * Render a template @@ -11,9 +11,11 @@ class HtmlEngine implements EngineInterface * @param mixed[] $data * @return string */ - public function get($path, $data = []) + public function get(string $path, array $data = []): string { + $data = array_replace_recursive($this->sharedData, $data); $template = file_get_contents($path); + if (is_array($data)) { foreach ($data as $name => $content) { $template = str_replace('%' . $name . '%', $content, $template); @@ -27,7 +29,7 @@ class HtmlEngine implements EngineInterface * @param string $path * @return bool */ - public function canRender($path) + public function canRender(string $path): bool { return mb_strpos($path, '.htm') !== false && file_exists($path); } diff --git a/src/Renderer/TwigEngine.php b/src/Renderer/TwigEngine.php index 55a2e299..aa51a177 100644 --- a/src/Renderer/TwigEngine.php +++ b/src/Renderer/TwigEngine.php @@ -7,7 +7,7 @@ use Twig_Error_Loader as LoaderError; use Twig_Error_Runtime as RuntimeError; use Twig_Error_Syntax as SyntaxError; -class TwigEngine implements EngineInterface +class TwigEngine extends Engine { /** @var Twig */ protected $twig; @@ -25,8 +25,10 @@ class TwigEngine implements EngineInterface * @return string * @throws LoaderError|RuntimeError|SyntaxError */ - public function get($path, $data = []) + public function get(string $path, array $data = []): string { + $data = array_replace_recursive($this->sharedData, $data); + return $this->twig->render($path, $data); } @@ -34,7 +36,7 @@ class TwigEngine implements EngineInterface * @param string $path * @return bool */ - public function canRender($path) + public function canRender(string $path): bool { return $this->twig->getLoader()->exists($path); } diff --git a/tests/Unit/Controllers/Metrics/MetricsEngineTest.php b/tests/Unit/Controllers/Metrics/MetricsEngineTest.php index 38817b36..87a7dc88 100644 --- a/tests/Unit/Controllers/Metrics/MetricsEngineTest.php +++ b/tests/Unit/Controllers/Metrics/MetricsEngineTest.php @@ -66,4 +66,15 @@ class MetricsEngineTest extends TestCase $this->assertFalse($engine->canRender('/metrics.foo')); $this->assertTrue($engine->canRender('/metrics')); } + + /** + * @covers \Engelsystem\Controllers\Metrics\MetricsEngine::share + */ + public function testShare() + { + $engine = new MetricsEngine(); + + $engine->share('foo', 42); + $this->assertEquals('', $engine->get('/metrics')); + } } diff --git a/tests/Unit/Renderer/EngineTest.php b/tests/Unit/Renderer/EngineTest.php new file mode 100644 index 00000000..659d85c5 --- /dev/null +++ b/tests/Unit/Renderer/EngineTest.php @@ -0,0 +1,25 @@ +share(['foo' => ['bar' => 'baz', 'lorem' => 'ipsum']]); + $engine->share(['foo' => ['lorem' => 'dolor']]); + $engine->share('key', 'value'); + + $this->assertEquals( + ['foo' => ['bar' => 'baz', 'lorem' => 'dolor'], 'key' => 'value'], + $engine->getSharedData() + ); + } +} diff --git a/tests/Unit/Renderer/HtmlEngineTest.php b/tests/Unit/Renderer/HtmlEngineTest.php index 4a31e4bc..f76e7528 100644 --- a/tests/Unit/Renderer/HtmlEngineTest.php +++ b/tests/Unit/Renderer/HtmlEngineTest.php @@ -16,11 +16,12 @@ class HtmlEngineTest extends TestCase public function testGet() { $engine = new HtmlEngine(); + $engine->share('shared_data', 'tester'); - $file = $this->createTempFile('
%main_content%
'); + $file = $this->createTempFile('
%main_content% is a %shared_data%
'); $data = $engine->get($file, ['main_content' => 'Lorem ipsum dolor sit']); - $this->assertEquals('
Lorem ipsum dolor sit
', $data); + $this->assertEquals('
Lorem ipsum dolor sit is a tester
', $data); } /** diff --git a/tests/Unit/Renderer/Stub/EngineImplementation.php b/tests/Unit/Renderer/Stub/EngineImplementation.php new file mode 100644 index 00000000..fc436569 --- /dev/null +++ b/tests/Unit/Renderer/Stub/EngineImplementation.php @@ -0,0 +1,32 @@ +sharedData; + } +} diff --git a/tests/Unit/Renderer/TwigEngineTest.php b/tests/Unit/Renderer/TwigEngineTest.php index 9d0618f1..5e5e59d9 100644 --- a/tests/Unit/Renderer/TwigEngineTest.php +++ b/tests/Unit/Renderer/TwigEngineTest.php @@ -20,16 +20,16 @@ class TwigEngineTest extends TestCase $twig = $this->createMock(Twig::class); $path = 'foo.twig'; - $data = ['lorem' => 'ipsum']; - $twig->expects($this->once()) ->method('render') - ->with($path, $data) - ->willReturn('LoremIpsum!'); + ->with($path, ['lorem' => 'ipsum', 'shared' => 'data']) + ->willReturn('LoremIpsum data!'); $engine = new TwigEngine($twig); - $return = $engine->get($path, $data); - $this->assertEquals('LoremIpsum!', $return); + $engine->share('shared', 'data'); + + $return = $engine->get($path, ['lorem' => 'ipsum']); + $this->assertEquals('LoremIpsum data!', $return); } -- cgit v1.2.3 From f90ab26feedb61615bde2f94bbf5acc7e4f28342 Mon Sep 17 00:00:00 2001 From: Igor Scheller Date: Mon, 8 Jul 2019 01:31:59 +0200 Subject: Moved translation helpers to sub namespace --- config/app.php | 2 +- includes/helper/email_helper.php | 3 +- .../Translation/TranslationServiceProvider.php | 63 +++++++++ src/Helpers/Translation/Translator.php | 147 +++++++++++++++++++++ src/Helpers/TranslationServiceProvider.php | 63 --------- src/Helpers/Translator.php | 147 --------------------- src/Middleware/LegacyMiddleware.php | 2 +- src/Middleware/SetLocale.php | 2 +- src/Renderer/Twig/Extensions/Translation.php | 2 +- src/helpers.php | 2 +- .../Translation/TranslationServiceProviderTest.php | 84 ++++++++++++ tests/Unit/Helpers/Translation/TranslatorTest.php | 90 +++++++++++++ .../Helpers/TranslationServiceProviderTest.php | 84 ------------ tests/Unit/Helpers/TranslatorTest.php | 90 ------------- tests/Unit/HelpersTest.php | 2 +- tests/Unit/Middleware/LegacyMiddlewareTest.php | 2 +- tests/Unit/Middleware/SetLocaleTest.php | 2 +- .../Renderer/Twig/Extensions/TranslationTest.php | 2 +- 18 files changed, 395 insertions(+), 394 deletions(-) create mode 100644 src/Helpers/Translation/TranslationServiceProvider.php create mode 100644 src/Helpers/Translation/Translator.php delete mode 100644 src/Helpers/TranslationServiceProvider.php delete mode 100644 src/Helpers/Translator.php create mode 100644 tests/Unit/Helpers/Translation/TranslationServiceProviderTest.php create mode 100644 tests/Unit/Helpers/Translation/TranslatorTest.php delete mode 100644 tests/Unit/Helpers/TranslationServiceProviderTest.php delete mode 100644 tests/Unit/Helpers/TranslatorTest.php diff --git a/config/app.php b/config/app.php index 17fdee11..5fda67dd 100644 --- a/config/app.php +++ b/config/app.php @@ -17,7 +17,7 @@ return [ \Engelsystem\Database\DatabaseServiceProvider::class, \Engelsystem\Http\RequestServiceProvider::class, \Engelsystem\Http\SessionServiceProvider::class, - \Engelsystem\Helpers\TranslationServiceProvider::class, + \Engelsystem\Helpers\Translation\TranslationServiceProvider::class, \Engelsystem\Http\ResponseServiceProvider::class, \Engelsystem\Http\Psr7ServiceProvider::class, \Engelsystem\Helpers\AuthenticatorServiceProvider::class, diff --git a/includes/helper/email_helper.php b/includes/helper/email_helper.php index bad0d539..3012d5ce 100644 --- a/includes/helper/email_helper.php +++ b/includes/helper/email_helper.php @@ -1,5 +1,6 @@ get('translator'); $locale = $translator->getLocale(); diff --git a/src/Helpers/Translation/TranslationServiceProvider.php b/src/Helpers/Translation/TranslationServiceProvider.php new file mode 100644 index 00000000..d0cda6a8 --- /dev/null +++ b/src/Helpers/Translation/TranslationServiceProvider.php @@ -0,0 +1,63 @@ +app->get('config'); + /** @var Session $session */ + $session = $this->app->get('session'); + + $locales = $config->get('locales'); + $locale = $config->get('default_locale'); + + $sessionLocale = $session->get('locale', $locale); + if (isset($locales[$sessionLocale])) { + $locale = $sessionLocale; + } + + $this->initGettext(); + $session->set('locale', $locale); + + $translator = $this->app->make( + Translator::class, + ['locale' => $locale, 'locales' => $locales, 'localeChangeCallback' => [$this, 'setLocale']] + ); + $this->app->instance(Translator::class, $translator); + $this->app->instance('translator', $translator); + } + + /** + * @param string $textDomain + * @param string $encoding + * @codeCoverageIgnore + */ + protected function initGettext($textDomain = 'default', $encoding = 'UTF-8') + { + bindtextdomain($textDomain, $this->app->get('path.lang')); + bind_textdomain_codeset($textDomain, $encoding); + textdomain($textDomain); + } + + /** + * @param string $locale + * @codeCoverageIgnore + */ + public function setLocale($locale) + { + // Set the users locale + putenv('LC_ALL=' . $locale); + setlocale(LC_ALL, $locale); + + // Reset numeric formatting to allow output of floats + putenv('LC_NUMERIC=C'); + setlocale(LC_NUMERIC, 'C'); + } +} diff --git a/src/Helpers/Translation/Translator.php b/src/Helpers/Translation/Translator.php new file mode 100644 index 00000000..545963eb --- /dev/null +++ b/src/Helpers/Translation/Translator.php @@ -0,0 +1,147 @@ +localeChangeCallback = $localeChangeCallback; + + $this->setLocale($locale); + $this->setLocales($locales); + } + + /** + * Get the translation for a given key + * + * @param string $key + * @param array $replace + * @return string + */ + public function translate(string $key, array $replace = []): string + { + $translated = $this->translateGettext($key); + + return $this->replaceText($translated, $replace); + } + + /** + * Get the translation for a given key + * + * @param string $key + * @param string $pluralKey + * @param int $number + * @param array $replace + * @return string + */ + public function translatePlural(string $key, string $pluralKey, int $number, array $replace = []): string + { + $translated = $this->translateGettextPlural($key, $pluralKey, $number); + + return $this->replaceText($translated, $replace); + } + + /** + * Replace placeholders + * + * @param string $key + * @param array $replace + * @return mixed|string + */ + protected function replaceText(string $key, array $replace = []) + { + if (empty($replace)) { + return $key; + } + + return call_user_func_array('sprintf', array_merge([$key], $replace)); + } + + /** + * Translate the key via gettext + * + * @param string $key + * @return string + * @codeCoverageIgnore + */ + protected function translateGettext(string $key): string + { + return gettext($key); + } + + /** + * Translate the key via gettext + * + * @param string $key + * @param string $keyPlural + * @param int $number + * @return string + * @codeCoverageIgnore + */ + protected function translateGettextPlural(string $key, string $keyPlural, int $number): string + { + return ngettext($key, $keyPlural, $number); + } + + /** + * @return string + */ + public function getLocale(): string + { + return $this->locale; + } + + /** + * @param string $locale + */ + public function setLocale(string $locale) + { + $this->locale = $locale; + + if (is_callable($this->localeChangeCallback)) { + call_user_func_array($this->localeChangeCallback, [$locale]); + } + } + + /** + * @return string[] + */ + public function getLocales(): array + { + return $this->locales; + } + + /** + * @param string $locale + * @return bool + */ + public function hasLocale(string $locale): bool + { + return isset($this->locales[$locale]); + } + + /** + * @param string[] $locales + */ + public function setLocales(array $locales) + { + $this->locales = $locales; + } +} diff --git a/src/Helpers/TranslationServiceProvider.php b/src/Helpers/TranslationServiceProvider.php deleted file mode 100644 index 4565dfcd..00000000 --- a/src/Helpers/TranslationServiceProvider.php +++ /dev/null @@ -1,63 +0,0 @@ -app->get('config'); - /** @var Session $session */ - $session = $this->app->get('session'); - - $locales = $config->get('locales'); - $locale = $config->get('default_locale'); - - $sessionLocale = $session->get('locale', $locale); - if (isset($locales[$sessionLocale])) { - $locale = $sessionLocale; - } - - $this->initGettext(); - $session->set('locale', $locale); - - $translator = $this->app->make( - Translator::class, - ['locale' => $locale, 'locales' => $locales, 'localeChangeCallback' => [$this, 'setLocale']] - ); - $this->app->instance(Translator::class, $translator); - $this->app->instance('translator', $translator); - } - - /** - * @param string $textDomain - * @param string $encoding - * @codeCoverageIgnore - */ - protected function initGettext($textDomain = 'default', $encoding = 'UTF-8') - { - bindtextdomain($textDomain, $this->app->get('path.lang')); - bind_textdomain_codeset($textDomain, $encoding); - textdomain($textDomain); - } - - /** - * @param string $locale - * @codeCoverageIgnore - */ - public function setLocale($locale) - { - // Set the users locale - putenv('LC_ALL=' . $locale); - setlocale(LC_ALL, $locale); - - // Reset numeric formatting to allow output of floats - putenv('LC_NUMERIC=C'); - setlocale(LC_NUMERIC, 'C'); - } -} diff --git a/src/Helpers/Translator.php b/src/Helpers/Translator.php deleted file mode 100644 index 94fbd795..00000000 --- a/src/Helpers/Translator.php +++ /dev/null @@ -1,147 +0,0 @@ -localeChangeCallback = $localeChangeCallback; - - $this->setLocale($locale); - $this->setLocales($locales); - } - - /** - * Get the translation for a given key - * - * @param string $key - * @param array $replace - * @return string - */ - public function translate(string $key, array $replace = []): string - { - $translated = $this->translateGettext($key); - - return $this->replaceText($translated, $replace); - } - - /** - * Get the translation for a given key - * - * @param string $key - * @param string $pluralKey - * @param int $number - * @param array $replace - * @return string - */ - public function translatePlural(string $key, string $pluralKey, int $number, array $replace = []): string - { - $translated = $this->translateGettextPlural($key, $pluralKey, $number); - - return $this->replaceText($translated, $replace); - } - - /** - * Replace placeholders - * - * @param string $key - * @param array $replace - * @return mixed|string - */ - protected function replaceText(string $key, array $replace = []) - { - if (empty($replace)) { - return $key; - } - - return call_user_func_array('sprintf', array_merge([$key], $replace)); - } - - /** - * Translate the key via gettext - * - * @param string $key - * @return string - * @codeCoverageIgnore - */ - protected function translateGettext(string $key): string - { - return gettext($key); - } - - /** - * Translate the key via gettext - * - * @param string $key - * @param string $keyPlural - * @param int $number - * @return string - * @codeCoverageIgnore - */ - protected function translateGettextPlural(string $key, string $keyPlural, int $number): string - { - return ngettext($key, $keyPlural, $number); - } - - /** - * @return string - */ - public function getLocale(): string - { - return $this->locale; - } - - /** - * @param string $locale - */ - public function setLocale(string $locale) - { - $this->locale = $locale; - - if (is_callable($this->localeChangeCallback)) { - call_user_func_array($this->localeChangeCallback, [$locale]); - } - } - - /** - * @return string[] - */ - public function getLocales(): array - { - return $this->locales; - } - - /** - * @param string $locale - * @return bool - */ - public function hasLocale(string $locale): bool - { - return isset($this->locales[$locale]); - } - - /** - * @param string[] $locales - */ - public function setLocales(array $locales) - { - $this->locales = $locales; - } -} diff --git a/src/Middleware/LegacyMiddleware.php b/src/Middleware/LegacyMiddleware.php index 7adcc88d..27a15faa 100644 --- a/src/Middleware/LegacyMiddleware.php +++ b/src/Middleware/LegacyMiddleware.php @@ -3,7 +3,7 @@ namespace Engelsystem\Middleware; use Engelsystem\Helpers\Authenticator; -use Engelsystem\Helpers\Translator; +use Engelsystem\Helpers\Translation\Translator; use Engelsystem\Http\Request; use Engelsystem\Http\Response; use Psr\Container\ContainerInterface; diff --git a/src/Middleware/SetLocale.php b/src/Middleware/SetLocale.php index 86fa0b7f..568adbe6 100644 --- a/src/Middleware/SetLocale.php +++ b/src/Middleware/SetLocale.php @@ -2,7 +2,7 @@ namespace Engelsystem\Middleware; -use Engelsystem\Helpers\Translator; +use Engelsystem\Helpers\Translation\Translator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; diff --git a/src/Renderer/Twig/Extensions/Translation.php b/src/Renderer/Twig/Extensions/Translation.php index 41619c19..3e6f30b4 100644 --- a/src/Renderer/Twig/Extensions/Translation.php +++ b/src/Renderer/Twig/Extensions/Translation.php @@ -2,7 +2,7 @@ namespace Engelsystem\Renderer\Twig\Extensions; -use Engelsystem\Helpers\Translator; +use Engelsystem\Helpers\Translation\Translator; use Twig_Extension as TwigExtension; use Twig_Extensions_TokenParser_Trans as TranslationTokenParser; use Twig_Filter as TwigFilter; diff --git a/src/helpers.php b/src/helpers.php index 111141e4..051b78a3 100644 --- a/src/helpers.php +++ b/src/helpers.php @@ -4,7 +4,7 @@ use Engelsystem\Application; use Engelsystem\Config\Config; use Engelsystem\Helpers\Authenticator; -use Engelsystem\Helpers\Translator; +use Engelsystem\Helpers\Translation\Translator; use Engelsystem\Http\Request; use Engelsystem\Http\Response; use Engelsystem\Http\UrlGeneratorInterface; diff --git a/tests/Unit/Helpers/Translation/TranslationServiceProviderTest.php b/tests/Unit/Helpers/Translation/TranslationServiceProviderTest.php new file mode 100644 index 00000000..171b5967 --- /dev/null +++ b/tests/Unit/Helpers/Translation/TranslationServiceProviderTest.php @@ -0,0 +1,84 @@ +getApp(['make', 'instance', 'get']); + /** @var Config|MockObject $config */ + $config = $this->createMock(Config::class); + /** @var Session|MockObject $session */ + $session = $this->createMock(Session::class); + /** @var Translator|MockObject $translator */ + $translator = $this->createMock(Translator::class); + + /** @var TranslationServiceProvider|MockObject $serviceProvider */ + $serviceProvider = $this->getMockBuilder(TranslationServiceProvider::class) + ->setConstructorArgs([$app]) + ->setMethods(['initGettext', 'setLocale']) + ->getMock(); + + $serviceProvider->expects($this->once()) + ->method('initGettext'); + + $app->expects($this->exactly(2)) + ->method('get') + ->withConsecutive(['config'], ['session']) + ->willReturnOnConsecutiveCalls($config, $session); + + $defaultLocale = 'fo_OO'; + $locale = 'te_ST.WTF-9'; + $locales = ['fo_OO' => 'Foo', 'fo_OO.BAR' => 'Foo (Bar)', 'te_ST.WTF-9' => 'WTF\'s Testing?']; + $config->expects($this->exactly(2)) + ->method('get') + ->withConsecutive( + ['locales'], + ['default_locale'] + ) + ->willReturnOnConsecutiveCalls( + $locales, + $defaultLocale + ); + + $session->expects($this->once()) + ->method('get') + ->with('locale', $defaultLocale) + ->willReturn($locale); + $session->expects($this->once()) + ->method('set') + ->with('locale', $locale); + + $app->expects($this->once()) + ->method('make') + ->with( + Translator::class, + [ + 'locale' => $locale, + 'locales' => $locales, + 'localeChangeCallback' => [$serviceProvider, 'setLocale'], + ] + ) + ->willReturn($translator); + + $app->expects($this->exactly(2)) + ->method('instance') + ->withConsecutive( + [Translator::class, $translator], + ['translator', $translator] + ); + + $serviceProvider->register(); + } +} diff --git a/tests/Unit/Helpers/Translation/TranslatorTest.php b/tests/Unit/Helpers/Translation/TranslatorTest.php new file mode 100644 index 00000000..7e9c534c --- /dev/null +++ b/tests/Unit/Helpers/Translation/TranslatorTest.php @@ -0,0 +1,90 @@ + 'Tests', 'fo_OO' => 'SomeFOO']; + $locale = 'te_ST.ER-01'; + + /** @var callable|MockObject $callable */ + $callable = $this->getMockBuilder(stdClass::class) + ->setMethods(['__invoke']) + ->getMock(); + $callable->expects($this->exactly(2)) + ->method('__invoke') + ->withConsecutive(['te_ST.ER-01'], ['fo_OO']); + + $translator = new Translator($locale, $locales, $callable); + + $this->assertEquals($locales, $translator->getLocales()); + $this->assertEquals($locale, $translator->getLocale()); + + $translator->setLocale('fo_OO'); + $this->assertEquals('fo_OO', $translator->getLocale()); + + $newLocales = ['lo_RM' => 'Lorem', 'ip_SU-M' => 'Ipsum']; + $translator->setLocales($newLocales); + $this->assertEquals($newLocales, $translator->getLocales()); + + $this->assertTrue($translator->hasLocale('ip_SU-M')); + $this->assertFalse($translator->hasLocale('te_ST.ER-01')); + } + + /** + * @covers \Engelsystem\Helpers\Translation\Translator::replaceText + * @covers \Engelsystem\Helpers\Translation\Translator::translate + */ + public function testTranslate() + { + /** @var Translator|MockObject $translator */ + $translator = $this->getMockBuilder(Translator::class) + ->setConstructorArgs(['de_DE.UTF-8', ['de_DE.UTF-8' => 'Deutsch']]) + ->setMethods(['translateGettext']) + ->getMock(); + $translator->expects($this->exactly(2)) + ->method('translateGettext') + ->withConsecutive(['Hello!'], ['My favourite number is %u!']) + ->willReturnOnConsecutiveCalls('Hallo!', 'Meine Lieblingszahl ist die %u!'); + + $return = $translator->translate('Hello!'); + $this->assertEquals('Hallo!', $return); + + $return = $translator->translate('My favourite number is %u!', [3]); + $this->assertEquals('Meine Lieblingszahl ist die 3!', $return); + } + + /** + * @covers \Engelsystem\Helpers\Translation\Translator::translatePlural + */ + public function testTranslatePlural() + { + /** @var Translator|MockObject $translator */ + $translator = $this->getMockBuilder(Translator::class) + ->setConstructorArgs(['de_DE.UTF-8', ['de_DE.UTF-8' => 'Deutsch']]) + ->setMethods(['translateGettextPlural']) + ->getMock(); + $translator->expects($this->once()) + ->method('translateGettextPlural') + ->with('%s apple', '%s apples', 2) + ->willReturn('2 Äpfel'); + + $return = $translator->translatePlural('%s apple', '%s apples', 2, [2]); + $this->assertEquals('2 Äpfel', $return); + } +} diff --git a/tests/Unit/Helpers/TranslationServiceProviderTest.php b/tests/Unit/Helpers/TranslationServiceProviderTest.php deleted file mode 100644 index 41c08aa5..00000000 --- a/tests/Unit/Helpers/TranslationServiceProviderTest.php +++ /dev/null @@ -1,84 +0,0 @@ -getApp(['make', 'instance', 'get']); - /** @var Config|MockObject $config */ - $config = $this->createMock(Config::class); - /** @var Session|MockObject $session */ - $session = $this->createMock(Session::class); - /** @var Translator|MockObject $translator */ - $translator = $this->createMock(Translator::class); - - /** @var TranslationServiceProvider|MockObject $serviceProvider */ - $serviceProvider = $this->getMockBuilder(TranslationServiceProvider::class) - ->setConstructorArgs([$app]) - ->setMethods(['initGettext', 'setLocale']) - ->getMock(); - - $serviceProvider->expects($this->once()) - ->method('initGettext'); - - $app->expects($this->exactly(2)) - ->method('get') - ->withConsecutive(['config'], ['session']) - ->willReturnOnConsecutiveCalls($config, $session); - - $defaultLocale = 'fo_OO'; - $locale = 'te_ST.WTF-9'; - $locales = ['fo_OO' => 'Foo', 'fo_OO.BAR' => 'Foo (Bar)', 'te_ST.WTF-9' => 'WTF\'s Testing?']; - $config->expects($this->exactly(2)) - ->method('get') - ->withConsecutive( - ['locales'], - ['default_locale'] - ) - ->willReturnOnConsecutiveCalls( - $locales, - $defaultLocale - ); - - $session->expects($this->once()) - ->method('get') - ->with('locale', $defaultLocale) - ->willReturn($locale); - $session->expects($this->once()) - ->method('set') - ->with('locale', $locale); - - $app->expects($this->once()) - ->method('make') - ->with( - Translator::class, - [ - 'locale' => $locale, - 'locales' => $locales, - 'localeChangeCallback' => [$serviceProvider, 'setLocale'], - ] - ) - ->willReturn($translator); - - $app->expects($this->exactly(2)) - ->method('instance') - ->withConsecutive( - [Translator::class, $translator], - ['translator', $translator] - ); - - $serviceProvider->register(); - } -} diff --git a/tests/Unit/Helpers/TranslatorTest.php b/tests/Unit/Helpers/TranslatorTest.php deleted file mode 100644 index 45ca769b..00000000 --- a/tests/Unit/Helpers/TranslatorTest.php +++ /dev/null @@ -1,90 +0,0 @@ - 'Tests', 'fo_OO' => 'SomeFOO']; - $locale = 'te_ST.ER-01'; - - /** @var callable|MockObject $callable */ - $callable = $this->getMockBuilder(stdClass::class) - ->setMethods(['__invoke']) - ->getMock(); - $callable->expects($this->exactly(2)) - ->method('__invoke') - ->withConsecutive(['te_ST.ER-01'], ['fo_OO']); - - $translator = new Translator($locale, $locales, $callable); - - $this->assertEquals($locales, $translator->getLocales()); - $this->assertEquals($locale, $translator->getLocale()); - - $translator->setLocale('fo_OO'); - $this->assertEquals('fo_OO', $translator->getLocale()); - - $newLocales = ['lo_RM' => 'Lorem', 'ip_SU-M' => 'Ipsum']; - $translator->setLocales($newLocales); - $this->assertEquals($newLocales, $translator->getLocales()); - - $this->assertTrue($translator->hasLocale('ip_SU-M')); - $this->assertFalse($translator->hasLocale('te_ST.ER-01')); - } - - /** - * @covers \Engelsystem\Helpers\Translator::replaceText - * @covers \Engelsystem\Helpers\Translator::translate - */ - public function testTranslate() - { - /** @var Translator|MockObject $translator */ - $translator = $this->getMockBuilder(Translator::class) - ->setConstructorArgs(['de_DE.UTF-8', ['de_DE.UTF-8' => 'Deutsch']]) - ->setMethods(['translateGettext']) - ->getMock(); - $translator->expects($this->exactly(2)) - ->method('translateGettext') - ->withConsecutive(['Hello!'], ['My favourite number is %u!']) - ->willReturnOnConsecutiveCalls('Hallo!', 'Meine Lieblingszahl ist die %u!'); - - $return = $translator->translate('Hello!'); - $this->assertEquals('Hallo!', $return); - - $return = $translator->translate('My favourite number is %u!', [3]); - $this->assertEquals('Meine Lieblingszahl ist die 3!', $return); - } - - /** - * @covers \Engelsystem\Helpers\Translator::translatePlural - */ - public function testTranslatePlural() - { - /** @var Translator|MockObject $translator */ - $translator = $this->getMockBuilder(Translator::class) - ->setConstructorArgs(['de_DE.UTF-8', ['de_DE.UTF-8' => 'Deutsch']]) - ->setMethods(['translateGettextPlural']) - ->getMock(); - $translator->expects($this->once()) - ->method('translateGettextPlural') - ->with('%s apple', '%s apples', 2) - ->willReturn('2 Äpfel'); - - $return = $translator->translatePlural('%s apple', '%s apples', 2, [2]); - $this->assertEquals('2 Äpfel', $return); - } -} diff --git a/tests/Unit/HelpersTest.php b/tests/Unit/HelpersTest.php index ad677cb3..09362a90 100644 --- a/tests/Unit/HelpersTest.php +++ b/tests/Unit/HelpersTest.php @@ -6,7 +6,7 @@ use Engelsystem\Application; use Engelsystem\Config\Config; use Engelsystem\Container\Container; use Engelsystem\Helpers\Authenticator; -use Engelsystem\Helpers\Translator; +use Engelsystem\Helpers\Translation\Translator; use Engelsystem\Http\Request; use Engelsystem\Http\Response; use Engelsystem\Http\UrlGeneratorInterface; diff --git a/tests/Unit/Middleware/LegacyMiddlewareTest.php b/tests/Unit/Middleware/LegacyMiddlewareTest.php index f14a38ed..cce7371a 100644 --- a/tests/Unit/Middleware/LegacyMiddlewareTest.php +++ b/tests/Unit/Middleware/LegacyMiddlewareTest.php @@ -3,7 +3,7 @@ namespace Engelsystem\Test\Unit\Middleware; use Engelsystem\Helpers\Authenticator; -use Engelsystem\Helpers\Translator; +use Engelsystem\Helpers\Translation\Translator; use Engelsystem\Http\Request; use Engelsystem\Middleware\LegacyMiddleware; use PHPUnit\Framework\MockObject\MockObject; diff --git a/tests/Unit/Middleware/SetLocaleTest.php b/tests/Unit/Middleware/SetLocaleTest.php index dc68d83a..a586f6b7 100644 --- a/tests/Unit/Middleware/SetLocaleTest.php +++ b/tests/Unit/Middleware/SetLocaleTest.php @@ -2,7 +2,7 @@ namespace Engelsystem\Test\Unit\Middleware; -use Engelsystem\Helpers\Translator; +use Engelsystem\Helpers\Translation\Translator; use Engelsystem\Middleware\SetLocale; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; diff --git a/tests/Unit/Renderer/Twig/Extensions/TranslationTest.php b/tests/Unit/Renderer/Twig/Extensions/TranslationTest.php index 18705683..0b055c44 100644 --- a/tests/Unit/Renderer/Twig/Extensions/TranslationTest.php +++ b/tests/Unit/Renderer/Twig/Extensions/TranslationTest.php @@ -2,7 +2,7 @@ namespace Engelsystem\Test\Unit\Renderer\Twig\Extensions; -use Engelsystem\Helpers\Translator; +use Engelsystem\Helpers\Translation\Translator; use Engelsystem\Renderer\Twig\Extensions\Translation; use PHPUnit\Framework\MockObject\MockObject; use Twig_Extensions_TokenParser_Trans as TranslationTokenParser; -- cgit v1.2.3 From 508695efb253d7bc0caea1fa017ed5608d774596 Mon Sep 17 00:00:00 2001 From: Igor Scheller Date: Mon, 8 Jul 2019 01:47:01 +0200 Subject: Replaced gettext translation with package This allows to check if no translation is available --- README.md | 1 - composer.json | 2 +- config/config.default.php | 6 +- contrib/Dockerfile | 4 +- .../2019_06_12_000000_fix_user_languages.php | 34 + resources/lang/de_DE.UTF-8/LC_MESSAGES/default.mo | Bin 46271 -> 0 bytes resources/lang/de_DE.UTF-8/LC_MESSAGES/default.po | 2767 -------------------- resources/lang/de_DE/default.mo | Bin 0 -> 46271 bytes resources/lang/de_DE/default.po | 2767 ++++++++++++++++++++ resources/lang/en_US.UTF-8/LC_MESSAGES/default.mo | Bin 745 -> 0 bytes resources/lang/en_US.UTF-8/LC_MESSAGES/default.po | 26 - resources/lang/en_US/default.mo | Bin 0 -> 745 bytes resources/lang/en_US/default.po | 26 + resources/lang/pt_BR.UTF.8/LC_MESSAGES/default.mo | Bin 41129 -> 0 bytes resources/lang/pt_BR.UTF.8/LC_MESSAGES/default.po | 2645 ------------------- resources/lang/pt_BR/default.mo | Bin 0 -> 41129 bytes resources/lang/pt_BR/default.po | 2645 +++++++++++++++++++ src/Helpers/Translation/GettextTranslator.php | 53 + src/Helpers/Translation/TranslationNotFound.php | 9 + .../Translation/TranslationServiceProvider.php | 55 +- src/Helpers/Translation/Translator.php | 75 +- .../Helpers/Translation/Assets/fo_OO/default.mo | Bin 0 -> 73 bytes .../Helpers/Translation/Assets/fo_OO/default.po | 3 + .../Helpers/Translation/GettextTranslatorTest.php | 67 + .../Translation/TranslationServiceProviderTest.php | 54 +- tests/Unit/Helpers/Translation/TranslatorTest.php | 80 +- 26 files changed, 5783 insertions(+), 5536 deletions(-) create mode 100644 db/migrations/2019_06_12_000000_fix_user_languages.php delete mode 100644 resources/lang/de_DE.UTF-8/LC_MESSAGES/default.mo delete mode 100644 resources/lang/de_DE.UTF-8/LC_MESSAGES/default.po create mode 100644 resources/lang/de_DE/default.mo create mode 100644 resources/lang/de_DE/default.po delete mode 100644 resources/lang/en_US.UTF-8/LC_MESSAGES/default.mo delete mode 100644 resources/lang/en_US.UTF-8/LC_MESSAGES/default.po create mode 100644 resources/lang/en_US/default.mo create mode 100644 resources/lang/en_US/default.po delete mode 100644 resources/lang/pt_BR.UTF.8/LC_MESSAGES/default.mo delete mode 100644 resources/lang/pt_BR.UTF.8/LC_MESSAGES/default.po create mode 100644 resources/lang/pt_BR/default.mo create mode 100644 resources/lang/pt_BR/default.po create mode 100644 src/Helpers/Translation/GettextTranslator.php create mode 100644 src/Helpers/Translation/TranslationNotFound.php create mode 100644 tests/Unit/Helpers/Translation/Assets/fo_OO/default.mo create mode 100644 tests/Unit/Helpers/Translation/Assets/fo_OO/default.po create mode 100644 tests/Unit/Helpers/Translation/GettextTranslatorTest.php diff --git a/README.md b/README.md index db62c6e5..2e06be9f 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,6 @@ To report bugs use [engelsystem/issues](https://github.com/engelsystem/engelsyst * PHP >= 7.1 * Required modules: * dom - * gettext * json * mbstring * PDO diff --git a/composer.json b/composer.json index 3e50226a..b2b70789 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,6 @@ ], "require": { "php": ">=7.1.0", - "ext-gettext": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", @@ -24,6 +23,7 @@ "ext-xml": "*", "doctrine/dbal": "^2.9", "erusev/parsedown": "^1.7", + "gettext/gettext": "^4.6", "illuminate/container": "5.8.*", "illuminate/database": "5.8.*", "illuminate/support": "5.8.*", diff --git a/config/config.default.php b/config/config.default.php index 9c9505c6..3fad18bc 100644 --- a/config/config.default.php +++ b/config/config.default.php @@ -134,12 +134,12 @@ return [ // Available locales in /locale/ 'locales' => [ - 'de_DE.UTF-8' => 'Deutsch', - 'en_US.UTF-8' => 'English', + 'de_DE' => 'Deutsch', + 'en_US' => 'English', ], // The default locale to use - 'default_locale' => env('DEFAULT_LOCALE', 'en_US.UTF-8'), + 'default_locale' => env('DEFAULT_LOCALE', 'en_US'), // Available T-Shirt sizes, set value to null if not available 'tshirt_sizes' => [ diff --git a/contrib/Dockerfile b/contrib/Dockerfile index dd3bd308..b6e2cb95 100644 --- a/contrib/Dockerfile +++ b/contrib/Dockerfile @@ -35,8 +35,8 @@ RUN rm -f /app/import/* /app/config/config.php # Build the PHP container FROM php:7-fpm-alpine WORKDIR /var/www -RUN apk add --no-cache icu-dev gettext-dev && \ - docker-php-ext-install intl gettext pdo_mysql +RUN apk add --no-cache icu-dev && \ + docker-php-ext-install intl pdo_mysql COPY --from=data /app/ /var/www RUN chown -R www-data:www-data /var/www/import/ /var/www/storage/ && \ rm -r /var/www/html diff --git a/db/migrations/2019_06_12_000000_fix_user_languages.php b/db/migrations/2019_06_12_000000_fix_user_languages.php new file mode 100644 index 00000000..c7d1474c --- /dev/null +++ b/db/migrations/2019_06_12_000000_fix_user_languages.php @@ -0,0 +1,34 @@ +schema->getConnection(); + $connection + ->table('users_settings') + ->update([ + 'language' => $connection->raw('REPLACE(language, ".UTF-8", "")') + ]); + } + + /** + * Reverse the migration + */ + public function down() + { + $connection = $this->schema->getConnection(); + $connection + ->table('users_settings') + ->update([ + 'language' => $connection->raw('CONCAT(language, ".UTF-8")') + ]); + } +} diff --git a/resources/lang/de_DE.UTF-8/LC_MESSAGES/default.mo b/resources/lang/de_DE.UTF-8/LC_MESSAGES/default.mo deleted file mode 100644 index 35ad80b7..00000000 Binary files a/resources/lang/de_DE.UTF-8/LC_MESSAGES/default.mo and /dev/null differ diff --git a/resources/lang/de_DE.UTF-8/LC_MESSAGES/default.po b/resources/lang/de_DE.UTF-8/LC_MESSAGES/default.po deleted file mode 100644 index 27ceb586..00000000 --- a/resources/lang/de_DE.UTF-8/LC_MESSAGES/default.po +++ /dev/null @@ -1,2767 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: Engelsystem\n" -"POT-Creation-Date: 2019-04-28 15:23+0200\n" -"PO-Revision-Date: 2019-06-12 16:07+0200\n" -"Last-Translator: msquare \n" -"Language-Team: \n" -"Language: de_DE\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.11\n" -"X-Poedit-KeywordsList: __;_e;translate;translatePlural;gettext;gettext_noop\n" -"X-Poedit-Basepath: ../../../..\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Poedit-SourceCharset: UTF-8\n" -"X-Poedit-SearchPath-0: resources/views\n" -"X-Poedit-SearchPath-1: src\n" -"X-Poedit-SearchPath-2: includes\n" - -#: includes/controller/angeltypes_controller.php:13 -#: includes/pages/user_shifts.php:251 includes/sys_menu.php:89 -#: includes/view/AngelTypes_view.php:76 includes/view/AngelTypes_view.php:134 -#: includes/view/User_view.php:832 -msgid "Angeltypes" -msgstr "Engeltypen" - -#: includes/controller/angeltypes_controller.php:69 -#: includes/pages/guest_login.php:472 includes/view/AngelTypes_view.php:496 -#: includes/view/AngelTypes_view.php:593 includes/view/User_view.php:139 -msgid "Teams/Job description" -msgstr "Team-/Aufgabenbeschreibung" - -#: includes/controller/angeltypes_controller.php:89 -#, php-format -msgid "Angeltype %s deleted." -msgstr "Engeltyp %s gelöscht." - -#: includes/controller/angeltypes_controller.php:94 -#: includes/view/AngelTypes_view.php:54 -#, php-format -msgid "Delete angeltype %s" -msgstr "Lösche Engeltyp %s" - -#: includes/controller/angeltypes_controller.php:135 -msgid "Please check the name. Maybe it already exists." -msgstr "Bitte überprüfe den Namen. Vielleicht ist er bereits vergeben." - -#: includes/controller/angeltypes_controller.php:165 -#: includes/view/AngelTypes_view.php:74 -#, php-format -msgid "Edit %s" -msgstr "%s bearbeiten" - -#: includes/controller/angeltypes_controller.php:203 -#: includes/view/AngelTypes_view.php:341 -#, php-format -msgid "Team %s" -msgstr "Team %s" - -#: includes/controller/angeltypes_controller.php:286 -#: includes/view/User_view.php:413 -msgid "view" -msgstr "ansehen" - -#: includes/controller/angeltypes_controller.php:294 -#: includes/pages/admin_free.php:97 includes/pages/admin_groups.php:44 -#: includes/pages/admin_rooms.php:27 includes/view/AngelTypes_view.php:170 -#: includes/view/ShiftTypes_view.php:91 includes/view/ShiftTypes_view.php:123 -#: includes/view/Shifts_view.php:135 includes/view/User_view.php:418 -#: includes/view/User_view.php:516 includes/view/User_view.php:611 -msgid "edit" -msgstr "bearbeiten" - -#: includes/controller/angeltypes_controller.php:299 -#: includes/controller/shifts_controller.php:243 -#: includes/pages/admin_questions.php:60 includes/pages/admin_questions.php:76 -#: includes/pages/admin_rooms.php:32 includes/pages/admin_user.php:179 -#: includes/view/AngelTypes_view.php:59 includes/view/AngelTypes_view.php:177 -#: includes/view/Questions_view.php:13 includes/view/Questions_view.php:22 -#: includes/view/ShiftEntry_view.php:28 includes/view/ShiftEntry_view.php:57 -#: includes/view/ShiftTypes_view.php:28 includes/view/ShiftTypes_view.php:96 -#: includes/view/ShiftTypes_view.php:128 includes/view/Shifts_view.php:136 -#: includes/view/UserWorkLog_view.php:21 includes/view/User_view.php:521 -msgid "delete" -msgstr "löschen" - -#: includes/controller/angeltypes_controller.php:310 -#: includes/view/AngelTypes_view.php:163 includes/view/AngelTypes_view.php:532 -msgid "leave" -msgstr "verlassen" - -# As already mentioned in Issue #312 : I'd suggest "join angel" and the German translation "Engel hinzufügen" for this button. -#: includes/controller/angeltypes_controller.php:316 -#: includes/view/AngelTypes_view.php:147 includes/view/AngelTypes_view.php:537 -msgid "join" -msgstr "mitmachen" - -#: includes/controller/angeltypes_controller.php:353 -msgid "Angeltype doesn't exist . " -msgstr "Engeltyp existiert nicht." - -#: includes/controller/event_config_controller.php:11 includes/sys_menu.php:114 -msgid "Event config" -msgstr "Event Einstellungen" - -#: includes/controller/event_config_controller.php:53 -msgid "Please enter buildup start date." -msgstr "Bitte gib das Aufbau Start Datum an." - -#: includes/controller/event_config_controller.php:57 -msgid "Please enter event start date." -msgstr "Bitte gib das Event Start Datum an." - -#: includes/controller/event_config_controller.php:61 -msgid "Please enter event end date." -msgstr "Bitte gib das Event Ende Datum an." - -#: includes/controller/event_config_controller.php:65 -msgid "Please enter teardown end date." -msgstr "Bitte gib das Abbau Ende Datum an." - -#: includes/controller/event_config_controller.php:71 -msgid "The buildup start date has to be before the event start date." -msgstr "Das Aufbau Start Datum muss vor dem Event Start Datum liegen." - -#: includes/controller/event_config_controller.php:76 -msgid "The event start date has to be before the event end date." -msgstr "Das Event Start Datum muss vor dem Event End Datum liegen." - -#: includes/controller/event_config_controller.php:81 -msgid "The event end date has to be before the teardown end date." -msgstr "Das Event Ende Datum muss vor dem Abbau Ende Datum liegen." - -#: includes/controller/event_config_controller.php:86 -msgid "The buildup start date has to be before the teardown end date." -msgstr "Das Aufbau Start Datum muss vor dem Abbau Ende Datum liegen." - -#: includes/controller/event_config_controller.php:120 -#: includes/pages/user_settings.php:89 -msgid "Settings saved." -msgstr "Einstellungen gespeichert." - -#: includes/controller/public_dashboard_controller.php:27 -#: includes/pages/user_shifts.php:278 includes/view/PublicDashboard_view.php:55 -msgid "Public Dashboard" -msgstr "Öffentliches Dashboard" - -#: includes/controller/shift_entries_controller.php:109 -#: includes/controller/shift_entries_controller.php:181 -#, php-format -msgid "%s has been subscribed to the shift." -msgstr "%s wurde in die Schicht eingetragen." - -#: includes/controller/shift_entries_controller.php:149 -msgid "User is not in angeltype." -msgstr "User ist nicht im Engeltyp." - -#: includes/controller/shift_entries_controller.php:166 -#: includes/controller/shift_entries_controller.php:210 -msgid "This shift is already occupied." -msgstr "Die Schicht ist schon voll." - -#: includes/controller/shift_entries_controller.php:206 -msgid "You need be accepted member of the angeltype." -msgstr "Du musst bestätigtes Mitglied des Engeltyps sein." - -#: includes/controller/shift_entries_controller.php:208 -#: includes/view/Shifts_view.php:125 -msgid "This shift collides with one of your shifts." -msgstr "Diese Schicht kollidiert mit deinen Schichten." - -#: includes/controller/shift_entries_controller.php:212 -msgid "This shift ended already." -msgstr "Die Schicht ist schon vorbei." - -#: includes/controller/shift_entries_controller.php:214 -msgid "You are not marked as arrived." -msgstr "Du bist nicht als angekommen markiert." - -msgid "You are not allowed to sign up yet." -msgstr "Du darfst dich noch nicht anmelden." - -#: includes/controller/shift_entries_controller.php:216 -#: includes/view/Shifts_view.php:129 -msgid "You are signed up for this shift." -msgstr "Du bist für diese Schicht eingetragen." - -#: includes/controller/shift_entries_controller.php:265 -msgid "You are subscribed. Thank you!" -msgstr "Du bist eingetragen. Danke!" - -#: includes/controller/shift_entries_controller.php:324 -msgid "Shift entry not found." -msgstr "Schichteintrag nicht gefunden." - -#: includes/controller/shift_entries_controller.php:346 -msgid "" -"You are not allowed to remove this shift entry. If necessary, ask your " -"supporter or heaven to do so." -msgstr "" -"Du darfst diesen Schichteintrag nicht entfernen. Falls notwendig, frage " -"deinen Supporter oder im Himmel danach." - -#: includes/controller/shift_entries_controller.php:352 -msgid "Shift entry removed." -msgstr "Schichteintrag gelöscht." - -#: includes/controller/shifts_controller.php:95 -msgid "Please select a room." -msgstr "Bitte einen Raum auswählen." - -#: includes/controller/shifts_controller.php:102 -msgid "Please select a shifttype." -msgstr "Bitte einen Schichttyp wählen." - -#: includes/controller/shifts_controller.php:109 -msgid "Please enter a valid starting time for the shifts." -msgstr "Bitte gib eine korrekte Startzeit für die Schichten ein." - -#: includes/controller/shifts_controller.php:116 -msgid "Please enter a valid ending time for the shifts." -msgstr "Bitte gib eine korrekte Endzeit für die Schichten ein." - -#: includes/controller/shifts_controller.php:121 -msgid "The ending time has to be after the starting time." -msgstr "Die Endzeit muss nach der Startzeit liegen." - -#: includes/controller/shifts_controller.php:134 -#, php-format -msgid "Please check your input for needed angels of type %s." -msgstr "Bitte prüfe deine Eingabe für benötigte Engel des Typs %s." - -#: includes/controller/shifts_controller.php:164 -msgid "Shift updated." -msgstr "Schicht aktualisiert." - -#: includes/controller/shifts_controller.php:183 -msgid "This page is much more comfortable with javascript." -msgstr "Diese Seite ist mit JavaScript viel komfortabler." - -#: includes/controller/shifts_controller.php:186 -#: includes/pages/admin_import.php:123 includes/pages/admin_shifts.php:403 -msgid "Shifttype" -msgstr "Schichttyp" - -#: includes/controller/shifts_controller.php:187 -#: includes/pages/admin_import.php:197 includes/pages/admin_import.php:206 -#: includes/pages/admin_import.php:215 includes/pages/admin_shifts.php:404 -#: includes/view/Shifts_view.php:17 -msgid "Title" -msgstr "Titel" - -#: includes/controller/shifts_controller.php:188 -msgid "Room:" -msgstr "Raum:" - -#: includes/controller/shifts_controller.php:189 -msgid "Start:" -msgstr "Start:" - -#: includes/controller/shifts_controller.php:190 -msgid "End:" -msgstr "Ende:" - -#: includes/controller/shifts_controller.php:191 -#: includes/pages/admin_shifts.php:325 includes/pages/admin_shifts.php:435 -#: includes/view/Shifts_view.php:147 -msgid "Needed angels" -msgstr "Benötigte Engel" - -#: includes/controller/shifts_controller.php:193 -#: includes/pages/admin_groups.php:101 includes/pages/admin_news.php:50 -#: includes/pages/admin_questions.php:57 includes/pages/admin_rooms.php:177 -#: includes/pages/admin_shifts.php:327 includes/pages/user_messages.php:78 -#: includes/pages/user_news.php:184 includes/pages/user_news.php:274 -#: includes/view/AngelTypes_view.php:115 includes/view/EventConfig_view.php:110 -#: includes/view/Questions_view.php:43 includes/view/ShiftEntry_view.php:93 -#: includes/view/ShiftEntry_view.php:118 includes/view/ShiftEntry_view.php:141 -#: includes/view/ShiftEntry_view.php:200 includes/view/ShiftTypes_view.php:64 -#: includes/view/UserDriverLicenses_view.php:54 -#: includes/view/UserWorkLog_view.php:49 includes/view/User_view.php:80 -#: includes/view/User_view.php:89 includes/view/User_view.php:94 -#: includes/view/User_view.php:99 includes/view/User_view.php:190 -#: includes/view/User_view.php:810 -msgid "Save" -msgstr "Speichern" - -#: includes/controller/shifts_controller.php:230 -msgid "Shift deleted." -msgstr "Schicht gelöscht." - -#: includes/controller/shifts_controller.php:236 -#, php-format -msgid "Do you want to delete the shift %s from %s to %s?" -msgstr "Möchtest Du die Schicht %s von %s bis %s löschen?" - -#: includes/controller/shifts_controller.php:266 -msgid "Shift could not be found." -msgstr "Schicht konnte nicht gefunden werden." - -#: includes/controller/shifttypes_controller.php:33 -#, php-format -msgid "Shifttype %s deleted." -msgstr "Schichttyp %s gelöscht." - -#: includes/controller/shifttypes_controller.php:38 -#: includes/view/ShiftTypes_view.php:21 -#, php-format -msgid "Delete shifttype %s" -msgstr "Lösche Schichttyp %s" - -#: includes/controller/shifttypes_controller.php:61 -msgid "Shifttype not found." -msgstr "Schichttyp nicht gefunden." - -#: includes/controller/shifttypes_controller.php:77 -#: includes/pages/admin_rooms.php:88 -msgid "Please enter a name." -msgstr "Gib bitte einen Namen an." - -#: includes/controller/shifttypes_controller.php:95 -msgid "Updated shifttype." -msgstr "Schichttyp geändert." - -#: includes/controller/shifttypes_controller.php:100 -msgid "Created shifttype." -msgstr "Schichttyp erstellt." - -#: includes/controller/shifttypes_controller.php:159 includes/sys_menu.php:108 -msgid "Shifttypes" -msgstr "Schichttypen" - -#: includes/controller/user_angeltypes_controller.php:26 -#, php-format -msgid "There is %d unconfirmed angeltype." -msgid_plural "There are %d unconfirmed angeltypes." -msgstr[0] "Es gibt %d nicht freigeschalteten Engeltypen!" -msgstr[1] "Es gibt %d nicht freigeschaltete Engeltypen!" - -#: includes/controller/user_angeltypes_controller.php:33 -msgid "Angel types which need approvals:" -msgstr "Engeltypen die bestätigt werden müssen:" - -#: includes/controller/user_angeltypes_controller.php:47 -#: includes/controller/user_angeltypes_controller.php:53 -#: includes/controller/user_angeltypes_controller.php:87 -#: includes/controller/user_angeltypes_controller.php:93 -#: includes/controller/user_angeltypes_controller.php:139 -#: includes/controller/user_angeltypes_controller.php:199 -#: includes/controller/user_angeltypes_controller.php:265 -msgid "Angeltype doesn't exist." -msgstr "Engeltyp existiert nicht." - -#: includes/controller/user_angeltypes_controller.php:58 -msgid "You are not allowed to delete all users for this angeltype." -msgstr "Du darfst nicht alle Benutzer von diesem Engeltyp entfernen." - -#: includes/controller/user_angeltypes_controller.php:66 -#, php-format -msgid "Denied all users for angeltype %s." -msgstr "Alle Benutzer mit Engeltyp %s abgelehnt." - -#: includes/controller/user_angeltypes_controller.php:71 -#: includes/view/UserAngelTypes_view.php:45 -msgid "Deny all users" -msgstr "Alle Benutzer ablehnen" - -#: includes/controller/user_angeltypes_controller.php:98 -msgid "You are not allowed to confirm all users for this angeltype." -msgstr "Du darfst nicht alle Benutzer für diesen Engeltyp freischalten." - -#: includes/controller/user_angeltypes_controller.php:106 -#, php-format -msgid "Confirmed all users for angeltype %s." -msgstr "Alle Benutzer für Engeltyp %s freigeschaltet." - -#: includes/controller/user_angeltypes_controller.php:111 -#: includes/view/UserAngelTypes_view.php:69 -msgid "Confirm all users" -msgstr "Alle Benutzer bestätigen" - -#: includes/controller/user_angeltypes_controller.php:127 -#: includes/controller/user_angeltypes_controller.php:133 -#: includes/controller/user_angeltypes_controller.php:187 -#: includes/controller/user_angeltypes_controller.php:193 -#: includes/controller/user_angeltypes_controller.php:246 -#: includes/controller/user_angeltypes_controller.php:259 -msgid "User angeltype doesn't exist." -msgstr "Benutzer-Engeltype existiert nicht." - -#: includes/controller/user_angeltypes_controller.php:144 -msgid "You are not allowed to confirm this users angeltype." -msgstr "Du darfst diesen Benutzer nicht für diesen Engeltyp freischalten." - -#: includes/controller/user_angeltypes_controller.php:150 -#: includes/controller/user_angeltypes_controller.php:205 -#: includes/controller/user_angeltypes_controller.php:271 -#: includes/controller/users_controller.php:441 -msgid "User doesn't exist." -msgstr "Benutzer existiert nicht." - -#: includes/controller/user_angeltypes_controller.php:163 -#, php-format -msgid "%s confirmed for angeltype %s." -msgstr "%s für Engeltyp %s freigeschaltet." - -#: includes/controller/user_angeltypes_controller.php:171 -#: includes/view/UserAngelTypes_view.php:89 -msgid "Confirm angeltype for user" -msgstr "Engeltyp für Benutzer bestätigen" - -#: includes/controller/user_angeltypes_controller.php:210 -msgid "You are not allowed to delete this users angeltype." -msgstr "Du darfst diesen Benutzer nicht von diesem Engeltyp entfernen." - -#: includes/controller/user_angeltypes_controller.php:217 -#, php-format -msgid "User %s removed from %s." -msgstr "Benutzer %s von %s entfernt." - -#: includes/controller/user_angeltypes_controller.php:225 -#: includes/view/UserAngelTypes_view.php:113 -msgid "Remove angeltype" -msgstr "Engeltyp löschen" - -#: includes/controller/user_angeltypes_controller.php:241 -msgid "You are not allowed to set supporter rights." -msgstr "Du darfst keine Supporterrechte bearbeiten." - -#: includes/controller/user_angeltypes_controller.php:253 -msgid "No supporter update given." -msgstr "Kein Update für Supporterrechte gegeben." - -#: includes/controller/user_angeltypes_controller.php:280 -#, php-format -msgid "Added supporter rights for %s to %s." -msgstr "%s hat %s als Supporter bekommen." - -#: includes/controller/user_angeltypes_controller.php:281 -#, php-format -msgid "Removed supporter rights for %s from %s." -msgstr "%s hat jetzt nicht mehr %s als Supporter." - -#: includes/controller/user_angeltypes_controller.php:292 -#: includes/view/AngelTypes_view.php:258 -#: includes/view/UserAngelTypes_view.php:14 -msgid "Add supporter rights" -msgstr "Supporterrechte geben" - -#: includes/controller/user_angeltypes_controller.php:292 -#: includes/view/AngelTypes_view.php:241 -#: includes/view/UserAngelTypes_view.php:14 -msgid "Remove supporter rights" -msgstr "Supporterrechte entfernen" - -#: includes/controller/user_angeltypes_controller.php:331 -#, php-format -msgid "User %s added to %s." -msgstr "Benutzer %s zu %s hinzugefügt." - -#: includes/controller/user_angeltypes_controller.php:348 -#: includes/view/UserAngelTypes_view.php:142 -msgid "Add user to angeltype" -msgstr "Benutzer zu Engeltyp hinzufügen" - -#: includes/controller/user_angeltypes_controller.php:365 -#, php-format -msgid "You are already a %s." -msgstr "Du bist bereits %s." - -#: includes/controller/user_angeltypes_controller.php:372 -#, php-format -msgid "You joined %s." -msgstr "Du bist %s beigetreten." - -#: includes/controller/user_angeltypes_controller.php:393 -#: includes/view/UserAngelTypes_view.php:166 -#, php-format -msgid "Become a %s" -msgstr "Werde ein %s" - -#: includes/controller/user_driver_licenses_controller.php:26 -#, php-format -msgid "" -"You joined an angeltype which requires a driving license. Please edit your " -"driving license information here: %s." -msgstr "" -"Du bist einem Engeltypen beigetreten, der Führerschein-Infos benötigt. Bitte " -"trage Deine Führerschein-Infos hier ein: %s." - -#: includes/controller/user_driver_licenses_controller.php:27 -msgid "driving license information" -msgstr "Führerschein-Infos" - -#: includes/controller/user_driver_licenses_controller.php:133 -msgid "Your driver license information has been saved." -msgstr "Deine Führerschein-Infos wurden gespeichert." - -#: includes/controller/user_driver_licenses_controller.php:136 -msgid "Please select at least one driving license." -msgstr "Bitte wähle mindestens einen Führerschein-Typen aus." - -#: includes/controller/user_driver_licenses_controller.php:141 -msgid "Your driver license information has been removed." -msgstr "Deine Führerschein-Infos wurden gelöscht." - -#: includes/controller/user_driver_licenses_controller.php:147 -#: includes/view/UserDriverLicenses_view.php:15 -#, php-format -msgid "Edit %s driving license information" -msgstr "Bearbeite die Führerschein-Infos von %s" - -#: includes/controller/user_worklog_controller.php:22 -msgid "Work log entry deleted." -msgstr "Arbeitseinsatz gelöscht." - -#: includes/controller/user_worklog_controller.php:52 -msgid "Work log entry updated." -msgstr "Arbeitseinsatz geändert." - -#: includes/controller/user_worklog_controller.php:81 -msgid "Please enter work date." -msgstr "Bitte Einsatzdatum angeben." - -#: includes/controller/user_worklog_controller.php:87 -msgid "Please enter work hours in format ##[.##]." -msgstr "Bitte Stunden im Format ##[.##| eingeben." - -#: includes/controller/user_worklog_controller.php:93 -msgid "Please enter a comment." -msgstr "Bitte Kommentar angeben." - -#: includes/controller/user_worklog_controller.php:123 -msgid "Work log entry created." -msgstr "Arbeitseinsatz angelegt." - -#: includes/controller/users_controller.php:64 -msgid "You cannot delete yourself." -msgstr "Du kannst Dich nicht selber löschen." - -#: includes/controller/users_controller.php:78 -#: includes/pages/guest_login.php:410 -msgid "Your password is incorrect. Please try it again." -msgstr "Dein Passwort stimmt nicht. Bitte probiere es nochmal." - -#: includes/controller/users_controller.php:87 -msgid "User deleted." -msgstr "Engel gelöscht." - -#: includes/controller/users_controller.php:95 includes/view/User_view.php:154 -#, php-format -msgid "Delete %s" -msgstr "%s löschen" - -#: includes/controller/users_controller.php:165 -msgid "Please enter a valid number of vouchers." -msgstr "Bitte gib eine korrekte Anzahl von Gutscheinen ein." - -#: includes/controller/users_controller.php:172 -msgid "Saved the number of vouchers." -msgstr "Anzahl der Gutscheine gespeichert." - -#: includes/controller/users_controller.php:181 includes/view/User_view.php:178 -#, php-format -msgid "%s's vouchers" -msgstr "Gutschein von %s" - -#: includes/controller/users_controller.php:198 -msgid "User not found." -msgstr "Benutzer nicht gefunden." - -#: includes/controller/users_controller.php:233 -msgid "Enough" -msgstr "Genug" - -#: includes/controller/users_controller.php:299 includes/view/User_view.php:249 -msgid "All users" -msgstr "Alle Benutzer" - -#: includes/controller/users_controller.php:323 -msgid "Token is not correct." -msgstr "Der Token ist nicht in Ordnung." - -#: includes/controller/users_controller.php:336 -#: includes/pages/guest_login.php:138 includes/pages/user_settings.php:112 -msgid "Your passwords don't match." -msgstr "Deine Passwörter stimmen nicht überein." - -#: includes/controller/users_controller.php:340 -#: includes/pages/user_settings.php:110 -msgid "Your password is to short (please use at least 6 characters)." -msgstr "Dein Passwort ist zu kurz (Bitte mindestens 6 Zeichen nutzen)." - -#: includes/controller/users_controller.php:345 -#: includes/pages/user_settings.php:115 -msgid "Password saved." -msgstr "Passwort gespeichert." - -#: includes/controller/users_controller.php:373 -#: includes/controller/users_controller.php:377 -#: includes/pages/guest_login.php:107 includes/pages/user_settings.php:32 -msgid "E-mail address is not correct." -msgstr "Die E-Mail Adresse ist nicht in Ordnung." - -#: includes/controller/users_controller.php:381 -#: includes/pages/guest_login.php:115 includes/pages/user_settings.php:36 -msgid "Please enter your e-mail." -msgstr "Bitte gib Deine E-Mail-Adresse ein." - -#: includes/controller/users_controller.php:388 -#: includes/controller/users_controller.php:424 -msgid "Password recovery" -msgstr "Passwort wiederherstellen" - -#: includes/controller/users_controller.php:390 -#, php-format -msgid "Please visit %s to recover your password." -msgstr "Bitte besuche %s, um Dein Passwort zurückzusetzen" - -#: includes/controller/users_controller.php:394 -msgid "We sent an email containing your password recovery link." -msgstr "" -"Wir haben eine eMail mit einem Link zum Passwort-zurücksetzen geschickt." - -#: includes/helper/email_helper.php:41 -#, php-format -msgid "User %s could not be notified by email due to an error." -msgstr "" -"Aufgrund eines Fehlers konnte dem User %s keine E-Mail gesendet werden." - -#: includes/mailer/shifts_mailer.php:17 -msgid "A Shift you are registered on has changed:" -msgstr "Eine deiner Schichten hat sich geändert:" - -#: includes/mailer/shifts_mailer.php:21 -#, php-format -msgid "* Shift type changed from %s to %s" -msgstr "* Schichttyp von %s in %s geändert" - -#: includes/mailer/shifts_mailer.php:26 -#, php-format -msgid "* Shift title changed from %s to %s" -msgstr "* Schicht Titel von %s nach %s geändert" - -#: includes/mailer/shifts_mailer.php:32 -#, php-format -msgid "* Shift Start changed from %s to %s" -msgstr "* Schicht Beginn von %s nach %s geändert" - -#: includes/mailer/shifts_mailer.php:41 -#, php-format -msgid "* Shift End changed from %s to %s" -msgstr "* Schicht Ende von %s nach %s geändert" - -#: includes/mailer/shifts_mailer.php:49 -#, php-format -msgid "* Shift Location changed from %s to %s" -msgstr "* Schicht Ort von %s to %s geändert" - -#: includes/mailer/shifts_mailer.php:59 -msgid "The updated Shift:" -msgstr "Die aktualisierte Schicht:" - -#: includes/mailer/shifts_mailer.php:71 -msgid "Your Shift has changed" -msgstr "Deine Schicht hat sich geändert" - -#: includes/mailer/shifts_mailer.php:87 -msgid "A Shift you are registered on was deleted:" -msgstr "Eine deiner Schichten wurde gelöscht:" - -#: includes/mailer/shifts_mailer.php:97 -msgid "Your Shift was deleted" -msgstr "Deine Schicht wurde gelöscht" - -#: includes/mailer/shifts_mailer.php:114 -msgid "You have been assigned to a Shift:" -msgstr "Du wurdest in eine Schicht eingetragen:" - -#: includes/mailer/shifts_mailer.php:120 -msgid "Assigned to Shift" -msgstr "In Schicht eingetragen" - -#: includes/mailer/shifts_mailer.php:135 -msgid "You have been removed from a Shift:" -msgstr "Du wurdest aus einer Schicht ausgetragen:" - -#: includes/mailer/shifts_mailer.php:141 -msgid "Removed from Shift" -msgstr "Von Schicht ausgetragen" - -#: includes/mailer/users_mailer.php:13 -msgid "Your account has been deleted" -msgstr "Dein Konto wurde gelöscht." - -#: includes/mailer/users_mailer.php:15 -#, php-format -msgid "" -"Your %s account has been deleted. If you have any questions regarding your " -"account deletion, please contact heaven." -msgstr "" -"Dein %s-Konto wurde gelöscht. Wenn Du dazu Fragen hast, kontaktiere bitte " -"den Himmel." - -#: includes/pages/admin_active.php:13 includes/sys_menu.php:104 -msgid "Active angels" -msgstr "Aktive Engel" - -#: includes/pages/admin_active.php:42 -#, php-format -msgid "" -"At least %s angels are forced to be active. The number has to be greater." -msgstr "" -"Mindestens %s Engel werden als aktiv gekennzeichnet. Die Nummer muss größer " -"sein." - -#: includes/pages/admin_active.php:48 -msgid "Please enter a number of angels to be marked as active." -msgstr "" -"Bitte gib eine Anzahl an Engeln ein, die als Aktiv markiert werden sollen." - -#: includes/pages/admin_active.php:95 -msgid "Marked angels." -msgstr "Engel wurden markiert." - -#: includes/pages/admin_active.php:98 includes/pages/admin_rooms.php:155 -#: includes/pages/admin_rooms.php:191 includes/pages/admin_shifts.php:321 -#: includes/view/UserAngelTypes_view.php:147 -#: includes/view/UserWorkLog_view.php:64 includes/view/UserWorkLog_view.php:82 -#: includes/view/User_view.php:157 includes/view/User_view.php:181 -msgid "back" -msgstr "zurück" - -#: includes/pages/admin_active.php:99 -msgid "apply" -msgstr "anwenden" - -#: includes/pages/admin_active.php:112 -msgid "Angel has been marked as active." -msgstr "Engel wurde als aktiv markiert." - -#: includes/pages/admin_active.php:114 includes/pages/admin_active.php:125 -#: includes/pages/admin_active.php:147 includes/pages/admin_arrive.php:44 -#: includes/pages/admin_arrive.php:62 -msgid "Angel not found." -msgstr "Engel nicht gefunden." - -#: includes/pages/admin_active.php:123 -msgid "Angel has been marked as not active." -msgstr "Engel wurde als nicht aktiv markiert." - -#: includes/pages/admin_active.php:134 -msgid "Angel has got a t-shirt." -msgstr "Engel hat ein T-Shirt bekommen." - -#: includes/pages/admin_active.php:145 -msgid "Angel has got no t-shirt." -msgstr "Engel hat kein T-Shirt bekommen." - -#: includes/pages/admin_active.php:235 -msgid "set active" -msgstr "setze aktiv" - -#: includes/pages/admin_active.php:248 -msgid "remove active" -msgstr "entferne aktiv" - -#: includes/pages/admin_active.php:261 -msgid "got t-shirt" -msgstr "hat t-shirt" - -#: includes/pages/admin_active.php:274 -msgid "remove t-shirt" -msgstr "entferne t-shirt" - -#: includes/pages/admin_active.php:299 includes/pages/admin_arrive.php:202 -#: includes/pages/admin_arrive.php:217 includes/pages/admin_arrive.php:232 -#: includes/view/AngelTypes_view.php:419 includes/view/AngelTypes_view.php:427 -#: includes/view/User_view.php:239 -msgid "Sum" -msgstr "Summe" - -#: includes/pages/admin_active.php:305 -msgid "Search angel:" -msgstr "Suche Engel:" - -#: includes/pages/admin_active.php:306 -msgid "Show all shifts" -msgstr "Alle Schichten anzeigen" - -#: includes/pages/admin_active.php:307 includes/pages/admin_arrive.php:178 -#: includes/pages/admin_arrive.php:179 includes/pages/admin_free.php:105 -#: includes/pages/admin_free.php:107 includes/pages/admin_log.php:35 -#: includes/pages/admin_log.php:36 -msgid "Search" -msgstr "Suche" - -#: includes/pages/admin_active.php:310 -msgid "How much angels should be active?" -msgstr "Wie viele Engel sollten aktiv sein?" - -#: includes/pages/admin_active.php:311 includes/pages/admin_shifts.php:309 -#: includes/pages/admin_shifts.php:453 -msgid "Preview" -msgstr "Vorschau" - -#: includes/pages/admin_active.php:315 includes/pages/admin_arrive.php:182 -msgid "Nickname" -msgstr "Nick" - -#: includes/pages/admin_active.php:316 includes/pages/admin_active.php:326 -#: includes/view/User_view.php:265 -msgid "Size" -msgstr "Größe" - -#: includes/pages/admin_active.php:317 includes/pages/user_shifts.php:11 -#: includes/sys_menu.php:88 includes/view/AngelTypes_view.php:352 -#: includes/view/Rooms_view.php:39 includes/view/User_view.php:659 -msgid "Shifts" -msgstr "Schichten" - -#: includes/pages/admin_active.php:318 includes/pages/admin_shifts.php:415 -msgid "Length" -msgstr "Länge" - -#: includes/pages/admin_active.php:319 -msgid "Active?" -msgstr "Aktiv?" - -#: includes/pages/admin_active.php:320 includes/view/User_view.php:263 -msgid "Forced" -msgstr "Gezwungen" - -#: includes/pages/admin_active.php:321 -msgid "T-shirt?" -msgstr "T-Shirt?" - -#: includes/pages/admin_active.php:324 -msgid "Shirt statistics" -msgstr "T-Shirt Statistik" - -#: includes/pages/admin_active.php:327 -msgid "Needed shirts" -msgstr "Benötigte T-Shirts" - -#: includes/pages/admin_active.php:298 -msgid "Given shirts" -msgstr "Ausgegebene T-Shirts" - -#: includes/pages/admin_arrive.php:10 includes/sys_menu.php:103 -msgid "Arrived angels" -msgstr "Angekommene Engel" - -#: includes/pages/admin_arrive.php:41 -msgid "Reset done. Angel has not arrived." -msgstr "Zurückgesetzt. Engel ist nicht angekommen." - -#: includes/pages/admin_arrive.php:59 -msgid "Angel has been marked as arrived." -msgstr "Engel wurde als angekommen markiert." - -#: includes/pages/admin_arrive.php:101 includes/view/UserAngelTypes_view.php:29 -#: includes/view/UserAngelTypes_view.php:57 -#: includes/view/UserAngelTypes_view.php:75 -#: includes/view/UserAngelTypes_view.php:99 -#: includes/view/UserAngelTypes_view.php:123 -msgid "yes" -msgstr "Ja" - -#: includes/pages/admin_arrive.php:106 -msgid "reset" -msgstr "zurücksetzen" - -#: includes/pages/admin_arrive.php:106 includes/pages/admin_arrive.php:193 -#: includes/pages/admin_arrive.php:208 includes/pages/admin_arrive.php:223 -#: includes/view/User_view.php:619 -msgid "arrived" -msgstr "angekommen" - -#: includes/pages/admin_arrive.php:183 -msgid "Planned arrival" -msgstr "Geplanter Ankunftstag" - -#: includes/pages/admin_arrive.php:184 -msgid "Arrived?" -msgstr "Angekommen?" - -#: includes/pages/admin_arrive.php:185 -msgid "Arrival date" -msgstr "Ankunftsdatum" - -#: includes/pages/admin_arrive.php:186 -msgid "Planned departure" -msgstr "Geplante Abreise" - -#: includes/pages/admin_arrive.php:191 -msgid "Planned arrival statistics" -msgstr "Geplante Ankunfts-Statistik" - -#: includes/pages/admin_arrive.php:194 includes/pages/admin_arrive.php:209 -#: includes/pages/admin_arrive.php:224 -msgid "arrived sum" -msgstr "Summe angekommen" - -#: includes/pages/admin_arrive.php:200 includes/pages/admin_arrive.php:215 -#: includes/pages/admin_arrive.php:230 includes/pages/admin_news.php:45 -#: includes/pages/user_messages.php:118 -msgid "Date" -msgstr "Datum" - -#: includes/pages/admin_arrive.php:201 includes/pages/admin_arrive.php:216 -#: includes/pages/admin_arrive.php:231 -msgid "Count" -msgstr "Anzahl" - -#: includes/pages/admin_arrive.php:206 -msgid "Arrival statistics" -msgstr "Ankunfts-Statistik" - -#: includes/pages/admin_arrive.php:221 -msgid "Planned departure statistics" -msgstr "Geplante Abreise-Statistik" - -#: includes/pages/admin_free.php:12 includes/sys_menu.php:106 -msgid "Free angels" -msgstr "Freie Engel" - -#: includes/pages/admin_free.php:29 -msgid "Alle" -msgstr "All" - -#: includes/pages/admin_free.php:106 includes/view/ShiftEntry_view.php:91 -#: includes/view/ShiftTypes_view.php:61 -#: includes/view/UserAngelTypes_view.php:152 -msgid "Angeltype" -msgstr "Engeltyp" - -#: includes/pages/admin_free.php:111 -msgid "Only confirmed" -msgstr "Nur bestätigte" - -#: includes/pages/admin_free.php:112 includes/pages/guest_login.php:289 -#: includes/pages/guest_login.php:447 includes/view/AngelTypes_view.php:293 -#: includes/view/AngelTypes_view.php:306 includes/view/User_view.php:38 -#: includes/view/User_view.php:126 includes/view/User_view.php:255 -msgid "Nick" -msgstr "Nick" - -#: includes/pages/admin_free.php:113 -msgid "Next shift" -msgstr "Nächste Schicht" - -#: includes/pages/admin_free.php:114 -msgid "Last shift" -msgstr "Letzte Schicht" - -#: includes/pages/admin_free.php:115 includes/pages/guest_login.php:349 -#: includes/view/AngelTypes_view.php:113 includes/view/AngelTypes_view.php:294 -#: includes/view/AngelTypes_view.php:307 includes/view/AngelTypes_view.php:476 -#: includes/view/User_view.php:56 includes/view/User_view.php:258 -msgid "DECT" -msgstr "DECT" - -#: includes/pages/admin_free.php:116 includes/pages/guest_login.php:293 -#: includes/view/AngelTypes_view.php:114 includes/view/AngelTypes_view.php:477 -#: includes/view/User_view.php:58 includes/view/User_view.php:791 -msgid "E-Mail" -msgstr "E-Mail" - -#: includes/pages/admin_groups.php:10 includes/sys_menu.php:111 -msgid "Grouprights" -msgstr "Gruppenrechte" - -#: includes/pages/admin_groups.php:52 includes/pages/admin_import.php:184 -#: includes/pages/admin_import.php:188 includes/pages/admin_rooms.php:161 -#: includes/pages/admin_rooms.php:207 includes/view/AngelTypes_view.php:81 -#: includes/view/AngelTypes_view.php:82 includes/view/AngelTypes_view.php:112 -#: includes/view/AngelTypes_view.php:475 includes/view/AngelTypes_view.php:499 -#: includes/view/ShiftTypes_view.php:60 includes/view/ShiftTypes_view.php:140 -#: includes/view/User_view.php:257 -msgid "Name" -msgstr "Name" - -#: includes/pages/admin_groups.php:53 -msgid "Privileges" -msgstr "Privilegien" - -#: includes/pages/admin_groups.php:102 -msgid "Edit group" -msgstr "Gruppe bearbeiten" - -#: includes/pages/admin_import.php:8 includes/pages/admin_rooms.php:162 -#: includes/pages/admin_rooms.php:208 includes/sys_menu.php:112 -msgid "Frab import" -msgstr "Frab Import" - -#: includes/pages/admin_import.php:39 -msgid "Webserver has no write-permission on import directory." -msgstr "Der Webserver hat keine Schreibrechte für das Verzeichnis import." - -#: includes/pages/admin_import.php:64 includes/pages/admin_import.php:143 -#: includes/pages/admin_import.php:242 includes/pages/admin_shifts.php:58 -#: includes/pages/admin_shifts.php:64 -msgid "Please select a shift type." -msgstr "Bitte einen Schichttyp wählen." - -#: includes/pages/admin_import.php:72 includes/pages/admin_import.php:150 -#: includes/pages/admin_import.php:249 -msgid "Please enter an amount of minutes to add to a talk's begin." -msgstr "" -"Bitte gib eine Anzahl Minuten ein, die vor dem Talk-Beginn hinzugefügt " -"werden sollen." - -#: includes/pages/admin_import.php:79 includes/pages/admin_import.php:157 -#: includes/pages/admin_import.php:256 -msgid "Please enter an amount of minutes to add to a talk's end." -msgstr "" -"Bitte gib eine Anzahl Minuten ein, die nach dem Talk-Ende hinzugefügt werden " -"sollen." - -#: includes/pages/admin_import.php:87 -msgid "No valid xml/xcal file provided." -msgstr "Keine valide xml/xcal Datei hochgeladen." - -#: includes/pages/admin_import.php:92 -msgid "File upload went wrong." -msgstr "Das Hochladen der Datei ist schiefgegangen." - -#: includes/pages/admin_import.php:96 -msgid "Please provide some data." -msgstr "Bitte lade eine Datei hoch." - -#: includes/pages/admin_import.php:111 includes/pages/admin_import.php:172 -#: includes/pages/admin_import.php:292 -msgid "File Upload" -msgstr "Datei hochladen" - -#: includes/pages/admin_import.php:113 includes/pages/admin_import.php:174 -#: includes/pages/admin_import.php:294 -msgid "Validation" -msgstr "Überprüfen" - -#: includes/pages/admin_import.php:115 includes/pages/admin_import.php:127 -#: includes/pages/admin_import.php:176 includes/pages/admin_import.php:218 -#: includes/pages/admin_import.php:296 -msgid "Import" -msgstr "Importieren" - -#: includes/pages/admin_import.php:121 -msgid "" -"This import will create/update/delete rooms and shifts by given FRAB-export " -"file. The needed file format is xcal." -msgstr "" -"Dieser Import erzeugt, ändert und löscht Räume und Schichten anhand einer " -"FRAB-Export Datei. Das benötigte Format ist xcal." - -#: includes/pages/admin_import.php:124 -msgid "Add minutes to start" -msgstr "Minuten vor Talk-Beginn hinzufügen" - -#: includes/pages/admin_import.php:125 -msgid "Add minutes to end" -msgstr "Minuten nach Talk-Ende hinzufügen" - -#: includes/pages/admin_import.php:126 -msgid "xcal-File (.xcal)" -msgstr "xcal-Datei (.xcal)" - -#: includes/pages/admin_import.php:136 includes/pages/admin_import.php:231 -msgid "Missing import file." -msgstr "Import-Datei nicht vorhanden." - -#: includes/pages/admin_import.php:183 -msgid "Rooms to create" -msgstr "Anzulegende Räume" - -#: includes/pages/admin_import.php:187 -msgid "Rooms to delete" -msgstr "Zu löschende Räume" - -#: includes/pages/admin_import.php:191 -msgid "Shifts to create" -msgstr "Anzulegende Schichten" - -#: includes/pages/admin_import.php:193 includes/pages/admin_import.php:202 -#: includes/pages/admin_import.php:211 -msgid "Day" -msgstr "Tag" - -#: includes/pages/admin_import.php:194 includes/pages/admin_import.php:203 -#: includes/pages/admin_import.php:212 includes/pages/admin_shifts.php:408 -#: includes/view/Shifts_view.php:25 -msgid "Start" -msgstr "Beginn" - -#: includes/pages/admin_import.php:195 includes/pages/admin_import.php:204 -#: includes/pages/admin_import.php:213 includes/pages/admin_shifts.php:409 -#: includes/view/Shifts_view.php:33 -msgid "End" -msgstr "Ende" - -#: includes/pages/admin_import.php:196 includes/pages/admin_import.php:205 -#: includes/pages/admin_import.php:214 -msgid "Shift type" -msgstr "Schichttyp" - -#: includes/pages/admin_import.php:198 includes/pages/admin_import.php:207 -#: includes/pages/admin_import.php:216 includes/pages/admin_shifts.php:405 -msgid "Room" -msgstr "Raum" - -#: includes/pages/admin_import.php:200 -msgid "Shifts to update" -msgstr "Zu aktualisierende Schichten" - -#: includes/pages/admin_import.php:209 -msgid "Shifts to delete" -msgstr "Zu löschende Schichten" - -#: includes/pages/admin_import.php:297 -msgid "It's done!" -msgstr "Erledigt!" - -#: includes/pages/admin_log.php:10 includes/sys_menu.php:113 -msgid "Log" -msgstr "Log" - -#: includes/pages/admin_news.php:18 -msgid "Edit news entry" -msgstr "News-Eintrag bearbeiten" - -#: includes/pages/admin_news.php:38 -msgid "" -"This message contains HTML. After saving the post some formatting will be " -"lost!" -msgstr "" -"Diese Nachricht beinhaltet HTML. Wenn du sie speicherst gehen diese " -"Formatierungen verloren!" - -#: includes/pages/admin_news.php:46 -msgid "Author" -msgstr "Autor" - -#: includes/pages/admin_news.php:47 includes/pages/user_news.php:271 -msgid "Subject" -msgstr "Betreff" - -#: includes/pages/admin_news.php:48 includes/pages/user_messages.php:121 -#: includes/pages/user_news.php:183 includes/pages/user_news.php:272 -msgid "Message" -msgstr "Nachricht" - -#: includes/pages/admin_news.php:49 includes/pages/user_news.php:273 -msgid "Meeting" -msgstr "Treffen" - -#: includes/pages/admin_news.php:58 includes/pages/admin_rooms.php:195 -#: includes/view/User_view.php:165 -msgid "Delete" -msgstr "löschen" - -#: includes/pages/admin_news.php:88 -msgid "News entry updated." -msgstr "News-Eintrag gespeichert." - -#: includes/pages/admin_news.php:95 -msgid "News entry deleted." -msgstr "News-Eintrag gelöscht." - -#: includes/pages/admin_questions.php:11 includes/sys_menu.php:107 -msgid "Answer questions" -msgstr "Fragen beantworten" - -#: includes/pages/admin_questions.php:29 -msgid "There are unanswered questions!" -msgstr "Es gibt unbeantwortete Fragen!" - -#: includes/pages/admin_questions.php:82 -msgid "Unanswered questions" -msgstr "Unbeantwortete Fragen" - -#: includes/pages/admin_questions.php:84 includes/pages/admin_questions.php:91 -msgid "From" -msgstr "Von" - -#: includes/pages/admin_questions.php:85 includes/pages/admin_questions.php:92 -#: includes/view/Questions_view.php:30 includes/view/Questions_view.php:35 -msgid "Question" -msgstr "Frage" - -#: includes/pages/admin_questions.php:86 includes/pages/admin_questions.php:94 -#: includes/view/Questions_view.php:37 -msgid "Answer" -msgstr "Antwort" - -#: includes/pages/admin_questions.php:89 includes/view/Questions_view.php:33 -msgid "Answered questions" -msgstr "Beantwortete Fragen" - -#: includes/pages/admin_questions.php:93 includes/view/Questions_view.php:36 -msgid "Answered by" -msgstr "Antwort von" - -#: includes/pages/admin_rooms.php:7 includes/pages/user_shifts.php:232 -#: includes/sys_menu.php:110 includes/sys_menu.php:164 -msgid "Rooms" -msgstr "Räume" - -#: includes/pages/admin_rooms.php:82 -msgid "This name is already in use." -msgstr "Dieser Name ist bereits vergeben." - -#: includes/pages/admin_rooms.php:113 -#, php-format -msgid "Please enter needed angels for type %s." -msgstr "Bitte gib die Anzahl der benötigten Engel vom Typ %s an." - -#: includes/pages/admin_rooms.php:142 -msgid "Room saved." -msgstr "Raum gespeichert." - -#: includes/pages/admin_rooms.php:163 -msgid "Map URL" -msgstr "Karten URL" - -#: includes/pages/admin_rooms.php:164 -msgid "The map url is used to display an iframe on the room page." -msgstr "" -"Die Karten URL wird benutzt um auf der Raum-Seite ein iframe anzuzeigen." - -#: includes/pages/admin_rooms.php:165 includes/view/AngelTypes_view.php:105 -#: includes/view/AngelTypes_view.php:398 includes/view/Rooms_view.php:24 -#: includes/view/ShiftTypes_view.php:62 includes/view/ShiftTypes_view.php:100 -#: includes/view/Shifts_view.php:151 -msgid "Description" -msgstr "Beschreibung" - -#: includes/pages/admin_rooms.php:166 includes/view/AngelTypes_view.php:106 -#: includes/view/ShiftTypes_view.php:63 -msgid "Please use markdown for the description." -msgstr "Bitte benutze Markdown für die Beschreibung." - -#: includes/pages/admin_rooms.php:171 includes/view/PublicDashboard_view.php:26 -msgid "Needed angels:" -msgstr "Benötigte Engel:" - -#: includes/pages/admin_rooms.php:185 -#, php-format -msgid "Room %s deleted." -msgstr "Raum %s gelöscht." - -#: includes/pages/admin_rooms.php:193 -#, php-format -msgid "Do you want to delete room %s?" -msgstr "Möchest Du den Raum %s wirklich löschen?" - -#: includes/pages/admin_rooms.php:203 -msgid "add" -msgstr "Neu" - -#: includes/pages/admin_rooms.php:209 includes/view/Rooms_view.php:31 -msgid "Map" -msgstr "Karte" - -#: includes/pages/admin_shifts.php:10 includes/sys_menu.php:109 -msgid "Create shifts" -msgstr "Schichten erstellen" - -#: includes/pages/admin_shifts.php:80 -msgid "Please select a location." -msgstr "Bitte einen Ort auswählen." - -#: includes/pages/admin_shifts.php:87 -msgid "Please select a start time." -msgstr "Bitte eine Startzeit auswählen." - -#: includes/pages/admin_shifts.php:94 -msgid "Please select an end time." -msgstr "Bitte eine Endzeit auswählen." - -#: includes/pages/admin_shifts.php:99 -msgid "The shifts end has to be after its start." -msgstr "Die Endzeit muss nach der Startzeit liegen." - -#: includes/pages/admin_shifts.php:111 -msgid "Please enter a shift duration in minutes." -msgstr "Gib bitte eine Schichtlänge in Minuten ein." - -#: includes/pages/admin_shifts.php:128 -msgid "Please split the shift-change hours by colons." -msgstr "Trenne die Schichtwechselstunden mit einem Komma." - -#: includes/pages/admin_shifts.php:133 -msgid "Please select a mode." -msgstr "Bitte einen Modus auswählen." - -#: includes/pages/admin_shifts.php:146 -#, php-format -msgid "Please check the needed angels for team %s." -msgstr "Bitte gib die Anzahl der benötigten Engel vom Team %s an." - -#: includes/pages/admin_shifts.php:152 -msgid "There are 0 angels needed. Please enter the amounts of needed angels." -msgstr "Es werden 0 Engel benötigt. Bitte ändere das." - -#: includes/pages/admin_shifts.php:156 -msgid "Please select a mode for needed angels." -msgstr "Bitte wähle einen Modus für benötigte Engel." - -#: includes/pages/admin_shifts.php:160 -msgid "Please select needed angels." -msgstr "Bitte wähle benötigte Engel." - -#: includes/pages/admin_shifts.php:323 -msgid "Time and location" -msgstr "Zeit und Ort" - -#: includes/pages/admin_shifts.php:324 -msgid "Type and title" -msgstr "Typ und Titel" - -#: includes/pages/admin_shifts.php:410 -msgid "Mode" -msgstr "Modus" - -#: includes/pages/admin_shifts.php:411 -msgid "Create one shift" -msgstr "Eine Schicht erstellen" - -#: includes/pages/admin_shifts.php:412 -msgid "Create multiple shifts" -msgstr "Mehrere Schichten erstellen" - -#: includes/pages/admin_shifts.php:422 -msgid "Create multiple shifts with variable length" -msgstr "Erstelle mehrere Schichten mit unterschiedlicher Länge" - -#: includes/pages/admin_shifts.php:428 -msgid "Shift change hours" -msgstr "Schichtwechsel-Stunden" - -#: includes/pages/admin_shifts.php:438 -msgid "Take needed angels from room settings" -msgstr "Übernehme benötigte Engel von den Raum-Einstellungen" - -#: includes/pages/admin_shifts.php:444 -msgid "The following angels are needed" -msgstr "Die folgenden Engel werden benötigt" - -#: includes/pages/admin_user.php:11 includes/sys_menu.php:105 -msgid "All Angels" -msgstr "Engelliste" - -#: includes/pages/admin_user.php:32 -msgid "This user does not exist." -msgstr "Benutzer existiert nicht." - -#: includes/pages/admin_user.php:69 includes/pages/guest_login.php:320 -#: includes/view/User_view.php:77 -msgid "Please select..." -msgstr "Bitte auswählen..." - -#: includes/pages/admin_user.php:74 includes/pages/admin_user.php:81 -#: includes/view/AngelTypes_view.php:84 includes/view/AngelTypes_view.php:91 -#: includes/view/AngelTypes_view.php:96 includes/view/AngelTypes_view.php:103 -msgid "Yes" -msgstr "Ja" - -#: includes/pages/admin_user.php:75 includes/pages/admin_user.php:83 -#: includes/view/AngelTypes_view.php:84 includes/view/AngelTypes_view.php:91 -#: includes/view/AngelTypes_view.php:97 includes/view/AngelTypes_view.php:103 -msgid "No" -msgstr "Nein" - -#: includes/pages/admin_user.php:93 -msgid "Force active" -msgstr "Aktiv erzwingen" - -#: includes/pages/admin_user.php:110 -msgid "" -"Please visit the angeltypes page or the users profile to manage users " -"angeltypes." -msgstr "" -"Bitte benutze die Engeltypen-Seite um die Engeltypen des Users zu verwalten." - -#: includes/pages/admin_user.php:308 -msgid "Edit user" -msgstr "User bearbeiten" - -#: includes/pages/guest_credits.php:8 -msgid "Credits" -msgstr "Credits" - -#: includes/pages/guest_login.php:16 includes/pages/guest_login.php:442 -#: includes/pages/guest_login.php:449 includes/view/User_view.php:124 -#: includes/view/User_view.php:128 resources/views/layouts/parts/navbar.twig:45 -msgid "Login" -msgstr "Login" - -#: includes/pages/guest_login.php:24 includes/pages/guest_login.php:366 -#: resources/views/layouts/parts/navbar.twig:41 -msgid "Register" -msgstr "Registrieren" - -#: includes/pages/guest_login.php:32 includes/sys_menu.php:69 -msgid "Logout" -msgstr "Logout" - -#: includes/pages/guest_login.php:76 includes/pages/guest_login.php:495 -msgid "Registration is disabled." -msgstr "Registrierung ist abgeschaltet." - -#: includes/pages/guest_login.php:92 -msgid "Please enter a valid nick." -msgstr "Gib bitte einen erlaubten Nick an." - -#: includes/pages/guest_login.php:92 includes/pages/guest_login.php:290 -#: includes/view/User_view.php:39 -msgid "" -"Use up to 23 letters, numbers, connecting punctuations or spaces for your " -"nickname." -msgstr "" -"Verwende bis zu 23 Buchstaben, Zahlen, verbindende Schriftzeichen (.-_) oder " -"Leerzeichen für deinen Nick." - -#: includes/pages/guest_login.php:96 -#, php-format -msgid "Your nick "%s" already exists." -msgstr "Der Nick "%s" existiert schon." - -#: includes/pages/guest_login.php:100 includes/pages/guest_login.php:422 -msgid "Please enter a nickname." -msgstr "Gib bitte einen Nick an." - -#: includes/pages/guest_login.php:111 -msgid "E-mail address is already used by another user." -msgstr "Die E-Mail Adresse wurde bereits von einem anderen User benutzt." - -#: includes/pages/guest_login.php:131 -msgid "Please select your shirt size." -msgstr "Bitte wähle Deine T-Shirt Größe." - -#: includes/pages/guest_login.php:143 -#, php-format -msgid "Your password is too short (please use at least %s characters)." -msgstr "Dein Passwort ist zu kurz (Bitte mindestens %s Zeichen nutzen)." - -#: includes/pages/guest_login.php:154 includes/pages/guest_login.php:158 -#: includes/pages/user_settings.php:54 -msgid "" -"Please enter your planned date of arrival. It should be after the buildup " -"start date and before teardown end date." -msgstr "" -"Bitte gib Dein geplantes Ankunftsdatum an. Es sollte nach dem Aufbaubeginn " -"und vor dem Abbauende liegen." - -#: includes/pages/guest_login.php:180 includes/pages/user_settings.php:79 -msgid "For dect numbers are only 40 digits allowed." -msgstr "Die DECT Nummer darf nur 40 Zeichen lang sein." - -#: includes/pages/guest_login.php:252 -msgid "Angel registration successful!" -msgstr "Engel-Registrierung erfolgreich!" - -#: includes/pages/guest_login.php:281 -msgid "" -"By completing this form you're registering as a Chaos-Angel. This script " -"will create you an account in the angel task scheduler." -msgstr "" -"Mit diesem Formular registrierst Du Dich als Engel. Du bekommst ein Konto in " -"der Engel-Aufgabenverwaltung." - -#: includes/pages/guest_login.php:297 includes/view/User_view.php:62 -#, php-format -msgid "The %s is allowed to send me an email (e.g. when my shifts change)" -msgstr "Das %s darf mir E-Mails senden (z.B. wenn sich meine Schichten ändern)" - -#: includes/pages/guest_login.php:304 includes/view/User_view.php:69 -msgid "Humans are allowed to send me an email (e.g. for ticket vouchers)" -msgstr "Menschen dürfen mir eine E-Mail senden (z.B. für Ticket Gutscheine)" - -#: includes/pages/guest_login.php:313 includes/view/User_view.php:44 -msgid "Planned date of arrival" -msgstr "Geplanter Ankunftstag" - -#: includes/pages/guest_login.php:319 includes/view/User_view.php:74 -msgid "Shirt size" -msgstr "T-Shirt Größe" - -#: includes/pages/guest_login.php:325 includes/pages/guest_login.php:448 -#: includes/view/User_view.php:127 includes/view/User_view.php:808 -msgid "Password" -msgstr "Passwort" - -#: includes/pages/guest_login.php:328 includes/view/User_view.php:809 -msgid "Confirm password" -msgstr "Passwort wiederholen" - -#: includes/pages/guest_login.php:333 -msgid "What do you want to do?" -msgstr "Was möchtest Du machen?" - -#: includes/pages/guest_login.php:336 -msgid "Description of job types" -msgstr "Beschreibung der Aufgaben" - -#: includes/pages/guest_login.php:343 -msgid "" -"Restricted angel types need will be confirmed later by a supporter. You can " -"change your selection in the options section." -msgstr "" -"Beschränkte Engeltypen müssen später von einem Supporter freigeschaltet " -"werden. Du kannst Deine Auswahl später in den Einstellungen ändern." - -#: includes/pages/guest_login.php:352 includes/view/User_view.php:57 -msgid "Mobile" -msgstr "Handy" - -#: includes/pages/guest_login.php:357 includes/view/User_view.php:41 -msgid "First name" -msgstr "Vorname" - -#: includes/pages/guest_login.php:360 includes/view/User_view.php:40 -msgid "Last name" -msgstr "Nachname" - -#: includes/pages/guest_login.php:363 includes/view/User_view.php:37 -msgid "Entry required!" -msgstr "Pflichtfeld!" - -#: includes/pages/guest_login.php:414 -msgid "auth.no-password" -msgstr "Gib bitte ein Passwort ein." - -#: includes/pages/guest_login.php:418 -msgid "auth.not-found" -msgstr "" -"Es wurde kein Engel gefunden. Probiere es bitte noch einmal. Wenn das Problem " -"weiterhin besteht, melde dich im Himmel." - -#: includes/pages/guest_login.php:451 includes/view/User_view.php:130 -msgid "auth.no-nickname" -msgstr "Gib bitte einen Nick an." - -#: includes/pages/guest_login.php:481 -#: includes/view/User_view.php:122 -msgid "I forgot my password" -msgstr "Passwort vergessen" - -#: includes/pages/guest_login.php:456 includes/view/User_view.php:132 -msgid "Please note: You have to activate cookies!" -msgstr "Hinweis: Cookies müssen aktiviert sein!" - -#: includes/pages/guest_login.php:467 includes/view/User_view.php:136 -msgid "What can I do?" -msgstr "Was kann ich machen?" - -#: includes/pages/guest_login.php:468 includes/view/User_view.php:137 -msgid "Please read about the jobs you can do to help us." -msgstr "" -"Bitte informiere Dich über die Tätigkeiten bei denen Du uns helfen kannst." - -#: includes/pages/guest_login.php:488 -msgid "Please sign up, if you want to help us!" -msgstr "Bitte registriere Dich, wenn Du helfen möchtest!" - -#: includes/pages/user_messages.php:11 -msgid "Messages" -msgstr "Nachrichten" - -#: includes/pages/user_messages.php:49 -msgid "Select recipient..." -msgstr "Empfänger auswählen..." - -#: includes/pages/user_messages.php:98 -msgid "mark as read" -msgstr "als gelesen markieren" - -#: includes/pages/user_messages.php:105 -msgid "delete message" -msgstr "Nachricht löschen" - -#: includes/pages/user_messages.php:114 -#, php-format -msgid "Hello %s, here can you leave messages for other angels" -msgstr "Hallo %s, hier kannst Du anderen Engeln Nachrichten schreiben." - -#: includes/pages/user_messages.php:117 -msgid "New" -msgstr "Neu" - -#: includes/pages/user_messages.php:119 -msgid "Transmitted" -msgstr "Gesendet" - -#: includes/pages/user_messages.php:120 -msgid "Recipient" -msgstr "Empfänger" - -#: includes/pages/user_messages.php:132 includes/pages/user_messages.php:154 -msgid "Incomplete call, missing Message ID." -msgstr "Unvollständiger Aufruf, fehlende Nachrichten ID." - -#: includes/pages/user_messages.php:146 includes/pages/user_messages.php:165 -msgid "No Message found." -msgstr "Keine Nachricht gefunden." - -#: includes/pages/user_messages.php:173 -msgid "Transmitting was terminated with an Error." -msgstr "Übertragung wurde mit einem Fehler abgebrochen." - -#: includes/pages/user_messages.php:178 -msgid "Wrong action." -msgstr "Falsche Aktion." - -#: includes/pages/user_myshifts.php:11 includes/view/Shifts_view.php:141 -msgid "My shifts" -msgstr "Meine Schichten" - -#: includes/pages/user_myshifts.php:39 -msgid "Key changed." -msgstr "Key geändert." - -#: includes/pages/user_myshifts.php:42 includes/view/User_view.php:646 -msgid "Reset API key" -msgstr "API-Key zurücksetzen" - -#: includes/pages/user_myshifts.php:44 -msgid "" -"If you reset the key, the url to your iCal- and JSON-export and your atom " -"feed changes! You have to update it in every application using one of these " -"exports." -msgstr "" -"Wenn du den API-Key zurücksetzt, ändert sich die URL zu deinem iCal-, JSON-" -"Export und Atom Feed! Du musst diesen überall ändern, wo er in Benutzung ist." - -#: includes/pages/user_myshifts.php:47 -msgid "Continue" -msgstr "Fortfahren" - -#: includes/pages/user_myshifts.php:86 -msgid "Please enter a freeload comment!" -msgstr "Gib bitte einen Schwänz-Kommentar ein!" - -#: includes/pages/user_myshifts.php:108 -msgid "Shift saved." -msgstr "Schicht gespeichert." - -#: includes/pages/user_news.php:11 -msgid "News comments" -msgstr "News Kommentare" - -#: includes/pages/user_news.php:19 includes/sys_menu.php:86 -msgid "News" -msgstr "News" - -#: includes/pages/user_news.php:27 includes/sys_menu.php:87 -msgid "Meetings" -msgstr "Treffen" - -#: includes/pages/user_news.php:119 -msgid "Comments" -msgstr "Kommentare" - -#: includes/pages/user_news.php:160 includes/pages/user_news.php:229 -msgid "Entry saved." -msgstr "Eintrag gespeichert." - -#: includes/pages/user_news.php:181 -msgid "New Comment:" -msgstr "Neuer Kommentar:" - -#: includes/pages/user_news.php:187 -msgid "Invalid request." -msgstr "Ungültige Abfrage." - -#: includes/pages/user_news.php:268 -msgid "Create news:" -msgstr "News anlegen:" - -#: includes/pages/user_questions.php:11 includes/sys_menu.php:90 -#: includes/view/Questions_view.php:40 -msgid "Ask the Heaven" -msgstr "Frag den Himmel" - -#: includes/pages/user_questions.php:55 -msgid "You question was saved." -msgstr "Frage gespeichert." - -#: includes/pages/user_questions.php:59 -msgid "Please enter a question!" -msgstr "Gib eine Frage ein!" - -#: includes/pages/user_questions.php:71 -msgid "Incomplete call, missing Question ID." -msgstr "Unvollständiger Aufruf, fehlende Fragen ID." - -#: includes/pages/user_questions.php:86 -msgid "No question found." -msgstr "Keine Frage gefunden." - -#: includes/pages/user_settings.php:11 includes/sys_menu.php:60 -#: includes/view/User_view.php:634 -msgid "Settings" -msgstr "Einstellungen" - -#: includes/pages/user_settings.php:68 -msgid "" -"Please enter your planned date of departure. It should be after your planned " -"arrival date and after buildup start date and before teardown end date." -msgstr "" -"Bitte gibt dein geplantes Abreisedatum an. Es sollte nach Deinem " -"Anreisedatum, nach dem Aufbaubeginn und vor dem Abbauende liegen." - -#: includes/pages/user_settings.php:108 -msgid "-> not OK. Please try again." -msgstr "-> Nicht OK. Bitte erneut versuchen." - -#: includes/pages/user_settings.php:141 -msgid "Theme changed." -msgstr "Aussehen geändert." - -#: includes/pages/user_shifts.php:101 -msgid "The administration has not configured any rooms yet." -msgstr "Die Administratoren habe noch keine Räume eingerichtet." - -#: includes/pages/user_shifts.php:120 -msgid "The administration has not configured any shifts yet." -msgstr "Die Administratoren haben noch keine Schichten angelegt." - -#: includes/pages/user_shifts.php:137 -msgid "" -"The administration has not configured any angeltypes yet - or you are not " -"subscribed to any angeltype." -msgstr "" -"Die Administratoren haben noch keine Engeltypen konfiguriert - oder Du hast " -"noch keine Engeltypen ausgewählt." - -#: includes/pages/user_shifts.php:206 -msgid "occupied" -msgstr "belegt" - -#: includes/pages/user_shifts.php:210 -msgid "free" -msgstr "frei" - -#: includes/pages/user_shifts.php:255 -msgid "Own" -msgstr "Eigene" - -#: includes/pages/user_shifts.php:259 -msgid "Occupancy" -msgstr "Belegung" - -#: includes/pages/user_shifts.php:262 -msgid "" -"The tasks shown here are influenced by the angeltypes you joined already!" -msgstr "" -"Die Schichten, die hier angezeigt werden, sind von Deinen Einstellungen " -"(Engeltypen/Aufgaben) abhängig!" - -#: includes/pages/user_shifts.php:264 -msgid "Description of the jobs." -msgstr "Beschreibung der Aufgaben." - -#: includes/pages/user_shifts.php:268 -msgid "Filter" -msgstr "Filter" - -#: includes/pages/user_shifts.php:269 -msgid "Yesterday" -msgstr "Gestern" - -#: includes/pages/user_shifts.php:270 -msgid "Today" -msgstr "Heute" - -#: includes/pages/user_shifts.php:271 -msgid "Tomorrow" -msgstr "Morgen" - -#: includes/pages/user_shifts.php:272 -msgid "last 8h" -msgstr "letzte 8h" - -#: includes/pages/user_shifts.php:273 -msgid "last 4h" -msgstr "letzte 4h" - -#: includes/pages/user_shifts.php:274 -msgid "next 4h" -msgstr "nächste 4h" - -#: includes/pages/user_shifts.php:275 -msgid "next 8h" -msgstr "nächste 8h" - -#: includes/pages/user_shifts.php:292 -msgid "iCal export" -msgstr "iCal Export" - -#: includes/pages/user_shifts.php:294 -#, php-format -msgid "" -"Export your own shifts. iCal format or JSON format available (please keep secret, otherwise reset the api key)." -msgstr "" -"Exportiere Deine Schichten. iCal Format oder JSON Format verfügbar (Link bitte geheimhalten, sonst API-Key zurücksetzen)." - -#: includes/pages/user_shifts.php:327 includes/view/ShiftTypes_view.php:48 -msgid "All" -msgstr "Alle" - -#: includes/pages/user_shifts.php:328 -msgid "None" -msgstr "Keine" - -#: includes/sys_menu.php:133 -msgid "Admin" -msgstr "Admin" - -#: includes/sys_menu.php:155 -msgid "Manage rooms" -msgstr "Verwalte Räume" - -#: includes/sys_template.php:316 -msgid "No data found." -msgstr "Nichts gefunden." - -#: includes/view/AngelTypes_view.php:35 includes/view/AngelTypes_view.php:449 -msgid "Unconfirmed" -msgstr "Unbestätigt" - -#: includes/view/AngelTypes_view.php:37 includes/view/AngelTypes_view.php:41 -msgid "Supporter" -msgstr "Supporter" - -#: includes/view/AngelTypes_view.php:39 includes/view/AngelTypes_view.php:43 -msgid "Member" -msgstr "Mitglied" - -#: includes/view/AngelTypes_view.php:55 -#, php-format -msgid "Do you want to delete angeltype %s?" -msgstr "Möchtest Du den Engeltypen %s löschen?" - -#: includes/view/AngelTypes_view.php:58 includes/view/ShiftEntry_view.php:27 -#: includes/view/ShiftEntry_view.php:56 includes/view/ShiftTypes_view.php:25 -#: includes/view/UserAngelTypes_view.php:27 -#: includes/view/UserAngelTypes_view.php:55 -#: includes/view/UserAngelTypes_view.php:74 -#: includes/view/UserAngelTypes_view.php:98 -#: includes/view/UserAngelTypes_view.php:122 -#: includes/view/UserAngelTypes_view.php:175 -#: includes/view/UserWorkLog_view.php:20 -msgid "cancel" -msgstr "abbrechen" - -#: includes/view/AngelTypes_view.php:84 includes/view/AngelTypes_view.php:85 -#: includes/view/AngelTypes_view.php:500 -msgid "Restricted" -msgstr "Beschränkt" - -#: includes/view/AngelTypes_view.php:88 -msgid "" -"Restricted angel types can only be used by an angel if enabled by a " -"supporter (double opt-in)." -msgstr "" -"Beschränkte Engeltypen müssen von einem Supporter freigeschaltet werden " -"(double-opt-in)." - -#: includes/view/AngelTypes_view.php:91 includes/view/AngelTypes_view.php:92 -msgid "No Self Sign Up" -msgstr "Kein Selbst-Eintragen" - -#: includes/view/AngelTypes_view.php:94 includes/view/AngelTypes_view.php:100 -msgid "Requires driver license" -msgstr "Benötigt Führerschein" - -#: includes/view/AngelTypes_view.php:103 includes/view/AngelTypes_view.php:104 -msgid "Show on dashboard" -msgstr "Auf dem Dashboard anzeigen" - -#: includes/view/AngelTypes_view.php:107 includes/view/AngelTypes_view.php:474 -msgid "Contact" -msgstr "Kontakt" - -#: includes/view/AngelTypes_view.php:110 -msgid "Primary contact person/desk for user questions." -msgstr "Ansprechpartner für Fragen." - -#: includes/view/AngelTypes_view.php:140 -msgid "my driving license" -msgstr "Meine Führerschein-Infos" - -#: includes/view/AngelTypes_view.php:152 -msgid "" -"This angeltype requires a driver license. Please enter your driver license " -"information!" -msgstr "" -"Dieser Engeltyp benötigt Führerschein-Infos. Bitte trage Deine Führerschein-" -"Infos ein!" - -#: includes/view/AngelTypes_view.php:157 -#, php-format -msgid "" -"You are unconfirmed for this angeltype. Please go to the introduction for %s " -"to get confirmed." -msgstr "" -"Du bist noch nicht für diesen Engeltyp bestätigt. Bitte gehe zur Einführung " -"für %s um bestätigt zu werden." - -#: includes/view/AngelTypes_view.php:219 -msgid "confirm" -msgstr "bestätigen" - -#: includes/view/AngelTypes_view.php:227 -msgid "deny" -msgstr "ablehnen" - -#: includes/view/AngelTypes_view.php:265 -msgid "remove" -msgstr "entfernen" - -#: includes/view/AngelTypes_view.php:295 -msgid "Driver" -msgstr "Fahrer" - -#: includes/view/AngelTypes_view.php:296 -msgid "Has car" -msgstr "Hat Auto" - -#: includes/view/AngelTypes_view.php:297 -#: includes/view/UserDriverLicenses_view.php:31 -msgid "Car" -msgstr "Auto" - -#: includes/view/AngelTypes_view.php:298 -msgid "3,5t Transporter" -msgstr "3,5t Transporter" - -#: includes/view/AngelTypes_view.php:299 -msgid "7,5t Truck" -msgstr "7,5t LKW" - -#: includes/view/AngelTypes_view.php:300 -msgid "12,5t Truck" -msgstr "12,5t LKW" - -#: includes/view/AngelTypes_view.php:301 -#: includes/view/UserDriverLicenses_view.php:49 -msgid "Forklift" -msgstr "Gabelstapler" - -#: includes/view/AngelTypes_view.php:345 -msgid "Info" -msgstr "Info" - -#: includes/view/AngelTypes_view.php:413 -msgid "Supporters" -msgstr "Supporter" - -#: includes/view/AngelTypes_view.php:433 -msgid "Members" -msgstr "Mitglieder" - -#: includes/view/AngelTypes_view.php:441 -#: includes/view/UserAngelTypes_view.php:154 -msgid "Add" -msgstr "Hinzufügen" - -#: includes/view/AngelTypes_view.php:453 -msgid "confirm all" -msgstr "Alle bestätigen" - -#: includes/view/AngelTypes_view.php:457 -msgid "deny all" -msgstr "Alle ablehnen" - -#: includes/view/AngelTypes_view.php:494 -msgid "New angeltype" -msgstr "Neuer Engeltyp" - -#: includes/view/AngelTypes_view.php:501 -msgid "Self Sign Up Allowed" -msgstr "Selbst-Eintragen erlaubt" - -#: includes/view/AngelTypes_view.php:502 -msgid "Membership" -msgstr "Mitgliedschaft" - -#: includes/view/AngelTypes_view.php:546 -msgid "" -"This angeltype is restricted by double-opt-in by a team supporter. Please " -"show up at the according introduction meetings." -msgstr "" -"Dieser Engeltyp muss zusätzlich von einem Team-Supporter freigeschaltet " -"werden. Bitte komme zu den entsprechenden Einführungstreffen." - -#: includes/view/AngelTypes_view.php:581 -msgid "FAQ" -msgstr "FAQ" - -#: includes/view/AngelTypes_view.php:586 -msgid "" -"Here is the list of teams and their tasks. If you have questions, read the " -"FAQ." -msgstr "" -"Hier ist die Liste der Teams und ihrer Aufgaben. Wenn Du Fragen hast, schaue " -"im FAQ nach." - -#: includes/view/EventConfig_view.php:27 -#, php-format -msgid "Welcome to the %s!" -msgstr "Willkommen beim %s!" - -#: includes/view/EventConfig_view.php:34 -msgid "Buildup starts" -msgstr "Aufbau startet" - -#: includes/view/EventConfig_view.php:36 includes/view/EventConfig_view.php:44 -#: includes/view/EventConfig_view.php:52 includes/view/EventConfig_view.php:60 -#: includes/view/Shifts_view.php:27 includes/view/Shifts_view.php:35 -#: resources/views/layouts/parts/footer.twig:9 -#: resources/views/layouts/parts/footer.twig:10 -#: resources/views/layouts/parts/footer.twig:15 -#: resources/views/layouts/parts/footer.twig:22 -#: resources/views/layouts/parts/footer.twig:23 -msgid "Y-m-d" -msgstr "d.m.Y" - -#: includes/view/EventConfig_view.php:42 -msgid "Event starts" -msgstr "Event startet" - -#: includes/view/EventConfig_view.php:50 -msgid "Event ends" -msgstr "Event endet" - -#: includes/view/EventConfig_view.php:58 -msgid "Teardown ends" -msgstr "Abbau endet" - -#: includes/view/EventConfig_view.php:82 -#, php-format -msgid "%s, from %s to %s" -msgstr "%s, vom %s bis %s" - -#: includes/view/EventConfig_view.php:92 -#, php-format -msgid "%s, starting %s" -msgstr "%s, ab dem %s" - -#: includes/view/EventConfig_view.php:100 -#, php-format -msgid "Event from %s to %s" -msgstr "Event von %s bis %s" - -#: includes/view/EventConfig_view.php:91 -msgid "Event Name" -msgstr "Event Name" - -#: includes/view/EventConfig_view.php:92 -msgid "Event Name is shown on the start page." -msgstr "Event Name wird auf der Startseite angezeigt." - -#: includes/view/EventConfig_view.php:93 -msgid "Event Welcome Message" -msgstr "Event Willkommens-Nachricht" - -#: includes/view/EventConfig_view.php:96 -msgid "" -"Welcome message is shown after successful registration. You can use markdown." -msgstr "" -"Die Willkommens-Nachricht wird nach einer erfolgreichen Registrierung " -"angezeigt. Du kannst Markdown benutzen." - -#: includes/view/EventConfig_view.php:100 -msgid "Buildup date" -msgstr "Aufbau Datum" - -#: includes/view/EventConfig_view.php:101 -msgid "Event start date" -msgstr "Event Start Datum" - -#: includes/view/EventConfig_view.php:104 -msgid "Teardown end date" -msgstr "Abbau Ende Datum" - -#: includes/view/EventConfig_view.php:105 -msgid "Event end date" -msgstr "Event Ende Datum" - -#: includes/view/PublicDashboard_view.php:37 -msgid "Angels needed in the next 3 hrs" -msgstr "Benötigte Engel in den nächsten 3 Stunden" - -#: includes/view/PublicDashboard_view.php:38 -msgid "Angels needed for nightshifts" -msgstr "Benötigte Engel für Nachtschichten" - -#: includes/view/PublicDashboard_view.php:39 -msgid "Angels currently working" -msgstr "Aktuell arbeitende Engel" - -#: includes/view/PublicDashboard_view.php:40 -msgid "Hours to be worked" -msgstr "Noch zu schaffende Stunden" - -#: includes/view/PublicDashboard_view.php:56 -msgid "Fullscreen" -msgstr "Vollbild" - -#: includes/view/Questions_view.php:28 -msgid "Open questions" -msgstr "Offene Fragen" - -#: includes/view/Questions_view.php:42 -msgid "Your Question:" -msgstr "Deine Frage:" - -#: includes/view/ShiftCalendarRenderer.php:146 -msgid "No shifts found." -msgstr "Keine Schichten gefunden." - -#: includes/view/ShiftCalendarRenderer.php:246 -msgid "Time" -msgstr "Zeit" - -#: includes/view/ShiftCalendarRenderer.php:312 -msgid "Your shift" -msgstr "Meine Schicht" - -#: includes/view/ShiftCalendarRenderer.php:313 -msgid "Help needed" -msgstr "Hilfe benötigt" - -#: includes/view/ShiftCalendarRenderer.php:314 -msgid "Other angeltype needed / collides with my shifts" -msgstr "Andere Engeltypen benötigt / kollidiert mit meinen Schichten" - -#: includes/view/ShiftCalendarRenderer.php:315 -msgid "Shift is full" -msgstr "Schicht ist voll" - -#: includes/view/ShiftCalendarRenderer.php:316 -msgid "Shift running/ended or user not arrived/allowed" -msgstr "Schicht läuft/vorbei oder du bist noch nicht angekommen/darfst dich noch nicht anmelden" - -#: includes/view/ShiftCalendarShiftRenderer.php:134 -msgid "Add more angels" -msgstr "Neue Engel hinzufügen" - -#: includes/view/ShiftCalendarShiftRenderer.php:179 -#, php-format -msgid "%d helper needed" -msgid_plural "%d helpers needed" -msgstr[0] "%d Helfer benötigt" -msgstr[1] "%d Helfer benötigt" - -#: includes/view/ShiftCalendarShiftRenderer.php:192 -#: includes/view/Shifts_view.php:84 -msgid "Sign up" -msgstr "Eintragen" - -#: includes/view/ShiftCalendarShiftRenderer.php:198 -msgid "ended" -msgstr "vorbei" - -msgid "not yet" -msgstr "noch nicht" - -msgid "This shift is in the far future and becomes available for signup at %s." -msgstr "Diese Schicht liegt in der fernen Zukunft und du kannst dich ab %s eintragen." - -# Wie ist dies zu verstehen bitte? -#: includes/view/ShiftCalendarShiftRenderer.php:203 -msgid "please arrive for signup" -msgstr "Ankommen zum Eintragen" - -#: includes/view/ShiftCalendarShiftRenderer.php:218 -#: includes/view/Shifts_view.php:88 -#, php-format -msgid "Become %s" -msgstr "Werde ein %s" - -#: includes/view/ShiftEntry_view.php:18 -#, php-format -msgid "Do you want to sign off %s from shift %s from %s to %s as %s?" -msgstr "Möchtest Du %s von der Schicht %s von %s bis %s als %s austragen?" - -#: includes/view/ShiftEntry_view.php:47 -#, php-format -msgid "Do you want to sign off from your shift %s from %s to %s as %s?" -msgstr "Möchtest du dich von deiner Schicht %s von %s bis %s als %s austragen?" - -#: includes/view/ShiftEntry_view.php:68 -msgid "Shift sign off" -msgstr "Von Schicht austragen" - -#: includes/view/ShiftEntry_view.php:89 -msgid "Do you want to sign up the following user for this shift?" -msgstr "Möchtest du den folgenden User für die Schicht eintragen?" - -#: includes/view/ShiftEntry_view.php:92 includes/view/ShiftEntry_view.php:117 -#: includes/view/UserAngelTypes_view.php:153 -#: includes/view/UserWorkLog_view.php:45 -msgid "User" -msgstr "Benutzer" - -#: includes/view/ShiftEntry_view.php:114 -#, php-format -msgid "Do you want to sign up the following user for this shift as %s?" -msgstr "Möchtest du den folgenden User als %s in die Schicht eintragen?" - -#: includes/view/ShiftEntry_view.php:138 -#, php-format -msgid "Do you want to sign up for this shift as %s?" -msgstr "Möchtest du dich für diese Schicht als %s eintragen?" - -#: includes/view/ShiftEntry_view.php:140 includes/view/ShiftEntry_view.php:198 -msgid "Comment (for your eyes only):" -msgstr "Kommentar (nur für Dich):" - -#: includes/view/ShiftEntry_view.php:151 -msgid "Shift signup" -msgstr "Schicht Anmeldung" - -#: includes/view/ShiftEntry_view.php:182 includes/view/User_view.php:406 -#: includes/view/User_view.php:408 -msgid "Freeloaded" -msgstr "Geschwänzt" - -#: includes/view/ShiftEntry_view.php:185 -msgid "Freeload comment (Only for shift coordination):" -msgstr "Schwänzer Kommentar (Nur für die Schicht-Koordination):" - -#: includes/view/ShiftEntry_view.php:190 -msgid "Edit shift entry" -msgstr "Schichteintrag bearbeiten" - -#: includes/view/ShiftEntry_view.php:193 -msgid "Angel:" -msgstr "Engel:" - -#: includes/view/ShiftEntry_view.php:194 -msgid "Date, Duration:" -msgstr "Termin, Dauer:" - -#: includes/view/ShiftEntry_view.php:195 -msgid "Location:" -msgstr "Ort:" - -#: includes/view/ShiftEntry_view.php:196 -msgid "Title:" -msgstr "Titel:" - -#: includes/view/ShiftEntry_view.php:197 -msgid "Type:" -msgstr "Typ:" - -#: includes/view/ShiftTypes_view.php:22 -#, php-format -msgid "Do you want to delete shifttype %s?" -msgstr "Möchtest Du den Schichttypen %s löschen?" - -#: includes/view/ShiftTypes_view.php:54 -msgid "Edit shifttype" -msgstr "Schichttyp bearbeiten" - -#: includes/view/ShiftTypes_view.php:54 -msgid "Create shifttype" -msgstr "Schichttyp erstellen" - -#: includes/view/ShiftTypes_view.php:79 -#, php-format -msgid "for team %s" -msgstr "für Team %s" - -#: includes/view/ShiftTypes_view.php:137 -msgid "New shifttype" -msgstr "Neuer Schichttyp" - -#: includes/view/Shifts_view.php:41 includes/view/User_view.php:590 -msgid "Location" -msgstr "Ort" - -#: includes/view/Shifts_view.php:56 -#, php-format -msgid "created at %s by %s" -msgstr "erstellt am %s von %s" - -#: includes/view/Shifts_view.php:63 -#, php-format -msgid "edited at %s by %s" -msgstr "bearbeitet am %s von %s" - -#: includes/view/UserAngelTypes_view.php:18 -#, php-format -msgid "Do you really want to add supporter rights for %s to %s?" -msgstr "Sollen %s %s als neuen Supporter bekommen?" - -#: includes/view/UserAngelTypes_view.php:19 -#, php-format -msgid "Do you really want to remove supporter rights for %s from %s?" -msgstr "Möchtest Du wirklich %s von %s als Supporter befreien?" - -#: includes/view/UserAngelTypes_view.php:47 -#, php-format -msgid "Do you really want to deny all users for %s?" -msgstr "Möchtest Du wirklich alle Benutzer als %s ablehnen?" - -#: includes/view/UserAngelTypes_view.php:71 -#, php-format -msgid "Do you really want to confirm all users for %s?" -msgstr "Möchtest Du wirklich alle Benutzer als %s bestätigen?" - -#: includes/view/UserAngelTypes_view.php:92 -#, php-format -msgid "Do you really want to confirm %s for %s?" -msgstr "Möchtest Du wirklich %s für %s bestätigen?" - -#: includes/view/UserAngelTypes_view.php:116 -#, php-format -msgid "Do you really want to delete %s from %s?" -msgstr "Möchtest Du wirklich %s von %s entfernen?" - -#: includes/view/UserAngelTypes_view.php:169 -#, php-format -msgid "Do you really want to add %s to %s?" -msgstr "Möchtest Du wirklich %s zu %s hinzufügen?" - -#: includes/view/UserAngelTypes_view.php:176 -msgid "save" -msgstr "Speichern" - -#: includes/view/UserDriverLicenses_view.php:17 -msgid "Back to profile" -msgstr "Zurück zum Profil" - -#: includes/view/UserDriverLicenses_view.php:21 -msgid "Privacy" -msgstr "Privatsphäre" - -#: includes/view/UserDriverLicenses_view.php:21 -msgid "" -"Your driving license information is only visible for supporters and admins." -msgstr "Deine Führerschein-Infos sind nur für Supporter und Admins sichtbar." - -#: includes/view/UserDriverLicenses_view.php:22 -msgid "I am willing to drive a car for the event" -msgstr "Ich möchte für das Event Auto fahren" - -#: includes/view/UserDriverLicenses_view.php:27 -msgid "" -"I have my own car with me and am willing to use it for the event (You'll get " -"reimbursed for fuel)" -msgstr "" -"Ich habe mein eigenes Auto dabei und möchte es zum Fahren für das " -"Event verwenden (Du wirst für Spritkosten entschädigt)" - -#: includes/view/UserDriverLicenses_view.php:30 -msgid "Driver license" -msgstr "Führerschein" - -#: includes/view/UserDriverLicenses_view.php:34 -msgid "Transporter 3,5t" -msgstr "3,5t Transporter" - -#: includes/view/UserDriverLicenses_view.php:39 -msgid "Truck 7,5t" -msgstr "7,5t LKW" - -#: includes/view/UserDriverLicenses_view.php:44 -msgid "Truck 12,5t" -msgstr "12,5t LKW" - -#: includes/view/UserWorkLog_view.php:15 -#, php-format -msgid "Do you want to delete the worklog entry for %s?" -msgstr "Möchtest du den Arbeitseinsatz von %s wirklich löschen?" - -#: includes/view/UserWorkLog_view.php:32 -msgid "Delete work log entry" -msgstr "Arbeitseinsatz gelöscht." - -#: includes/view/UserWorkLog_view.php:46 -msgid "Work date" -msgstr "Einsatzdatum" - -#: includes/view/UserWorkLog_view.php:47 -msgid "Work hours" -msgstr "Arbeitsstunden" - -#: includes/view/UserWorkLog_view.php:48 includes/view/User_view.php:592 -msgid "Comment" -msgstr "Kommentar" - -#: includes/view/UserWorkLog_view.php:94 -msgid "Edit work log entry" -msgstr "Arbeitseinsatz bearbeiten" - -#: includes/view/UserWorkLog_view.php:102 -msgid "Add work log entry" -msgstr "Arbeitseinsatz hinzufügen" - -#: includes/view/User_view.php:36 -msgid "Here you can change your user details." -msgstr "Hier kannst Du Deine Details ändern." - -#: includes/view/User_view.php:51 -msgid "Planned date of departure" -msgstr "Geplanter Abreisetag" - -#: includes/view/User_view.php:79 -msgid "Please visit the angeltypes page to manage your angeltypes." -msgstr "Bitte benutze die Engeltypen-Seite um deine Engeltypen zu verwalten." - -#: includes/view/User_view.php:85 -msgid "Here you can change your password." -msgstr "Hier kannst Du Dein Passwort ändern." - -#: includes/view/User_view.php:86 -msgid "Old password:" -msgstr "Altes Passwort:" - -#: includes/view/User_view.php:87 -msgid "New password:" -msgstr "Neues Passwort:" - -#: includes/view/User_view.php:88 -msgid "Password confirmation:" -msgstr "Passwort wiederholen:" - -#: includes/view/User_view.php:92 -msgid "Here you can choose your color settings:" -msgstr "Hier kannst Du das Aussehen auswählen:" - -#: includes/view/User_view.php:93 -msgid "Color settings:" -msgstr "Aussehen:" - -#: includes/view/User_view.php:97 -msgid "Here you can choose your language:" -msgstr "Hier kannst Du Deine Sprache auswählen:" - -#: includes/view/User_view.php:98 -msgid "Language:" -msgstr "Sprache:" - -#: includes/view/User_view.php:117 -msgid "Registration successful" -msgstr "Registrierung erfolgreich" - -#: includes/view/User_view.php:160 -msgid "" -"Do you really want to delete the user including all his shifts and every " -"other piece of his data?" -msgstr "" -"Möchtest Du wirklich den Engel inklusive aller seiner Schichten und allen " -"anderen seiner Daten löschen?" - -#: includes/view/User_view.php:164 -msgid "Your password" -msgstr "Dein Passwort" - -#: includes/view/User_view.php:184 -#, php-format -msgid "Angel should receive at least %d vouchers." -msgstr "Engel sollte mindestens %d Gutscheine bekommen." - -#: includes/view/User_view.php:189 -msgid "Number of vouchers given out" -msgstr "Anzahl Gutscheine bekommen" - -#: includes/view/User_view.php:232 -msgid "m/d/Y h:i a" -msgstr "d.m.Y H:i" - -#: includes/view/User_view.php:252 -msgid "New user" -msgstr "Neuer User" - -#: includes/view/User_view.php:256 -msgid "Prename" -msgstr "Vorname" - -#: includes/view/User_view.php:259 includes/view/User_view.php:715 -msgid "Arrived" -msgstr "Angekommen" - -#: includes/view/User_view.php:260 -msgid "Voucher" -msgstr "Gutschein" - -#: includes/view/User_view.php:261 -msgid "Freeloads" -msgstr "Schwänzereien" - -#: includes/view/User_view.php:262 includes/view/User_view.php:752 -msgid "Active" -msgstr "Aktiv" - -#: includes/view/User_view.php:264 includes/view/User_view.php:755 -msgid "T-Shirt" -msgstr "T-Shirt" - -#: includes/view/User_view.php:266 -msgid "Last login" -msgstr "Letzter Login" - -#: includes/view/User_view.php:299 -msgid "Free" -msgstr "Frei" - -#: includes/view/User_view.php:307 includes/view/User_view.php:311 -#, php-format -msgid "Next shift %c" -msgstr "Nächste Schicht %c" - -#: includes/view/User_view.php:318 -#, php-format -msgid "Shift started %c" -msgstr "Schicht startete %c" - -#: includes/view/User_view.php:323 -#, php-format -msgid "Shift ends %c" -msgstr "Schicht endet %c" - -#: includes/view/User_view.php:340 -#, php-format -msgid "Shift ended %c" -msgstr "Schicht endete %c" - -#: includes/view/User_view.php:425 -msgid "sign off" -msgstr "abmelden" - -#: includes/view/User_view.php:481 -msgid "Sum:" -msgstr "Summe:" - -#: includes/view/User_view.php:490 -msgid "Your t-shirt score" -msgstr "Dein T-Shirt Score" - -#: includes/view/User_view.php:531 -msgid "Work log entry" -msgstr "Arbeitseinsatz" - -#: includes/view/User_view.php:534 -#, php-format -msgid "Added by %s at %s" -msgstr "Erstellt von %s am %s" - -#: includes/view/User_view.php:588 -msgid "Day & time" -msgstr "Tag & Zeit" - -#: includes/view/User_view.php:589 -msgid "Duration" -msgstr "Dauer" - -#: includes/view/User_view.php:591 -msgid "Name & workmates" -msgstr "Name & Kollegen" - -#: includes/view/User_view.php:593 -msgid "Action" -msgstr "Aktion" - -#: includes/view/User_view.php:596 -msgid "You have done enough to get a t-shirt." -msgstr "Du hast genug für ein T-Shirt gemacht." - -#: includes/view/User_view.php:615 -msgid "driving license" -msgstr "Führerschein" - -#: includes/view/User_view.php:626 -msgid "Edit vouchers" -msgstr "Gutschein bearbeiten" - -#: includes/view/User_view.php:630 -msgid "Add work log" -msgstr "Neuer Arbeitseinsatz" - -#: includes/view/User_view.php:638 -msgid "iCal Export" -msgstr "iCal Export" - -#: includes/view/User_view.php:642 -msgid "JSON Export" -msgstr "JSON Export" - -#: includes/view/User_view.php:663 -#, php-format -msgid "Your night shifts between %d and %d am count twice." -msgstr "Deine Nachtschichten zwischen %d und %d Uhr zählen doppelt." - -#: includes/view/User_view.php:671 -#, php-format -msgid "" -"Go to the shifts table to sign yourself up for some " -"shifts." -msgstr "" -"Gehe zur Schicht-Tabelle, um Dich für Schichten " -"einzutragen." - -#: includes/view/User_view.php:697 -msgid "User state" -msgstr "Engelzustand" - -#: includes/view/User_view.php:717 -msgid "Not arrived" -msgstr "Nicht angekommen" - -#: includes/view/User_view.php:736 -msgid "Freeloader" -msgstr "Schwänzer" - -#: includes/view/User_view.php:744 -#, php-format -msgid "Arrived at %s" -msgstr "Angekommen am %s" - -#: includes/view/User_view.php:750 -msgid "Active (forced)" -msgstr "Aktiv (gezwungen)" - -#: includes/view/User_view.php:761 -#, php-format -msgid "Not arrived (Planned: %s)" -msgstr "Nicht angekommen (Geplant: %s)" - -#: includes/view/User_view.php:696 -#, php-format -msgid "Got %s voucher" -msgid_plural "Got %s vouchers" -msgstr[0] "Einen Gutschein bekommen" -msgstr[1] "%s Gutscheine bekommen" - -#: includes/view/User_view.php:774 -msgid "Got no vouchers" -msgstr "Gutschein nicht bekommen" - -#: includes/view/User_view.php:789 -msgid "" -"We will send you an e-mail with a password recovery link. Please use the " -"email address you used for registration." -msgstr "" -"Wir werden eine eMail mit einem Link schicken, mit dem du das Passwort " -"zurücksetzen kannst. Bitte benutze die Mailadresse, die du bei der Anmeldung " -"verwendet hast." - -#: includes/view/User_view.php:792 -msgid "Recover" -msgstr "Wiederherstellen" - -#: includes/view/User_view.php:806 -msgid "Please enter a new password." -msgstr "Gib bitte ein neues Passwort ein." - -#: includes/view/User_view.php:850 -msgid "Rights" -msgstr "Rechte" - -#: includes/view/User_view.php:901 -msgid "" -"Please enter your planned date of departure on your settings page to give us " -"a feeling for teardown capacities." -msgstr "" -"Bitte gib Dein geplantes Abreisedatum an, damit wir ein Gefühl für die Abbau-" -"Planung bekommen." - -#: includes/view/User_view.php:915 -#, php-format -msgid "" -"You freeloaded at least %s shifts. Shift signup is locked. Please go to " -"heavens desk to be unlocked again." -msgstr "" -"Du hast mindestens %s Schichten geschwänzt. Schicht-Registrierung ist " -"gesperrt. Bitte gehe zum Himmelsschreibtisch um wieder entsperrt zu werden." - -#: includes/view/User_view.php:934 -msgid "" -"You are not marked as arrived. Please go to heaven's desk, get your angel " -"badge and/or tell them that you arrived already." -msgstr "" -"Du bist nicht als angekommen markiert. Bitte gehe zur Himmelsverwaltung, " -"hole Dein Badge ab und/oder erkläre ihnen, dass Du bereits angekommen bist." - -#: includes/view/User_view.php:947 -msgid "You need to specify a tshirt size in your settings!" -msgstr "Bitte eine T-Shirt-Größe auswählen" - -#: includes/view/User_view.php:961 -msgid "" -"You need to specify a DECT phone number in your settings! If you don't have " -"a DECT phone, just enter '-'." -msgstr "" -"Bitte eine DECT-Telefonnummer in den Einstellungen eingeben. Wenn du noch " -"keine Nummer hast, bitte einfach \"-\" angeben." - -#: resources/views/emails/mail.twig:1 -#, python-format -msgid "Hi %s," -msgstr "Hallo %s," - -#: resources/views/emails/mail.twig:3 -#, python-format -msgid "here is a message for you from the %s:" -msgstr "hier ist eine Nachricht aus dem %s für Dich:" - -#: resources/views/emails/mail.twig:6 -#, python-format -msgid "" -"This email is autogenerated and has not been signed. You got this email " -"because you are registered in the %s." -msgstr "" -"Diese E-Mail wurde automatisch generiert und muss daher nicht unterschrieben " -"werden. Du hast diese E-Mail bekommen, weil Du im %s registriert bist." - -#: resources/views/errors/403.twig:3 -msgid "Forbidden" -msgstr "Nicht erlaubt" - -#: resources/views/errors/403.twig:5 -msgid "You are not allowed to access this page" -msgstr "Du darfst diese Seite nicht aufrufen" - -#: resources/views/errors/404.twig:3 -msgid "Page not found" -msgstr "Seite nicht gefunden" - -#: resources/views/errors/404.twig:10 -msgid "No sleep found" -msgstr "No sleep found" - -#: resources/views/errors/419.twig:3 -msgid "Authentication expired" -msgstr "Autorisierung ist abgelaufen" - -#: resources/views/errors/419.twig:6 -msgid "The provided CSRF token is invalid or has expired" -msgstr "Das angegebene CSRF Token ist ungültig oder abgelaufen" - -#: resources/views/layouts/parts/footer.twig:34 -msgid "Bugs / Features" -msgstr "Bugs / Features" - -#: resources/views/layouts/parts/footer.twig:35 -msgid "Development Platform" -msgstr "Entwicklerplattform" - -#: src/Middleware/LegacyMiddleware.php -msgid "" -"This page could not be found or you don't have permission to view it. You " -"probably have to sign in or register in order to gain access!" -msgstr "" -"Diese Seite existiert nicht oder Du hast keinen Zugriff. Melde Dich an um " -"Zugriff zu erhalten!" diff --git a/resources/lang/de_DE/default.mo b/resources/lang/de_DE/default.mo new file mode 100644 index 00000000..35ad80b7 Binary files /dev/null and b/resources/lang/de_DE/default.mo differ diff --git a/resources/lang/de_DE/default.po b/resources/lang/de_DE/default.po new file mode 100644 index 00000000..cd696610 --- /dev/null +++ b/resources/lang/de_DE/default.po @@ -0,0 +1,2767 @@ +msgid "" +msgstr "" +"Project-Id-Version: Engelsystem\n" +"POT-Creation-Date: 2019-04-28 15:23+0200\n" +"PO-Revision-Date: 2019-06-12 16:07+0200\n" +"Last-Translator: msquare \n" +"Language-Team: \n" +"Language: de_DE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.11\n" +"X-Poedit-KeywordsList: __;_e;translate;translatePlural\n" +"X-Poedit-Basepath: ../../../..\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-SearchPath-0: resources/views\n" +"X-Poedit-SearchPath-1: src\n" +"X-Poedit-SearchPath-2: includes\n" + +#: includes/controller/angeltypes_controller.php:13 +#: includes/pages/user_shifts.php:251 includes/sys_menu.php:89 +#: includes/view/AngelTypes_view.php:76 includes/view/AngelTypes_view.php:134 +#: includes/view/User_view.php:832 +msgid "Angeltypes" +msgstr "Engeltypen" + +#: includes/controller/angeltypes_controller.php:69 +#: includes/pages/guest_login.php:472 includes/view/AngelTypes_view.php:496 +#: includes/view/AngelTypes_view.php:593 includes/view/User_view.php:139 +msgid "Teams/Job description" +msgstr "Team-/Aufgabenbeschreibung" + +#: includes/controller/angeltypes_controller.php:89 +#, php-format +msgid "Angeltype %s deleted." +msgstr "Engeltyp %s gelöscht." + +#: includes/controller/angeltypes_controller.php:94 +#: includes/view/AngelTypes_view.php:54 +#, php-format +msgid "Delete angeltype %s" +msgstr "Lösche Engeltyp %s" + +#: includes/controller/angeltypes_controller.php:135 +msgid "Please check the name. Maybe it already exists." +msgstr "Bitte überprüfe den Namen. Vielleicht ist er bereits vergeben." + +#: includes/controller/angeltypes_controller.php:165 +#: includes/view/AngelTypes_view.php:74 +#, php-format +msgid "Edit %s" +msgstr "%s bearbeiten" + +#: includes/controller/angeltypes_controller.php:203 +#: includes/view/AngelTypes_view.php:341 +#, php-format +msgid "Team %s" +msgstr "Team %s" + +#: includes/controller/angeltypes_controller.php:286 +#: includes/view/User_view.php:413 +msgid "view" +msgstr "ansehen" + +#: includes/controller/angeltypes_controller.php:294 +#: includes/pages/admin_free.php:97 includes/pages/admin_groups.php:44 +#: includes/pages/admin_rooms.php:27 includes/view/AngelTypes_view.php:170 +#: includes/view/ShiftTypes_view.php:91 includes/view/ShiftTypes_view.php:123 +#: includes/view/Shifts_view.php:135 includes/view/User_view.php:418 +#: includes/view/User_view.php:516 includes/view/User_view.php:611 +msgid "edit" +msgstr "bearbeiten" + +#: includes/controller/angeltypes_controller.php:299 +#: includes/controller/shifts_controller.php:243 +#: includes/pages/admin_questions.php:60 includes/pages/admin_questions.php:76 +#: includes/pages/admin_rooms.php:32 includes/pages/admin_user.php:179 +#: includes/view/AngelTypes_view.php:59 includes/view/AngelTypes_view.php:177 +#: includes/view/Questions_view.php:13 includes/view/Questions_view.php:22 +#: includes/view/ShiftEntry_view.php:28 includes/view/ShiftEntry_view.php:57 +#: includes/view/ShiftTypes_view.php:28 includes/view/ShiftTypes_view.php:96 +#: includes/view/ShiftTypes_view.php:128 includes/view/Shifts_view.php:136 +#: includes/view/UserWorkLog_view.php:21 includes/view/User_view.php:521 +msgid "delete" +msgstr "löschen" + +#: includes/controller/angeltypes_controller.php:310 +#: includes/view/AngelTypes_view.php:163 includes/view/AngelTypes_view.php:532 +msgid "leave" +msgstr "verlassen" + +# As already mentioned in Issue #312 : I'd suggest "join angel" and the German translation "Engel hinzufügen" for this button. +#: includes/controller/angeltypes_controller.php:316 +#: includes/view/AngelTypes_view.php:147 includes/view/AngelTypes_view.php:537 +msgid "join" +msgstr "mitmachen" + +#: includes/controller/angeltypes_controller.php:353 +msgid "Angeltype doesn't exist . " +msgstr "Engeltyp existiert nicht." + +#: includes/controller/event_config_controller.php:11 includes/sys_menu.php:114 +msgid "Event config" +msgstr "Event Einstellungen" + +#: includes/controller/event_config_controller.php:53 +msgid "Please enter buildup start date." +msgstr "Bitte gib das Aufbau Start Datum an." + +#: includes/controller/event_config_controller.php:57 +msgid "Please enter event start date." +msgstr "Bitte gib das Event Start Datum an." + +#: includes/controller/event_config_controller.php:61 +msgid "Please enter event end date." +msgstr "Bitte gib das Event Ende Datum an." + +#: includes/controller/event_config_controller.php:65 +msgid "Please enter teardown end date." +msgstr "Bitte gib das Abbau Ende Datum an." + +#: includes/controller/event_config_controller.php:71 +msgid "The buildup start date has to be before the event start date." +msgstr "Das Aufbau Start Datum muss vor dem Event Start Datum liegen." + +#: includes/controller/event_config_controller.php:76 +msgid "The event start date has to be before the event end date." +msgstr "Das Event Start Datum muss vor dem Event End Datum liegen." + +#: includes/controller/event_config_controller.php:81 +msgid "The event end date has to be before the teardown end date." +msgstr "Das Event Ende Datum muss vor dem Abbau Ende Datum liegen." + +#: includes/controller/event_config_controller.php:86 +msgid "The buildup start date has to be before the teardown end date." +msgstr "Das Aufbau Start Datum muss vor dem Abbau Ende Datum liegen." + +#: includes/controller/event_config_controller.php:120 +#: includes/pages/user_settings.php:89 +msgid "Settings saved." +msgstr "Einstellungen gespeichert." + +#: includes/controller/public_dashboard_controller.php:27 +#: includes/pages/user_shifts.php:278 includes/view/PublicDashboard_view.php:55 +msgid "Public Dashboard" +msgstr "Öffentliches Dashboard" + +#: includes/controller/shift_entries_controller.php:109 +#: includes/controller/shift_entries_controller.php:181 +#, php-format +msgid "%s has been subscribed to the shift." +msgstr "%s wurde in die Schicht eingetragen." + +#: includes/controller/shift_entries_controller.php:149 +msgid "User is not in angeltype." +msgstr "User ist nicht im Engeltyp." + +#: includes/controller/shift_entries_controller.php:166 +#: includes/controller/shift_entries_controller.php:210 +msgid "This shift is already occupied." +msgstr "Die Schicht ist schon voll." + +#: includes/controller/shift_entries_controller.php:206 +msgid "You need be accepted member of the angeltype." +msgstr "Du musst bestätigtes Mitglied des Engeltyps sein." + +#: includes/controller/shift_entries_controller.php:208 +#: includes/view/Shifts_view.php:125 +msgid "This shift collides with one of your shifts." +msgstr "Diese Schicht kollidiert mit deinen Schichten." + +#: includes/controller/shift_entries_controller.php:212 +msgid "This shift ended already." +msgstr "Die Schicht ist schon vorbei." + +#: includes/controller/shift_entries_controller.php:214 +msgid "You are not marked as arrived." +msgstr "Du bist nicht als angekommen markiert." + +msgid "You are not allowed to sign up yet." +msgstr "Du darfst dich noch nicht anmelden." + +#: includes/controller/shift_entries_controller.php:216 +#: includes/view/Shifts_view.php:129 +msgid "You are signed up for this shift." +msgstr "Du bist für diese Schicht eingetragen." + +#: includes/controller/shift_entries_controller.php:265 +msgid "You are subscribed. Thank you!" +msgstr "Du bist eingetragen. Danke!" + +#: includes/controller/shift_entries_controller.php:324 +msgid "Shift entry not found." +msgstr "Schichteintrag nicht gefunden." + +#: includes/controller/shift_entries_controller.php:346 +msgid "" +"You are not allowed to remove this shift entry. If necessary, ask your " +"supporter or heaven to do so." +msgstr "" +"Du darfst diesen Schichteintrag nicht entfernen. Falls notwendig, frage " +"deinen Supporter oder im Himmel danach." + +#: includes/controller/shift_entries_controller.php:352 +msgid "Shift entry removed." +msgstr "Schichteintrag gelöscht." + +#: includes/controller/shifts_controller.php:95 +msgid "Please select a room." +msgstr "Bitte einen Raum auswählen." + +#: includes/controller/shifts_controller.php:102 +msgid "Please select a shifttype." +msgstr "Bitte einen Schichttyp wählen." + +#: includes/controller/shifts_controller.php:109 +msgid "Please enter a valid starting time for the shifts." +msgstr "Bitte gib eine korrekte Startzeit für die Schichten ein." + +#: includes/controller/shifts_controller.php:116 +msgid "Please enter a valid ending time for the shifts." +msgstr "Bitte gib eine korrekte Endzeit für die Schichten ein." + +#: includes/controller/shifts_controller.php:121 +msgid "The ending time has to be after the starting time." +msgstr "Die Endzeit muss nach der Startzeit liegen." + +#: includes/controller/shifts_controller.php:134 +#, php-format +msgid "Please check your input for needed angels of type %s." +msgstr "Bitte prüfe deine Eingabe für benötigte Engel des Typs %s." + +#: includes/controller/shifts_controller.php:164 +msgid "Shift updated." +msgstr "Schicht aktualisiert." + +#: includes/controller/shifts_controller.php:183 +msgid "This page is much more comfortable with javascript." +msgstr "Diese Seite ist mit JavaScript viel komfortabler." + +#: includes/controller/shifts_controller.php:186 +#: includes/pages/admin_import.php:123 includes/pages/admin_shifts.php:403 +msgid "Shifttype" +msgstr "Schichttyp" + +#: includes/controller/shifts_controller.php:187 +#: includes/pages/admin_import.php:197 includes/pages/admin_import.php:206 +#: includes/pages/admin_import.php:215 includes/pages/admin_shifts.php:404 +#: includes/view/Shifts_view.php:17 +msgid "Title" +msgstr "Titel" + +#: includes/controller/shifts_controller.php:188 +msgid "Room:" +msgstr "Raum:" + +#: includes/controller/shifts_controller.php:189 +msgid "Start:" +msgstr "Start:" + +#: includes/controller/shifts_controller.php:190 +msgid "End:" +msgstr "Ende:" + +#: includes/controller/shifts_controller.php:191 +#: includes/pages/admin_shifts.php:325 includes/pages/admin_shifts.php:435 +#: includes/view/Shifts_view.php:147 +msgid "Needed angels" +msgstr "Benötigte Engel" + +#: includes/controller/shifts_controller.php:193 +#: includes/pages/admin_groups.php:101 includes/pages/admin_news.php:50 +#: includes/pages/admin_questions.php:57 includes/pages/admin_rooms.php:177 +#: includes/pages/admin_shifts.php:327 includes/pages/user_messages.php:78 +#: includes/pages/user_news.php:184 includes/pages/user_news.php:274 +#: includes/view/AngelTypes_view.php:115 includes/view/EventConfig_view.php:110 +#: includes/view/Questions_view.php:43 includes/view/ShiftEntry_view.php:93 +#: includes/view/ShiftEntry_view.php:118 includes/view/ShiftEntry_view.php:141 +#: includes/view/ShiftEntry_view.php:200 includes/view/ShiftTypes_view.php:64 +#: includes/view/UserDriverLicenses_view.php:54 +#: includes/view/UserWorkLog_view.php:49 includes/view/User_view.php:80 +#: includes/view/User_view.php:89 includes/view/User_view.php:94 +#: includes/view/User_view.php:99 includes/view/User_view.php:190 +#: includes/view/User_view.php:810 +msgid "Save" +msgstr "Speichern" + +#: includes/controller/shifts_controller.php:230 +msgid "Shift deleted." +msgstr "Schicht gelöscht." + +#: includes/controller/shifts_controller.php:236 +#, php-format +msgid "Do you want to delete the shift %s from %s to %s?" +msgstr "Möchtest Du die Schicht %s von %s bis %s löschen?" + +#: includes/controller/shifts_controller.php:266 +msgid "Shift could not be found." +msgstr "Schicht konnte nicht gefunden werden." + +#: includes/controller/shifttypes_controller.php:33 +#, php-format +msgid "Shifttype %s deleted." +msgstr "Schichttyp %s gelöscht." + +#: includes/controller/shifttypes_controller.php:38 +#: includes/view/ShiftTypes_view.php:21 +#, php-format +msgid "Delete shifttype %s" +msgstr "Lösche Schichttyp %s" + +#: includes/controller/shifttypes_controller.php:61 +msgid "Shifttype not found." +msgstr "Schichttyp nicht gefunden." + +#: includes/controller/shifttypes_controller.php:77 +#: includes/pages/admin_rooms.php:88 +msgid "Please enter a name." +msgstr "Gib bitte einen Namen an." + +#: includes/controller/shifttypes_controller.php:95 +msgid "Updated shifttype." +msgstr "Schichttyp geändert." + +#: includes/controller/shifttypes_controller.php:100 +msgid "Created shifttype." +msgstr "Schichttyp erstellt." + +#: includes/controller/shifttypes_controller.php:159 includes/sys_menu.php:108 +msgid "Shifttypes" +msgstr "Schichttypen" + +#: includes/controller/user_angeltypes_controller.php:26 +#, php-format +msgid "There is %d unconfirmed angeltype." +msgid_plural "There are %d unconfirmed angeltypes." +msgstr[0] "Es gibt %d nicht freigeschalteten Engeltypen!" +msgstr[1] "Es gibt %d nicht freigeschaltete Engeltypen!" + +#: includes/controller/user_angeltypes_controller.php:33 +msgid "Angel types which need approvals:" +msgstr "Engeltypen die bestätigt werden müssen:" + +#: includes/controller/user_angeltypes_controller.php:47 +#: includes/controller/user_angeltypes_controller.php:53 +#: includes/controller/user_angeltypes_controller.php:87 +#: includes/controller/user_angeltypes_controller.php:93 +#: includes/controller/user_angeltypes_controller.php:139 +#: includes/controller/user_angeltypes_controller.php:199 +#: includes/controller/user_angeltypes_controller.php:265 +msgid "Angeltype doesn't exist." +msgstr "Engeltyp existiert nicht." + +#: includes/controller/user_angeltypes_controller.php:58 +msgid "You are not allowed to delete all users for this angeltype." +msgstr "Du darfst nicht alle Benutzer von diesem Engeltyp entfernen." + +#: includes/controller/user_angeltypes_controller.php:66 +#, php-format +msgid "Denied all users for angeltype %s." +msgstr "Alle Benutzer mit Engeltyp %s abgelehnt." + +#: includes/controller/user_angeltypes_controller.php:71 +#: includes/view/UserAngelTypes_view.php:45 +msgid "Deny all users" +msgstr "Alle Benutzer ablehnen" + +#: includes/controller/user_angeltypes_controller.php:98 +msgid "You are not allowed to confirm all users for this angeltype." +msgstr "Du darfst nicht alle Benutzer für diesen Engeltyp freischalten." + +#: includes/controller/user_angeltypes_controller.php:106 +#, php-format +msgid "Confirmed all users for angeltype %s." +msgstr "Alle Benutzer für Engeltyp %s freigeschaltet." + +#: includes/controller/user_angeltypes_controller.php:111 +#: includes/view/UserAngelTypes_view.php:69 +msgid "Confirm all users" +msgstr "Alle Benutzer bestätigen" + +#: includes/controller/user_angeltypes_controller.php:127 +#: includes/controller/user_angeltypes_controller.php:133 +#: includes/controller/user_angeltypes_controller.php:187 +#: includes/controller/user_angeltypes_controller.php:193 +#: includes/controller/user_angeltypes_controller.php:246 +#: includes/controller/user_angeltypes_controller.php:259 +msgid "User angeltype doesn't exist." +msgstr "Benutzer-Engeltype existiert nicht." + +#: includes/controller/user_angeltypes_controller.php:144 +msgid "You are not allowed to confirm this users angeltype." +msgstr "Du darfst diesen Benutzer nicht für diesen Engeltyp freischalten." + +#: includes/controller/user_angeltypes_controller.php:150 +#: includes/controller/user_angeltypes_controller.php:205 +#: includes/controller/user_angeltypes_controller.php:271 +#: includes/controller/users_controller.php:441 +msgid "User doesn't exist." +msgstr "Benutzer existiert nicht." + +#: includes/controller/user_angeltypes_controller.php:163 +#, php-format +msgid "%s confirmed for angeltype %s." +msgstr "%s für Engeltyp %s freigeschaltet." + +#: includes/controller/user_angeltypes_controller.php:171 +#: includes/view/UserAngelTypes_view.php:89 +msgid "Confirm angeltype for user" +msgstr "Engeltyp für Benutzer bestätigen" + +#: includes/controller/user_angeltypes_controller.php:210 +msgid "You are not allowed to delete this users angeltype." +msgstr "Du darfst diesen Benutzer nicht von diesem Engeltyp entfernen." + +#: includes/controller/user_angeltypes_controller.php:217 +#, php-format +msgid "User %s removed from %s." +msgstr "Benutzer %s von %s entfernt." + +#: includes/controller/user_angeltypes_controller.php:225 +#: includes/view/UserAngelTypes_view.php:113 +msgid "Remove angeltype" +msgstr "Engeltyp löschen" + +#: includes/controller/user_angeltypes_controller.php:241 +msgid "You are not allowed to set supporter rights." +msgstr "Du darfst keine Supporterrechte bearbeiten." + +#: includes/controller/user_angeltypes_controller.php:253 +msgid "No supporter update given." +msgstr "Kein Update für Supporterrechte gegeben." + +#: includes/controller/user_angeltypes_controller.php:280 +#, php-format +msgid "Added supporter rights for %s to %s." +msgstr "%s hat %s als Supporter bekommen." + +#: includes/controller/user_angeltypes_controller.php:281 +#, php-format +msgid "Removed supporter rights for %s from %s." +msgstr "%s hat jetzt nicht mehr %s als Supporter." + +#: includes/controller/user_angeltypes_controller.php:292 +#: includes/view/AngelTypes_view.php:258 +#: includes/view/UserAngelTypes_view.php:14 +msgid "Add supporter rights" +msgstr "Supporterrechte geben" + +#: includes/controller/user_angeltypes_controller.php:292 +#: includes/view/AngelTypes_view.php:241 +#: includes/view/UserAngelTypes_view.php:14 +msgid "Remove supporter rights" +msgstr "Supporterrechte entfernen" + +#: includes/controller/user_angeltypes_controller.php:331 +#, php-format +msgid "User %s added to %s." +msgstr "Benutzer %s zu %s hinzugefügt." + +#: includes/controller/user_angeltypes_controller.php:348 +#: includes/view/UserAngelTypes_view.php:142 +msgid "Add user to angeltype" +msgstr "Benutzer zu Engeltyp hinzufügen" + +#: includes/controller/user_angeltypes_controller.php:365 +#, php-format +msgid "You are already a %s." +msgstr "Du bist bereits %s." + +#: includes/controller/user_angeltypes_controller.php:372 +#, php-format +msgid "You joined %s." +msgstr "Du bist %s beigetreten." + +#: includes/controller/user_angeltypes_controller.php:393 +#: includes/view/UserAngelTypes_view.php:166 +#, php-format +msgid "Become a %s" +msgstr "Werde ein %s" + +#: includes/controller/user_driver_licenses_controller.php:26 +#, php-format +msgid "" +"You joined an angeltype which requires a driving license. Please edit your " +"driving license information here: %s." +msgstr "" +"Du bist einem Engeltypen beigetreten, der Führerschein-Infos benötigt. Bitte " +"trage Deine Führerschein-Infos hier ein: %s." + +#: includes/controller/user_driver_licenses_controller.php:27 +msgid "driving license information" +msgstr "Führerschein-Infos" + +#: includes/controller/user_driver_licenses_controller.php:133 +msgid "Your driver license information has been saved." +msgstr "Deine Führerschein-Infos wurden gespeichert." + +#: includes/controller/user_driver_licenses_controller.php:136 +msgid "Please select at least one driving license." +msgstr "Bitte wähle mindestens einen Führerschein-Typen aus." + +#: includes/controller/user_driver_licenses_controller.php:141 +msgid "Your driver license information has been removed." +msgstr "Deine Führerschein-Infos wurden gelöscht." + +#: includes/controller/user_driver_licenses_controller.php:147 +#: includes/view/UserDriverLicenses_view.php:15 +#, php-format +msgid "Edit %s driving license information" +msgstr "Bearbeite die Führerschein-Infos von %s" + +#: includes/controller/user_worklog_controller.php:22 +msgid "Work log entry deleted." +msgstr "Arbeitseinsatz gelöscht." + +#: includes/controller/user_worklog_controller.php:52 +msgid "Work log entry updated." +msgstr "Arbeitseinsatz geändert." + +#: includes/controller/user_worklog_controller.php:81 +msgid "Please enter work date." +msgstr "Bitte Einsatzdatum angeben." + +#: includes/controller/user_worklog_controller.php:87 +msgid "Please enter work hours in format ##[.##]." +msgstr "Bitte Stunden im Format ##[.##| eingeben." + +#: includes/controller/user_worklog_controller.php:93 +msgid "Please enter a comment." +msgstr "Bitte Kommentar angeben." + +#: includes/controller/user_worklog_controller.php:123 +msgid "Work log entry created." +msgstr "Arbeitseinsatz angelegt." + +#: includes/controller/users_controller.php:64 +msgid "You cannot delete yourself." +msgstr "Du kannst Dich nicht selber löschen." + +#: includes/controller/users_controller.php:78 +#: includes/pages/guest_login.php:410 +msgid "Your password is incorrect. Please try it again." +msgstr "Dein Passwort stimmt nicht. Bitte probiere es nochmal." + +#: includes/controller/users_controller.php:87 +msgid "User deleted." +msgstr "Engel gelöscht." + +#: includes/controller/users_controller.php:95 includes/view/User_view.php:154 +#, php-format +msgid "Delete %s" +msgstr "%s löschen" + +#: includes/controller/users_controller.php:165 +msgid "Please enter a valid number of vouchers." +msgstr "Bitte gib eine korrekte Anzahl von Gutscheinen ein." + +#: includes/controller/users_controller.php:172 +msgid "Saved the number of vouchers." +msgstr "Anzahl der Gutscheine gespeichert." + +#: includes/controller/users_controller.php:181 includes/view/User_view.php:178 +#, php-format +msgid "%s's vouchers" +msgstr "Gutschein von %s" + +#: includes/controller/users_controller.php:198 +msgid "User not found." +msgstr "Benutzer nicht gefunden." + +#: includes/controller/users_controller.php:233 +msgid "Enough" +msgstr "Genug" + +#: includes/controller/users_controller.php:299 includes/view/User_view.php:249 +msgid "All users" +msgstr "Alle Benutzer" + +#: includes/controller/users_controller.php:323 +msgid "Token is not correct." +msgstr "Der Token ist nicht in Ordnung." + +#: includes/controller/users_controller.php:336 +#: includes/pages/guest_login.php:138 includes/pages/user_settings.php:112 +msgid "Your passwords don't match." +msgstr "Deine Passwörter stimmen nicht überein." + +#: includes/controller/users_controller.php:340 +#: includes/pages/user_settings.php:110 +msgid "Your password is to short (please use at least 6 characters)." +msgstr "Dein Passwort ist zu kurz (Bitte mindestens 6 Zeichen nutzen)." + +#: includes/controller/users_controller.php:345 +#: includes/pages/user_settings.php:115 +msgid "Password saved." +msgstr "Passwort gespeichert." + +#: includes/controller/users_controller.php:373 +#: includes/controller/users_controller.php:377 +#: includes/pages/guest_login.php:107 includes/pages/user_settings.php:32 +msgid "E-mail address is not correct." +msgstr "Die E-Mail Adresse ist nicht in Ordnung." + +#: includes/controller/users_controller.php:381 +#: includes/pages/guest_login.php:115 includes/pages/user_settings.php:36 +msgid "Please enter your e-mail." +msgstr "Bitte gib Deine E-Mail-Adresse ein." + +#: includes/controller/users_controller.php:388 +#: includes/controller/users_controller.php:424 +msgid "Password recovery" +msgstr "Passwort wiederherstellen" + +#: includes/controller/users_controller.php:390 +#, php-format +msgid "Please visit %s to recover your password." +msgstr "Bitte besuche %s, um Dein Passwort zurückzusetzen" + +#: includes/controller/users_controller.php:394 +msgid "We sent an email containing your password recovery link." +msgstr "" +"Wir haben eine eMail mit einem Link zum Passwort-zurücksetzen geschickt." + +#: includes/helper/email_helper.php:41 +#, php-format +msgid "User %s could not be notified by email due to an error." +msgstr "" +"Aufgrund eines Fehlers konnte dem User %s keine E-Mail gesendet werden." + +#: includes/mailer/shifts_mailer.php:17 +msgid "A Shift you are registered on has changed:" +msgstr "Eine deiner Schichten hat sich geändert:" + +#: includes/mailer/shifts_mailer.php:21 +#, php-format +msgid "* Shift type changed from %s to %s" +msgstr "* Schichttyp von %s in %s geändert" + +#: includes/mailer/shifts_mailer.php:26 +#, php-format +msgid "* Shift title changed from %s to %s" +msgstr "* Schicht Titel von %s nach %s geändert" + +#: includes/mailer/shifts_mailer.php:32 +#, php-format +msgid "* Shift Start changed from %s to %s" +msgstr "* Schicht Beginn von %s nach %s geändert" + +#: includes/mailer/shifts_mailer.php:41 +#, php-format +msgid "* Shift End changed from %s to %s" +msgstr "* Schicht Ende von %s nach %s geändert" + +#: includes/mailer/shifts_mailer.php:49 +#, php-format +msgid "* Shift Location changed from %s to %s" +msgstr "* Schicht Ort von %s to %s geändert" + +#: includes/mailer/shifts_mailer.php:59 +msgid "The updated Shift:" +msgstr "Die aktualisierte Schicht:" + +#: includes/mailer/shifts_mailer.php:71 +msgid "Your Shift has changed" +msgstr "Deine Schicht hat sich geändert" + +#: includes/mailer/shifts_mailer.php:87 +msgid "A Shift you are registered on was deleted:" +msgstr "Eine deiner Schichten wurde gelöscht:" + +#: includes/mailer/shifts_mailer.php:97 +msgid "Your Shift was deleted" +msgstr "Deine Schicht wurde gelöscht" + +#: includes/mailer/shifts_mailer.php:114 +msgid "You have been assigned to a Shift:" +msgstr "Du wurdest in eine Schicht eingetragen:" + +#: includes/mailer/shifts_mailer.php:120 +msgid "Assigned to Shift" +msgstr "In Schicht eingetragen" + +#: includes/mailer/shifts_mailer.php:135 +msgid "You have been removed from a Shift:" +msgstr "Du wurdest aus einer Schicht ausgetragen:" + +#: includes/mailer/shifts_mailer.php:141 +msgid "Removed from Shift" +msgstr "Von Schicht ausgetragen" + +#: includes/mailer/users_mailer.php:13 +msgid "Your account has been deleted" +msgstr "Dein Konto wurde gelöscht." + +#: includes/mailer/users_mailer.php:15 +#, php-format +msgid "" +"Your %s account has been deleted. If you have any questions regarding your " +"account deletion, please contact heaven." +msgstr "" +"Dein %s-Konto wurde gelöscht. Wenn Du dazu Fragen hast, kontaktiere bitte " +"den Himmel." + +#: includes/pages/admin_active.php:13 includes/sys_menu.php:104 +msgid "Active angels" +msgstr "Aktive Engel" + +#: includes/pages/admin_active.php:42 +#, php-format +msgid "" +"At least %s angels are forced to be active. The number has to be greater." +msgstr "" +"Mindestens %s Engel werden als aktiv gekennzeichnet. Die Nummer muss größer " +"sein." + +#: includes/pages/admin_active.php:48 +msgid "Please enter a number of angels to be marked as active." +msgstr "" +"Bitte gib eine Anzahl an Engeln ein, die als Aktiv markiert werden sollen." + +#: includes/pages/admin_active.php:95 +msgid "Marked angels." +msgstr "Engel wurden markiert." + +#: includes/pages/admin_active.php:98 includes/pages/admin_rooms.php:155 +#: includes/pages/admin_rooms.php:191 includes/pages/admin_shifts.php:321 +#: includes/view/UserAngelTypes_view.php:147 +#: includes/view/UserWorkLog_view.php:64 includes/view/UserWorkLog_view.php:82 +#: includes/view/User_view.php:157 includes/view/User_view.php:181 +msgid "back" +msgstr "zurück" + +#: includes/pages/admin_active.php:99 +msgid "apply" +msgstr "anwenden" + +#: includes/pages/admin_active.php:112 +msgid "Angel has been marked as active." +msgstr "Engel wurde als aktiv markiert." + +#: includes/pages/admin_active.php:114 includes/pages/admin_active.php:125 +#: includes/pages/admin_active.php:147 includes/pages/admin_arrive.php:44 +#: includes/pages/admin_arrive.php:62 +msgid "Angel not found." +msgstr "Engel nicht gefunden." + +#: includes/pages/admin_active.php:123 +msgid "Angel has been marked as not active." +msgstr "Engel wurde als nicht aktiv markiert." + +#: includes/pages/admin_active.php:134 +msgid "Angel has got a t-shirt." +msgstr "Engel hat ein T-Shirt bekommen." + +#: includes/pages/admin_active.php:145 +msgid "Angel has got no t-shirt." +msgstr "Engel hat kein T-Shirt bekommen." + +#: includes/pages/admin_active.php:235 +msgid "set active" +msgstr "setze aktiv" + +#: includes/pages/admin_active.php:248 +msgid "remove active" +msgstr "entferne aktiv" + +#: includes/pages/admin_active.php:261 +msgid "got t-shirt" +msgstr "hat t-shirt" + +#: includes/pages/admin_active.php:274 +msgid "remove t-shirt" +msgstr "entferne t-shirt" + +#: includes/pages/admin_active.php:299 includes/pages/admin_arrive.php:202 +#: includes/pages/admin_arrive.php:217 includes/pages/admin_arrive.php:232 +#: includes/view/AngelTypes_view.php:419 includes/view/AngelTypes_view.php:427 +#: includes/view/User_view.php:239 +msgid "Sum" +msgstr "Summe" + +#: includes/pages/admin_active.php:305 +msgid "Search angel:" +msgstr "Suche Engel:" + +#: includes/pages/admin_active.php:306 +msgid "Show all shifts" +msgstr "Alle Schichten anzeigen" + +#: includes/pages/admin_active.php:307 includes/pages/admin_arrive.php:178 +#: includes/pages/admin_arrive.php:179 includes/pages/admin_free.php:105 +#: includes/pages/admin_free.php:107 includes/pages/admin_log.php:35 +#: includes/pages/admin_log.php:36 +msgid "Search" +msgstr "Suche" + +#: includes/pages/admin_active.php:310 +msgid "How much angels should be active?" +msgstr "Wie viele Engel sollten aktiv sein?" + +#: includes/pages/admin_active.php:311 includes/pages/admin_shifts.php:309 +#: includes/pages/admin_shifts.php:453 +msgid "Preview" +msgstr "Vorschau" + +#: includes/pages/admin_active.php:315 includes/pages/admin_arrive.php:182 +msgid "Nickname" +msgstr "Nick" + +#: includes/pages/admin_active.php:316 includes/pages/admin_active.php:326 +#: includes/view/User_view.php:265 +msgid "Size" +msgstr "Größe" + +#: includes/pages/admin_active.php:317 includes/pages/user_shifts.php:11 +#: includes/sys_menu.php:88 includes/view/AngelTypes_view.php:352 +#: includes/view/Rooms_view.php:39 includes/view/User_view.php:659 +msgid "Shifts" +msgstr "Schichten" + +#: includes/pages/admin_active.php:318 includes/pages/admin_shifts.php:415 +msgid "Length" +msgstr "Länge" + +#: includes/pages/admin_active.php:319 +msgid "Active?" +msgstr "Aktiv?" + +#: includes/pages/admin_active.php:320 includes/view/User_view.php:263 +msgid "Forced" +msgstr "Gezwungen" + +#: includes/pages/admin_active.php:321 +msgid "T-shirt?" +msgstr "T-Shirt?" + +#: includes/pages/admin_active.php:324 +msgid "Shirt statistics" +msgstr "T-Shirt Statistik" + +#: includes/pages/admin_active.php:327 +msgid "Needed shirts" +msgstr "Benötigte T-Shirts" + +#: includes/pages/admin_active.php:298 +msgid "Given shirts" +msgstr "Ausgegebene T-Shirts" + +#: includes/pages/admin_arrive.php:10 includes/sys_menu.php:103 +msgid "Arrived angels" +msgstr "Angekommene Engel" + +#: includes/pages/admin_arrive.php:41 +msgid "Reset done. Angel has not arrived." +msgstr "Zurückgesetzt. Engel ist nicht angekommen." + +#: includes/pages/admin_arrive.php:59 +msgid "Angel has been marked as arrived." +msgstr "Engel wurde als angekommen markiert." + +#: includes/pages/admin_arrive.php:101 includes/view/UserAngelTypes_view.php:29 +#: includes/view/UserAngelTypes_view.php:57 +#: includes/view/UserAngelTypes_view.php:75 +#: includes/view/UserAngelTypes_view.php:99 +#: includes/view/UserAngelTypes_view.php:123 +msgid "yes" +msgstr "Ja" + +#: includes/pages/admin_arrive.php:106 +msgid "reset" +msgstr "zurücksetzen" + +#: includes/pages/admin_arrive.php:106 includes/pages/admin_arrive.php:193 +#: includes/pages/admin_arrive.php:208 includes/pages/admin_arrive.php:223 +#: includes/view/User_view.php:619 +msgid "arrived" +msgstr "angekommen" + +#: includes/pages/admin_arrive.php:183 +msgid "Planned arrival" +msgstr "Geplanter Ankunftstag" + +#: includes/pages/admin_arrive.php:184 +msgid "Arrived?" +msgstr "Angekommen?" + +#: includes/pages/admin_arrive.php:185 +msgid "Arrival date" +msgstr "Ankunftsdatum" + +#: includes/pages/admin_arrive.php:186 +msgid "Planned departure" +msgstr "Geplante Abreise" + +#: includes/pages/admin_arrive.php:191 +msgid "Planned arrival statistics" +msgstr "Geplante Ankunfts-Statistik" + +#: includes/pages/admin_arrive.php:194 includes/pages/admin_arrive.php:209 +#: includes/pages/admin_arrive.php:224 +msgid "arrived sum" +msgstr "Summe angekommen" + +#: includes/pages/admin_arrive.php:200 includes/pages/admin_arrive.php:215 +#: includes/pages/admin_arrive.php:230 includes/pages/admin_news.php:45 +#: includes/pages/user_messages.php:118 +msgid "Date" +msgstr "Datum" + +#: includes/pages/admin_arrive.php:201 includes/pages/admin_arrive.php:216 +#: includes/pages/admin_arrive.php:231 +msgid "Count" +msgstr "Anzahl" + +#: includes/pages/admin_arrive.php:206 +msgid "Arrival statistics" +msgstr "Ankunfts-Statistik" + +#: includes/pages/admin_arrive.php:221 +msgid "Planned departure statistics" +msgstr "Geplante Abreise-Statistik" + +#: includes/pages/admin_free.php:12 includes/sys_menu.php:106 +msgid "Free angels" +msgstr "Freie Engel" + +#: includes/pages/admin_free.php:29 +msgid "Alle" +msgstr "All" + +#: includes/pages/admin_free.php:106 includes/view/ShiftEntry_view.php:91 +#: includes/view/ShiftTypes_view.php:61 +#: includes/view/UserAngelTypes_view.php:152 +msgid "Angeltype" +msgstr "Engeltyp" + +#: includes/pages/admin_free.php:111 +msgid "Only confirmed" +msgstr "Nur bestätigte" + +#: includes/pages/admin_free.php:112 includes/pages/guest_login.php:289 +#: includes/pages/guest_login.php:447 includes/view/AngelTypes_view.php:293 +#: includes/view/AngelTypes_view.php:306 includes/view/User_view.php:38 +#: includes/view/User_view.php:126 includes/view/User_view.php:255 +msgid "Nick" +msgstr "Nick" + +#: includes/pages/admin_free.php:113 +msgid "Next shift" +msgstr "Nächste Schicht" + +#: includes/pages/admin_free.php:114 +msgid "Last shift" +msgstr "Letzte Schicht" + +#: includes/pages/admin_free.php:115 includes/pages/guest_login.php:349 +#: includes/view/AngelTypes_view.php:113 includes/view/AngelTypes_view.php:294 +#: includes/view/AngelTypes_view.php:307 includes/view/AngelTypes_view.php:476 +#: includes/view/User_view.php:56 includes/view/User_view.php:258 +msgid "DECT" +msgstr "DECT" + +#: includes/pages/admin_free.php:116 includes/pages/guest_login.php:293 +#: includes/view/AngelTypes_view.php:114 includes/view/AngelTypes_view.php:477 +#: includes/view/User_view.php:58 includes/view/User_view.php:791 +msgid "E-Mail" +msgstr "E-Mail" + +#: includes/pages/admin_groups.php:10 includes/sys_menu.php:111 +msgid "Grouprights" +msgstr "Gruppenrechte" + +#: includes/pages/admin_groups.php:52 includes/pages/admin_import.php:184 +#: includes/pages/admin_import.php:188 includes/pages/admin_rooms.php:161 +#: includes/pages/admin_rooms.php:207 includes/view/AngelTypes_view.php:81 +#: includes/view/AngelTypes_view.php:82 includes/view/AngelTypes_view.php:112 +#: includes/view/AngelTypes_view.php:475 includes/view/AngelTypes_view.php:499 +#: includes/view/ShiftTypes_view.php:60 includes/view/ShiftTypes_view.php:140 +#: includes/view/User_view.php:257 +msgid "Name" +msgstr "Name" + +#: includes/pages/admin_groups.php:53 +msgid "Privileges" +msgstr "Privilegien" + +#: includes/pages/admin_groups.php:102 +msgid "Edit group" +msgstr "Gruppe bearbeiten" + +#: includes/pages/admin_import.php:8 includes/pages/admin_rooms.php:162 +#: includes/pages/admin_rooms.php:208 includes/sys_menu.php:112 +msgid "Frab import" +msgstr "Frab Import" + +#: includes/pages/admin_import.php:39 +msgid "Webserver has no write-permission on import directory." +msgstr "Der Webserver hat keine Schreibrechte für das Verzeichnis import." + +#: includes/pages/admin_import.php:64 includes/pages/admin_import.php:143 +#: includes/pages/admin_import.php:242 includes/pages/admin_shifts.php:58 +#: includes/pages/admin_shifts.php:64 +msgid "Please select a shift type." +msgstr "Bitte einen Schichttyp wählen." + +#: includes/pages/admin_import.php:72 includes/pages/admin_import.php:150 +#: includes/pages/admin_import.php:249 +msgid "Please enter an amount of minutes to add to a talk's begin." +msgstr "" +"Bitte gib eine Anzahl Minuten ein, die vor dem Talk-Beginn hinzugefügt " +"werden sollen." + +#: includes/pages/admin_import.php:79 includes/pages/admin_import.php:157 +#: includes/pages/admin_import.php:256 +msgid "Please enter an amount of minutes to add to a talk's end." +msgstr "" +"Bitte gib eine Anzahl Minuten ein, die nach dem Talk-Ende hinzugefügt werden " +"sollen." + +#: includes/pages/admin_import.php:87 +msgid "No valid xml/xcal file provided." +msgstr "Keine valide xml/xcal Datei hochgeladen." + +#: includes/pages/admin_import.php:92 +msgid "File upload went wrong." +msgstr "Das Hochladen der Datei ist schiefgegangen." + +#: includes/pages/admin_import.php:96 +msgid "Please provide some data." +msgstr "Bitte lade eine Datei hoch." + +#: includes/pages/admin_import.php:111 includes/pages/admin_import.php:172 +#: includes/pages/admin_import.php:292 +msgid "File Upload" +msgstr "Datei hochladen" + +#: includes/pages/admin_import.php:113 includes/pages/admin_import.php:174 +#: includes/pages/admin_import.php:294 +msgid "Validation" +msgstr "Überprüfen" + +#: includes/pages/admin_import.php:115 includes/pages/admin_import.php:127 +#: includes/pages/admin_import.php:176 includes/pages/admin_import.php:218 +#: includes/pages/admin_import.php:296 +msgid "Import" +msgstr "Importieren" + +#: includes/pages/admin_import.php:121 +msgid "" +"This import will create/update/delete rooms and shifts by given FRAB-export " +"file. The needed file format is xcal." +msgstr "" +"Dieser Import erzeugt, ändert und löscht Räume und Schichten anhand einer " +"FRAB-Export Datei. Das benötigte Format ist xcal." + +#: includes/pages/admin_import.php:124 +msgid "Add minutes to start" +msgstr "Minuten vor Talk-Beginn hinzufügen" + +#: includes/pages/admin_import.php:125 +msgid "Add minutes to end" +msgstr "Minuten nach Talk-Ende hinzufügen" + +#: includes/pages/admin_import.php:126 +msgid "xcal-File (.xcal)" +msgstr "xcal-Datei (.xcal)" + +#: includes/pages/admin_import.php:136 includes/pages/admin_import.php:231 +msgid "Missing import file." +msgstr "Import-Datei nicht vorhanden." + +#: includes/pages/admin_import.php:183 +msgid "Rooms to create" +msgstr "Anzulegende Räume" + +#: includes/pages/admin_import.php:187 +msgid "Rooms to delete" +msgstr "Zu löschende Räume" + +#: includes/pages/admin_import.php:191 +msgid "Shifts to create" +msgstr "Anzulegende Schichten" + +#: includes/pages/admin_import.php:193 includes/pages/admin_import.php:202 +#: includes/pages/admin_import.php:211 +msgid "Day" +msgstr "Tag" + +#: includes/pages/admin_import.php:194 includes/pages/admin_import.php:203 +#: includes/pages/admin_import.php:212 includes/pages/admin_shifts.php:408 +#: includes/view/Shifts_view.php:25 +msgid "Start" +msgstr "Beginn" + +#: includes/pages/admin_import.php:195 includes/pages/admin_import.php:204 +#: includes/pages/admin_import.php:213 includes/pages/admin_shifts.php:409 +#: includes/view/Shifts_view.php:33 +msgid "End" +msgstr "Ende" + +#: includes/pages/admin_import.php:196 includes/pages/admin_import.php:205 +#: includes/pages/admin_import.php:214 +msgid "Shift type" +msgstr "Schichttyp" + +#: includes/pages/admin_import.php:198 includes/pages/admin_import.php:207 +#: includes/pages/admin_import.php:216 includes/pages/admin_shifts.php:405 +msgid "Room" +msgstr "Raum" + +#: includes/pages/admin_import.php:200 +msgid "Shifts to update" +msgstr "Zu aktualisierende Schichten" + +#: includes/pages/admin_import.php:209 +msgid "Shifts to delete" +msgstr "Zu löschende Schichten" + +#: includes/pages/admin_import.php:297 +msgid "It's done!" +msgstr "Erledigt!" + +#: includes/pages/admin_log.php:10 includes/sys_menu.php:113 +msgid "Log" +msgstr "Log" + +#: includes/pages/admin_news.php:18 +msgid "Edit news entry" +msgstr "News-Eintrag bearbeiten" + +#: includes/pages/admin_news.php:38 +msgid "" +"This message contains HTML. After saving the post some formatting will be " +"lost!" +msgstr "" +"Diese Nachricht beinhaltet HTML. Wenn du sie speicherst gehen diese " +"Formatierungen verloren!" + +#: includes/pages/admin_news.php:46 +msgid "Author" +msgstr "Autor" + +#: includes/pages/admin_news.php:47 includes/pages/user_news.php:271 +msgid "Subject" +msgstr "Betreff" + +#: includes/pages/admin_news.php:48 includes/pages/user_messages.php:121 +#: includes/pages/user_news.php:183 includes/pages/user_news.php:272 +msgid "Message" +msgstr "Nachricht" + +#: includes/pages/admin_news.php:49 includes/pages/user_news.php:273 +msgid "Meeting" +msgstr "Treffen" + +#: includes/pages/admin_news.php:58 includes/pages/admin_rooms.php:195 +#: includes/view/User_view.php:165 +msgid "Delete" +msgstr "löschen" + +#: includes/pages/admin_news.php:88 +msgid "News entry updated." +msgstr "News-Eintrag gespeichert." + +#: includes/pages/admin_news.php:95 +msgid "News entry deleted." +msgstr "News-Eintrag gelöscht." + +#: includes/pages/admin_questions.php:11 includes/sys_menu.php:107 +msgid "Answer questions" +msgstr "Fragen beantworten" + +#: includes/pages/admin_questions.php:29 +msgid "There are unanswered questions!" +msgstr "Es gibt unbeantwortete Fragen!" + +#: includes/pages/admin_questions.php:82 +msgid "Unanswered questions" +msgstr "Unbeantwortete Fragen" + +#: includes/pages/admin_questions.php:84 includes/pages/admin_questions.php:91 +msgid "From" +msgstr "Von" + +#: includes/pages/admin_questions.php:85 includes/pages/admin_questions.php:92 +#: includes/view/Questions_view.php:30 includes/view/Questions_view.php:35 +msgid "Question" +msgstr "Frage" + +#: includes/pages/admin_questions.php:86 includes/pages/admin_questions.php:94 +#: includes/view/Questions_view.php:37 +msgid "Answer" +msgstr "Antwort" + +#: includes/pages/admin_questions.php:89 includes/view/Questions_view.php:33 +msgid "Answered questions" +msgstr "Beantwortete Fragen" + +#: includes/pages/admin_questions.php:93 includes/view/Questions_view.php:36 +msgid "Answered by" +msgstr "Antwort von" + +#: includes/pages/admin_rooms.php:7 includes/pages/user_shifts.php:232 +#: includes/sys_menu.php:110 includes/sys_menu.php:164 +msgid "Rooms" +msgstr "Räume" + +#: includes/pages/admin_rooms.php:82 +msgid "This name is already in use." +msgstr "Dieser Name ist bereits vergeben." + +#: includes/pages/admin_rooms.php:113 +#, php-format +msgid "Please enter needed angels for type %s." +msgstr "Bitte gib die Anzahl der benötigten Engel vom Typ %s an." + +#: includes/pages/admin_rooms.php:142 +msgid "Room saved." +msgstr "Raum gespeichert." + +#: includes/pages/admin_rooms.php:163 +msgid "Map URL" +msgstr "Karten URL" + +#: includes/pages/admin_rooms.php:164 +msgid "The map url is used to display an iframe on the room page." +msgstr "" +"Die Karten URL wird benutzt um auf der Raum-Seite ein iframe anzuzeigen." + +#: includes/pages/admin_rooms.php:165 includes/view/AngelTypes_view.php:105 +#: includes/view/AngelTypes_view.php:398 includes/view/Rooms_view.php:24 +#: includes/view/ShiftTypes_view.php:62 includes/view/ShiftTypes_view.php:100 +#: includes/view/Shifts_view.php:151 +msgid "Description" +msgstr "Beschreibung" + +#: includes/pages/admin_rooms.php:166 includes/view/AngelTypes_view.php:106 +#: includes/view/ShiftTypes_view.php:63 +msgid "Please use markdown for the description." +msgstr "Bitte benutze Markdown für die Beschreibung." + +#: includes/pages/admin_rooms.php:171 includes/view/PublicDashboard_view.php:26 +msgid "Needed angels:" +msgstr "Benötigte Engel:" + +#: includes/pages/admin_rooms.php:185 +#, php-format +msgid "Room %s deleted." +msgstr "Raum %s gelöscht." + +#: includes/pages/admin_rooms.php:193 +#, php-format +msgid "Do you want to delete room %s?" +msgstr "Möchest Du den Raum %s wirklich löschen?" + +#: includes/pages/admin_rooms.php:203 +msgid "add" +msgstr "Neu" + +#: includes/pages/admin_rooms.php:209 includes/view/Rooms_view.php:31 +msgid "Map" +msgstr "Karte" + +#: includes/pages/admin_shifts.php:10 includes/sys_menu.php:109 +msgid "Create shifts" +msgstr "Schichten erstellen" + +#: includes/pages/admin_shifts.php:80 +msgid "Please select a location." +msgstr "Bitte einen Ort auswählen." + +#: includes/pages/admin_shifts.php:87 +msgid "Please select a start time." +msgstr "Bitte eine Startzeit auswählen." + +#: includes/pages/admin_shifts.php:94 +msgid "Please select an end time." +msgstr "Bitte eine Endzeit auswählen." + +#: includes/pages/admin_shifts.php:99 +msgid "The shifts end has to be after its start." +msgstr "Die Endzeit muss nach der Startzeit liegen." + +#: includes/pages/admin_shifts.php:111 +msgid "Please enter a shift duration in minutes." +msgstr "Gib bitte eine Schichtlänge in Minuten ein." + +#: includes/pages/admin_shifts.php:128 +msgid "Please split the shift-change hours by colons." +msgstr "Trenne die Schichtwechselstunden mit einem Komma." + +#: includes/pages/admin_shifts.php:133 +msgid "Please select a mode." +msgstr "Bitte einen Modus auswählen." + +#: includes/pages/admin_shifts.php:146 +#, php-format +msgid "Please check the needed angels for team %s." +msgstr "Bitte gib die Anzahl der benötigten Engel vom Team %s an." + +#: includes/pages/admin_shifts.php:152 +msgid "There are 0 angels needed. Please enter the amounts of needed angels." +msgstr "Es werden 0 Engel benötigt. Bitte ändere das." + +#: includes/pages/admin_shifts.php:156 +msgid "Please select a mode for needed angels." +msgstr "Bitte wähle einen Modus für benötigte Engel." + +#: includes/pages/admin_shifts.php:160 +msgid "Please select needed angels." +msgstr "Bitte wähle benötigte Engel." + +#: includes/pages/admin_shifts.php:323 +msgid "Time and location" +msgstr "Zeit und Ort" + +#: includes/pages/admin_shifts.php:324 +msgid "Type and title" +msgstr "Typ und Titel" + +#: includes/pages/admin_shifts.php:410 +msgid "Mode" +msgstr "Modus" + +#: includes/pages/admin_shifts.php:411 +msgid "Create one shift" +msgstr "Eine Schicht erstellen" + +#: includes/pages/admin_shifts.php:412 +msgid "Create multiple shifts" +msgstr "Mehrere Schichten erstellen" + +#: includes/pages/admin_shifts.php:422 +msgid "Create multiple shifts with variable length" +msgstr "Erstelle mehrere Schichten mit unterschiedlicher Länge" + +#: includes/pages/admin_shifts.php:428 +msgid "Shift change hours" +msgstr "Schichtwechsel-Stunden" + +#: includes/pages/admin_shifts.php:438 +msgid "Take needed angels from room settings" +msgstr "Übernehme benötigte Engel von den Raum-Einstellungen" + +#: includes/pages/admin_shifts.php:444 +msgid "The following angels are needed" +msgstr "Die folgenden Engel werden benötigt" + +#: includes/pages/admin_user.php:11 includes/sys_menu.php:105 +msgid "All Angels" +msgstr "Engelliste" + +#: includes/pages/admin_user.php:32 +msgid "This user does not exist." +msgstr "Benutzer existiert nicht." + +#: includes/pages/admin_user.php:69 includes/pages/guest_login.php:320 +#: includes/view/User_view.php:77 +msgid "Please select..." +msgstr "Bitte auswählen..." + +#: includes/pages/admin_user.php:74 includes/pages/admin_user.php:81 +#: includes/view/AngelTypes_view.php:84 includes/view/AngelTypes_view.php:91 +#: includes/view/AngelTypes_view.php:96 includes/view/AngelTypes_view.php:103 +msgid "Yes" +msgstr "Ja" + +#: includes/pages/admin_user.php:75 includes/pages/admin_user.php:83 +#: includes/view/AngelTypes_view.php:84 includes/view/AngelTypes_view.php:91 +#: includes/view/AngelTypes_view.php:97 includes/view/AngelTypes_view.php:103 +msgid "No" +msgstr "Nein" + +#: includes/pages/admin_user.php:93 +msgid "Force active" +msgstr "Aktiv erzwingen" + +#: includes/pages/admin_user.php:110 +msgid "" +"Please visit the angeltypes page or the users profile to manage users " +"angeltypes." +msgstr "" +"Bitte benutze die Engeltypen-Seite um die Engeltypen des Users zu verwalten." + +#: includes/pages/admin_user.php:308 +msgid "Edit user" +msgstr "User bearbeiten" + +#: includes/pages/guest_credits.php:8 +msgid "Credits" +msgstr "Credits" + +#: includes/pages/guest_login.php:16 includes/pages/guest_login.php:442 +#: includes/pages/guest_login.php:449 includes/view/User_view.php:124 +#: includes/view/User_view.php:128 resources/views/layouts/parts/navbar.twig:45 +msgid "Login" +msgstr "Login" + +#: includes/pages/guest_login.php:24 includes/pages/guest_login.php:366 +#: resources/views/layouts/parts/navbar.twig:41 +msgid "Register" +msgstr "Registrieren" + +#: includes/pages/guest_login.php:32 includes/sys_menu.php:69 +msgid "Logout" +msgstr "Logout" + +#: includes/pages/guest_login.php:76 includes/pages/guest_login.php:495 +msgid "Registration is disabled." +msgstr "Registrierung ist abgeschaltet." + +#: includes/pages/guest_login.php:92 +msgid "Please enter a valid nick." +msgstr "Gib bitte einen erlaubten Nick an." + +#: includes/pages/guest_login.php:92 includes/pages/guest_login.php:290 +#: includes/view/User_view.php:39 +msgid "" +"Use up to 23 letters, numbers, connecting punctuations or spaces for your " +"nickname." +msgstr "" +"Verwende bis zu 23 Buchstaben, Zahlen, verbindende Schriftzeichen (.-_) oder " +"Leerzeichen für deinen Nick." + +#: includes/pages/guest_login.php:96 +#, php-format +msgid "Your nick "%s" already exists." +msgstr "Der Nick "%s" existiert schon." + +#: includes/pages/guest_login.php:100 includes/pages/guest_login.php:422 +msgid "Please enter a nickname." +msgstr "Gib bitte einen Nick an." + +#: includes/pages/guest_login.php:111 +msgid "E-mail address is already used by another user." +msgstr "Die E-Mail Adresse wurde bereits von einem anderen User benutzt." + +#: includes/pages/guest_login.php:131 +msgid "Please select your shirt size." +msgstr "Bitte wähle Deine T-Shirt Größe." + +#: includes/pages/guest_login.php:143 +#, php-format +msgid "Your password is too short (please use at least %s characters)." +msgstr "Dein Passwort ist zu kurz (Bitte mindestens %s Zeichen nutzen)." + +#: includes/pages/guest_login.php:154 includes/pages/guest_login.php:158 +#: includes/pages/user_settings.php:54 +msgid "" +"Please enter your planned date of arrival. It should be after the buildup " +"start date and before teardown end date." +msgstr "" +"Bitte gib Dein geplantes Ankunftsdatum an. Es sollte nach dem Aufbaubeginn " +"und vor dem Abbauende liegen." + +#: includes/pages/guest_login.php:180 includes/pages/user_settings.php:79 +msgid "For dect numbers are only 40 digits allowed." +msgstr "Die DECT Nummer darf nur 40 Zeichen lang sein." + +#: includes/pages/guest_login.php:252 +msgid "Angel registration successful!" +msgstr "Engel-Registrierung erfolgreich!" + +#: includes/pages/guest_login.php:281 +msgid "" +"By completing this form you're registering as a Chaos-Angel. This script " +"will create you an account in the angel task scheduler." +msgstr "" +"Mit diesem Formular registrierst Du Dich als Engel. Du bekommst ein Konto in " +"der Engel-Aufgabenverwaltung." + +#: includes/pages/guest_login.php:297 includes/view/User_view.php:62 +#, php-format +msgid "The %s is allowed to send me an email (e.g. when my shifts change)" +msgstr "Das %s darf mir E-Mails senden (z.B. wenn sich meine Schichten ändern)" + +#: includes/pages/guest_login.php:304 includes/view/User_view.php:69 +msgid "Humans are allowed to send me an email (e.g. for ticket vouchers)" +msgstr "Menschen dürfen mir eine E-Mail senden (z.B. für Ticket Gutscheine)" + +#: includes/pages/guest_login.php:313 includes/view/User_view.php:44 +msgid "Planned date of arrival" +msgstr "Geplanter Ankunftstag" + +#: includes/pages/guest_login.php:319 includes/view/User_view.php:74 +msgid "Shirt size" +msgstr "T-Shirt Größe" + +#: includes/pages/guest_login.php:325 includes/pages/guest_login.php:448 +#: includes/view/User_view.php:127 includes/view/User_view.php:808 +msgid "Password" +msgstr "Passwort" + +#: includes/pages/guest_login.php:328 includes/view/User_view.php:809 +msgid "Confirm password" +msgstr "Passwort wiederholen" + +#: includes/pages/guest_login.php:333 +msgid "What do you want to do?" +msgstr "Was möchtest Du machen?" + +#: includes/pages/guest_login.php:336 +msgid "Description of job types" +msgstr "Beschreibung der Aufgaben" + +#: includes/pages/guest_login.php:343 +msgid "" +"Restricted angel types need will be confirmed later by a supporter. You can " +"change your selection in the options section." +msgstr "" +"Beschränkte Engeltypen müssen später von einem Supporter freigeschaltet " +"werden. Du kannst Deine Auswahl später in den Einstellungen ändern." + +#: includes/pages/guest_login.php:352 includes/view/User_view.php:57 +msgid "Mobile" +msgstr "Handy" + +#: includes/pages/guest_login.php:357 includes/view/User_view.php:41 +msgid "First name" +msgstr "Vorname" + +#: includes/pages/guest_login.php:360 includes/view/User_view.php:40 +msgid "Last name" +msgstr "Nachname" + +#: includes/pages/guest_login.php:363 includes/view/User_view.php:37 +msgid "Entry required!" +msgstr "Pflichtfeld!" + +#: includes/pages/guest_login.php:414 +msgid "auth.no-password" +msgstr "Gib bitte ein Passwort ein." + +#: includes/pages/guest_login.php:418 +msgid "auth.not-found" +msgstr "" +"Es wurde kein Engel gefunden. Probiere es bitte noch einmal. Wenn das Problem " +"weiterhin besteht, melde dich im Himmel." + +#: includes/pages/guest_login.php:451 includes/view/User_view.php:130 +msgid "auth.no-nickname" +msgstr "Gib bitte einen Nick an." + +#: includes/pages/guest_login.php:481 +#: includes/view/User_view.php:122 +msgid "I forgot my password" +msgstr "Passwort vergessen" + +#: includes/pages/guest_login.php:456 includes/view/User_view.php:132 +msgid "Please note: You have to activate cookies!" +msgstr "Hinweis: Cookies müssen aktiviert sein!" + +#: includes/pages/guest_login.php:467 includes/view/User_view.php:136 +msgid "What can I do?" +msgstr "Was kann ich machen?" + +#: includes/pages/guest_login.php:468 includes/view/User_view.php:137 +msgid "Please read about the jobs you can do to help us." +msgstr "" +"Bitte informiere Dich über die Tätigkeiten bei denen Du uns helfen kannst." + +#: includes/pages/guest_login.php:488 +msgid "Please sign up, if you want to help us!" +msgstr "Bitte registriere Dich, wenn Du helfen möchtest!" + +#: includes/pages/user_messages.php:11 +msgid "Messages" +msgstr "Nachrichten" + +#: includes/pages/user_messages.php:49 +msgid "Select recipient..." +msgstr "Empfänger auswählen..." + +#: includes/pages/user_messages.php:98 +msgid "mark as read" +msgstr "als gelesen markieren" + +#: includes/pages/user_messages.php:105 +msgid "delete message" +msgstr "Nachricht löschen" + +#: includes/pages/user_messages.php:114 +#, php-format +msgid "Hello %s, here can you leave messages for other angels" +msgstr "Hallo %s, hier kannst Du anderen Engeln Nachrichten schreiben." + +#: includes/pages/user_messages.php:117 +msgid "New" +msgstr "Neu" + +#: includes/pages/user_messages.php:119 +msgid "Transmitted" +msgstr "Gesendet" + +#: includes/pages/user_messages.php:120 +msgid "Recipient" +msgstr "Empfänger" + +#: includes/pages/user_messages.php:132 includes/pages/user_messages.php:154 +msgid "Incomplete call, missing Message ID." +msgstr "Unvollständiger Aufruf, fehlende Nachrichten ID." + +#: includes/pages/user_messages.php:146 includes/pages/user_messages.php:165 +msgid "No Message found." +msgstr "Keine Nachricht gefunden." + +#: includes/pages/user_messages.php:173 +msgid "Transmitting was terminated with an Error." +msgstr "Übertragung wurde mit einem Fehler abgebrochen." + +#: includes/pages/user_messages.php:178 +msgid "Wrong action." +msgstr "Falsche Aktion." + +#: includes/pages/user_myshifts.php:11 includes/view/Shifts_view.php:141 +msgid "My shifts" +msgstr "Meine Schichten" + +#: includes/pages/user_myshifts.php:39 +msgid "Key changed." +msgstr "Key geändert." + +#: includes/pages/user_myshifts.php:42 includes/view/User_view.php:646 +msgid "Reset API key" +msgstr "API-Key zurücksetzen" + +#: includes/pages/user_myshifts.php:44 +msgid "" +"If you reset the key, the url to your iCal- and JSON-export and your atom " +"feed changes! You have to update it in every application using one of these " +"exports." +msgstr "" +"Wenn du den API-Key zurücksetzt, ändert sich die URL zu deinem iCal-, JSON-" +"Export und Atom Feed! Du musst diesen überall ändern, wo er in Benutzung ist." + +#: includes/pages/user_myshifts.php:47 +msgid "Continue" +msgstr "Fortfahren" + +#: includes/pages/user_myshifts.php:86 +msgid "Please enter a freeload comment!" +msgstr "Gib bitte einen Schwänz-Kommentar ein!" + +#: includes/pages/user_myshifts.php:108 +msgid "Shift saved." +msgstr "Schicht gespeichert." + +#: includes/pages/user_news.php:11 +msgid "News comments" +msgstr "News Kommentare" + +#: includes/pages/user_news.php:19 includes/sys_menu.php:86 +msgid "News" +msgstr "News" + +#: includes/pages/user_news.php:27 includes/sys_menu.php:87 +msgid "Meetings" +msgstr "Treffen" + +#: includes/pages/user_news.php:119 +msgid "Comments" +msgstr "Kommentare" + +#: includes/pages/user_news.php:160 includes/pages/user_news.php:229 +msgid "Entry saved." +msgstr "Eintrag gespeichert." + +#: includes/pages/user_news.php:181 +msgid "New Comment:" +msgstr "Neuer Kommentar:" + +#: includes/pages/user_news.php:187 +msgid "Invalid request." +msgstr "Ungültige Abfrage." + +#: includes/pages/user_news.php:268 +msgid "Create news:" +msgstr "News anlegen:" + +#: includes/pages/user_questions.php:11 includes/sys_menu.php:90 +#: includes/view/Questions_view.php:40 +msgid "Ask the Heaven" +msgstr "Frag den Himmel" + +#: includes/pages/user_questions.php:55 +msgid "You question was saved." +msgstr "Frage gespeichert." + +#: includes/pages/user_questions.php:59 +msgid "Please enter a question!" +msgstr "Gib eine Frage ein!" + +#: includes/pages/user_questions.php:71 +msgid "Incomplete call, missing Question ID." +msgstr "Unvollständiger Aufruf, fehlende Fragen ID." + +#: includes/pages/user_questions.php:86 +msgid "No question found." +msgstr "Keine Frage gefunden." + +#: includes/pages/user_settings.php:11 includes/sys_menu.php:60 +#: includes/view/User_view.php:634 +msgid "Settings" +msgstr "Einstellungen" + +#: includes/pages/user_settings.php:68 +msgid "" +"Please enter your planned date of departure. It should be after your planned " +"arrival date and after buildup start date and before teardown end date." +msgstr "" +"Bitte gibt dein geplantes Abreisedatum an. Es sollte nach Deinem " +"Anreisedatum, nach dem Aufbaubeginn und vor dem Abbauende liegen." + +#: includes/pages/user_settings.php:108 +msgid "-> not OK. Please try again." +msgstr "-> Nicht OK. Bitte erneut versuchen." + +#: includes/pages/user_settings.php:141 +msgid "Theme changed." +msgstr "Aussehen geändert." + +#: includes/pages/user_shifts.php:101 +msgid "The administration has not configured any rooms yet." +msgstr "Die Administratoren habe noch keine Räume eingerichtet." + +#: includes/pages/user_shifts.php:120 +msgid "The administration has not configured any shifts yet." +msgstr "Die Administratoren haben noch keine Schichten angelegt." + +#: includes/pages/user_shifts.php:137 +msgid "" +"The administration has not configured any angeltypes yet - or you are not " +"subscribed to any angeltype." +msgstr "" +"Die Administratoren haben noch keine Engeltypen konfiguriert - oder Du hast " +"noch keine Engeltypen ausgewählt." + +#: includes/pages/user_shifts.php:206 +msgid "occupied" +msgstr "belegt" + +#: includes/pages/user_shifts.php:210 +msgid "free" +msgstr "frei" + +#: includes/pages/user_shifts.php:255 +msgid "Own" +msgstr "Eigene" + +#: includes/pages/user_shifts.php:259 +msgid "Occupancy" +msgstr "Belegung" + +#: includes/pages/user_shifts.php:262 +msgid "" +"The tasks shown here are influenced by the angeltypes you joined already!" +msgstr "" +"Die Schichten, die hier angezeigt werden, sind von Deinen Einstellungen " +"(Engeltypen/Aufgaben) abhängig!" + +#: includes/pages/user_shifts.php:264 +msgid "Description of the jobs." +msgstr "Beschreibung der Aufgaben." + +#: includes/pages/user_shifts.php:268 +msgid "Filter" +msgstr "Filter" + +#: includes/pages/user_shifts.php:269 +msgid "Yesterday" +msgstr "Gestern" + +#: includes/pages/user_shifts.php:270 +msgid "Today" +msgstr "Heute" + +#: includes/pages/user_shifts.php:271 +msgid "Tomorrow" +msgstr "Morgen" + +#: includes/pages/user_shifts.php:272 +msgid "last 8h" +msgstr "letzte 8h" + +#: includes/pages/user_shifts.php:273 +msgid "last 4h" +msgstr "letzte 4h" + +#: includes/pages/user_shifts.php:274 +msgid "next 4h" +msgstr "nächste 4h" + +#: includes/pages/user_shifts.php:275 +msgid "next 8h" +msgstr "nächste 8h" + +#: includes/pages/user_shifts.php:292 +msgid "iCal export" +msgstr "iCal Export" + +#: includes/pages/user_shifts.php:294 +#, php-format +msgid "" +"Export your own shifts. iCal format or JSON format available (please keep secret, otherwise reset the api key)." +msgstr "" +"Exportiere Deine Schichten. iCal Format oder JSON Format verfügbar (Link bitte geheimhalten, sonst API-Key zurücksetzen)." + +#: includes/pages/user_shifts.php:327 includes/view/ShiftTypes_view.php:48 +msgid "All" +msgstr "Alle" + +#: includes/pages/user_shifts.php:328 +msgid "None" +msgstr "Keine" + +#: includes/sys_menu.php:133 +msgid "Admin" +msgstr "Admin" + +#: includes/sys_menu.php:155 +msgid "Manage rooms" +msgstr "Verwalte Räume" + +#: includes/sys_template.php:316 +msgid "No data found." +msgstr "Nichts gefunden." + +#: includes/view/AngelTypes_view.php:35 includes/view/AngelTypes_view.php:449 +msgid "Unconfirmed" +msgstr "Unbestätigt" + +#: includes/view/AngelTypes_view.php:37 includes/view/AngelTypes_view.php:41 +msgid "Supporter" +msgstr "Supporter" + +#: includes/view/AngelTypes_view.php:39 includes/view/AngelTypes_view.php:43 +msgid "Member" +msgstr "Mitglied" + +#: includes/view/AngelTypes_view.php:55 +#, php-format +msgid "Do you want to delete angeltype %s?" +msgstr "Möchtest Du den Engeltypen %s löschen?" + +#: includes/view/AngelTypes_view.php:58 includes/view/ShiftEntry_view.php:27 +#: includes/view/ShiftEntry_view.php:56 includes/view/ShiftTypes_view.php:25 +#: includes/view/UserAngelTypes_view.php:27 +#: includes/view/UserAngelTypes_view.php:55 +#: includes/view/UserAngelTypes_view.php:74 +#: includes/view/UserAngelTypes_view.php:98 +#: includes/view/UserAngelTypes_view.php:122 +#: includes/view/UserAngelTypes_view.php:175 +#: includes/view/UserWorkLog_view.php:20 +msgid "cancel" +msgstr "abbrechen" + +#: includes/view/AngelTypes_view.php:84 includes/view/AngelTypes_view.php:85 +#: includes/view/AngelTypes_view.php:500 +msgid "Restricted" +msgstr "Beschränkt" + +#: includes/view/AngelTypes_view.php:88 +msgid "" +"Restricted angel types can only be used by an angel if enabled by a " +"supporter (double opt-in)." +msgstr "" +"Beschränkte Engeltypen müssen von einem Supporter freigeschaltet werden " +"(double-opt-in)." + +#: includes/view/AngelTypes_view.php:91 includes/view/AngelTypes_view.php:92 +msgid "No Self Sign Up" +msgstr "Kein Selbst-Eintragen" + +#: includes/view/AngelTypes_view.php:94 includes/view/AngelTypes_view.php:100 +msgid "Requires driver license" +msgstr "Benötigt Führerschein" + +#: includes/view/AngelTypes_view.php:103 includes/view/AngelTypes_view.php:104 +msgid "Show on dashboard" +msgstr "Auf dem Dashboard anzeigen" + +#: includes/view/AngelTypes_view.php:107 includes/view/AngelTypes_view.php:474 +msgid "Contact" +msgstr "Kontakt" + +#: includes/view/AngelTypes_view.php:110 +msgid "Primary contact person/desk for user questions." +msgstr "Ansprechpartner für Fragen." + +#: includes/view/AngelTypes_view.php:140 +msgid "my driving license" +msgstr "Meine Führerschein-Infos" + +#: includes/view/AngelTypes_view.php:152 +msgid "" +"This angeltype requires a driver license. Please enter your driver license " +"information!" +msgstr "" +"Dieser Engeltyp benötigt Führerschein-Infos. Bitte trage Deine Führerschein-" +"Infos ein!" + +#: includes/view/AngelTypes_view.php:157 +#, php-format +msgid "" +"You are unconfirmed for this angeltype. Please go to the introduction for %s " +"to get confirmed." +msgstr "" +"Du bist noch nicht für diesen Engeltyp bestätigt. Bitte gehe zur Einführung " +"für %s um bestätigt zu werden." + +#: includes/view/AngelTypes_view.php:219 +msgid "confirm" +msgstr "bestätigen" + +#: includes/view/AngelTypes_view.php:227 +msgid "deny" +msgstr "ablehnen" + +#: includes/view/AngelTypes_view.php:265 +msgid "remove" +msgstr "entfernen" + +#: includes/view/AngelTypes_view.php:295 +msgid "Driver" +msgstr "Fahrer" + +#: includes/view/AngelTypes_view.php:296 +msgid "Has car" +msgstr "Hat Auto" + +#: includes/view/AngelTypes_view.php:297 +#: includes/view/UserDriverLicenses_view.php:31 +msgid "Car" +msgstr "Auto" + +#: includes/view/AngelTypes_view.php:298 +msgid "3,5t Transporter" +msgstr "3,5t Transporter" + +#: includes/view/AngelTypes_view.php:299 +msgid "7,5t Truck" +msgstr "7,5t LKW" + +#: includes/view/AngelTypes_view.php:300 +msgid "12,5t Truck" +msgstr "12,5t LKW" + +#: includes/view/AngelTypes_view.php:301 +#: includes/view/UserDriverLicenses_view.php:49 +msgid "Forklift" +msgstr "Gabelstapler" + +#: includes/view/AngelTypes_view.php:345 +msgid "Info" +msgstr "Info" + +#: includes/view/AngelTypes_view.php:413 +msgid "Supporters" +msgstr "Supporter" + +#: includes/view/AngelTypes_view.php:433 +msgid "Members" +msgstr "Mitglieder" + +#: includes/view/AngelTypes_view.php:441 +#: includes/view/UserAngelTypes_view.php:154 +msgid "Add" +msgstr "Hinzufügen" + +#: includes/view/AngelTypes_view.php:453 +msgid "confirm all" +msgstr "Alle bestätigen" + +#: includes/view/AngelTypes_view.php:457 +msgid "deny all" +msgstr "Alle ablehnen" + +#: includes/view/AngelTypes_view.php:494 +msgid "New angeltype" +msgstr "Neuer Engeltyp" + +#: includes/view/AngelTypes_view.php:501 +msgid "Self Sign Up Allowed" +msgstr "Selbst-Eintragen erlaubt" + +#: includes/view/AngelTypes_view.php:502 +msgid "Membership" +msgstr "Mitgliedschaft" + +#: includes/view/AngelTypes_view.php:546 +msgid "" +"This angeltype is restricted by double-opt-in by a team supporter. Please " +"show up at the according introduction meetings." +msgstr "" +"Dieser Engeltyp muss zusätzlich von einem Team-Supporter freigeschaltet " +"werden. Bitte komme zu den entsprechenden Einführungstreffen." + +#: includes/view/AngelTypes_view.php:581 +msgid "FAQ" +msgstr "FAQ" + +#: includes/view/AngelTypes_view.php:586 +msgid "" +"Here is the list of teams and their tasks. If you have questions, read the " +"FAQ." +msgstr "" +"Hier ist die Liste der Teams und ihrer Aufgaben. Wenn Du Fragen hast, schaue " +"im FAQ nach." + +#: includes/view/EventConfig_view.php:27 +#, php-format +msgid "Welcome to the %s!" +msgstr "Willkommen beim %s!" + +#: includes/view/EventConfig_view.php:34 +msgid "Buildup starts" +msgstr "Aufbau startet" + +#: includes/view/EventConfig_view.php:36 includes/view/EventConfig_view.php:44 +#: includes/view/EventConfig_view.php:52 includes/view/EventConfig_view.php:60 +#: includes/view/Shifts_view.php:27 includes/view/Shifts_view.php:35 +#: resources/views/layouts/parts/footer.twig:9 +#: resources/views/layouts/parts/footer.twig:10 +#: resources/views/layouts/parts/footer.twig:15 +#: resources/views/layouts/parts/footer.twig:22 +#: resources/views/layouts/parts/footer.twig:23 +msgid "Y-m-d" +msgstr "d.m.Y" + +#: includes/view/EventConfig_view.php:42 +msgid "Event starts" +msgstr "Event startet" + +#: includes/view/EventConfig_view.php:50 +msgid "Event ends" +msgstr "Event endet" + +#: includes/view/EventConfig_view.php:58 +msgid "Teardown ends" +msgstr "Abbau endet" + +#: includes/view/EventConfig_view.php:82 +#, php-format +msgid "%s, from %s to %s" +msgstr "%s, vom %s bis %s" + +#: includes/view/EventConfig_view.php:92 +#, php-format +msgid "%s, starting %s" +msgstr "%s, ab dem %s" + +#: includes/view/EventConfig_view.php:100 +#, php-format +msgid "Event from %s to %s" +msgstr "Event von %s bis %s" + +#: includes/view/EventConfig_view.php:91 +msgid "Event Name" +msgstr "Event Name" + +#: includes/view/EventConfig_view.php:92 +msgid "Event Name is shown on the start page." +msgstr "Event Name wird auf der Startseite angezeigt." + +#: includes/view/EventConfig_view.php:93 +msgid "Event Welcome Message" +msgstr "Event Willkommens-Nachricht" + +#: includes/view/EventConfig_view.php:96 +msgid "" +"Welcome message is shown after successful registration. You can use markdown." +msgstr "" +"Die Willkommens-Nachricht wird nach einer erfolgreichen Registrierung " +"angezeigt. Du kannst Markdown benutzen." + +#: includes/view/EventConfig_view.php:100 +msgid "Buildup date" +msgstr "Aufbau Datum" + +#: includes/view/EventConfig_view.php:101 +msgid "Event start date" +msgstr "Event Start Datum" + +#: includes/view/EventConfig_view.php:104 +msgid "Teardown end date" +msgstr "Abbau Ende Datum" + +#: includes/view/EventConfig_view.php:105 +msgid "Event end date" +msgstr "Event Ende Datum" + +#: includes/view/PublicDashboard_view.php:37 +msgid "Angels needed in the next 3 hrs" +msgstr "Benötigte Engel in den nächsten 3 Stunden" + +#: includes/view/PublicDashboard_view.php:38 +msgid "Angels needed for nightshifts" +msgstr "Benötigte Engel für Nachtschichten" + +#: includes/view/PublicDashboard_view.php:39 +msgid "Angels currently working" +msgstr "Aktuell arbeitende Engel" + +#: includes/view/PublicDashboard_view.php:40 +msgid "Hours to be worked" +msgstr "Noch zu schaffende Stunden" + +#: includes/view/PublicDashboard_view.php:56 +msgid "Fullscreen" +msgstr "Vollbild" + +#: includes/view/Questions_view.php:28 +msgid "Open questions" +msgstr "Offene Fragen" + +#: includes/view/Questions_view.php:42 +msgid "Your Question:" +msgstr "Deine Frage:" + +#: includes/view/ShiftCalendarRenderer.php:146 +msgid "No shifts found." +msgstr "Keine Schichten gefunden." + +#: includes/view/ShiftCalendarRenderer.php:246 +msgid "Time" +msgstr "Zeit" + +#: includes/view/ShiftCalendarRenderer.php:312 +msgid "Your shift" +msgstr "Meine Schicht" + +#: includes/view/ShiftCalendarRenderer.php:313 +msgid "Help needed" +msgstr "Hilfe benötigt" + +#: includes/view/ShiftCalendarRenderer.php:314 +msgid "Other angeltype needed / collides with my shifts" +msgstr "Andere Engeltypen benötigt / kollidiert mit meinen Schichten" + +#: includes/view/ShiftCalendarRenderer.php:315 +msgid "Shift is full" +msgstr "Schicht ist voll" + +#: includes/view/ShiftCalendarRenderer.php:316 +msgid "Shift running/ended or user not arrived/allowed" +msgstr "Schicht läuft/vorbei oder du bist noch nicht angekommen/darfst dich noch nicht anmelden" + +#: includes/view/ShiftCalendarShiftRenderer.php:134 +msgid "Add more angels" +msgstr "Neue Engel hinzufügen" + +#: includes/view/ShiftCalendarShiftRenderer.php:179 +#, php-format +msgid "%d helper needed" +msgid_plural "%d helpers needed" +msgstr[0] "%d Helfer benötigt" +msgstr[1] "%d Helfer benötigt" + +#: includes/view/ShiftCalendarShiftRenderer.php:192 +#: includes/view/Shifts_view.php:84 +msgid "Sign up" +msgstr "Eintragen" + +#: includes/view/ShiftCalendarShiftRenderer.php:198 +msgid "ended" +msgstr "vorbei" + +msgid "not yet" +msgstr "noch nicht" + +msgid "This shift is in the far future and becomes available for signup at %s." +msgstr "Diese Schicht liegt in der fernen Zukunft und du kannst dich ab %s eintragen." + +# Wie ist dies zu verstehen bitte? +#: includes/view/ShiftCalendarShiftRenderer.php:203 +msgid "please arrive for signup" +msgstr "Ankommen zum Eintragen" + +#: includes/view/ShiftCalendarShiftRenderer.php:218 +#: includes/view/Shifts_view.php:88 +#, php-format +msgid "Become %s" +msgstr "Werde ein %s" + +#: includes/view/ShiftEntry_view.php:18 +#, php-format +msgid "Do you want to sign off %s from shift %s from %s to %s as %s?" +msgstr "Möchtest Du %s von der Schicht %s von %s bis %s als %s austragen?" + +#: includes/view/ShiftEntry_view.php:47 +#, php-format +msgid "Do you want to sign off from your shift %s from %s to %s as %s?" +msgstr "Möchtest du dich von deiner Schicht %s von %s bis %s als %s austragen?" + +#: includes/view/ShiftEntry_view.php:68 +msgid "Shift sign off" +msgstr "Von Schicht austragen" + +#: includes/view/ShiftEntry_view.php:89 +msgid "Do you want to sign up the following user for this shift?" +msgstr "Möchtest du den folgenden User für die Schicht eintragen?" + +#: includes/view/ShiftEntry_view.php:92 includes/view/ShiftEntry_view.php:117 +#: includes/view/UserAngelTypes_view.php:153 +#: includes/view/UserWorkLog_view.php:45 +msgid "User" +msgstr "Benutzer" + +#: includes/view/ShiftEntry_view.php:114 +#, php-format +msgid "Do you want to sign up the following user for this shift as %s?" +msgstr "Möchtest du den folgenden User als %s in die Schicht eintragen?" + +#: includes/view/ShiftEntry_view.php:138 +#, php-format +msgid "Do you want to sign up for this shift as %s?" +msgstr "Möchtest du dich für diese Schicht als %s eintragen?" + +#: includes/view/ShiftEntry_view.php:140 includes/view/ShiftEntry_view.php:198 +msgid "Comment (for your eyes only):" +msgstr "Kommentar (nur für Dich):" + +#: includes/view/ShiftEntry_view.php:151 +msgid "Shift signup" +msgstr "Schicht Anmeldung" + +#: includes/view/ShiftEntry_view.php:182 includes/view/User_view.php:406 +#: includes/view/User_view.php:408 +msgid "Freeloaded" +msgstr "Geschwänzt" + +#: includes/view/ShiftEntry_view.php:185 +msgid "Freeload comment (Only for shift coordination):" +msgstr "Schwänzer Kommentar (Nur für die Schicht-Koordination):" + +#: includes/view/ShiftEntry_view.php:190 +msgid "Edit shift entry" +msgstr "Schichteintrag bearbeiten" + +#: includes/view/ShiftEntry_view.php:193 +msgid "Angel:" +msgstr "Engel:" + +#: includes/view/ShiftEntry_view.php:194 +msgid "Date, Duration:" +msgstr "Termin, Dauer:" + +#: includes/view/ShiftEntry_view.php:195 +msgid "Location:" +msgstr "Ort:" + +#: includes/view/ShiftEntry_view.php:196 +msgid "Title:" +msgstr "Titel:" + +#: includes/view/ShiftEntry_view.php:197 +msgid "Type:" +msgstr "Typ:" + +#: includes/view/ShiftTypes_view.php:22 +#, php-format +msgid "Do you want to delete shifttype %s?" +msgstr "Möchtest Du den Schichttypen %s löschen?" + +#: includes/view/ShiftTypes_view.php:54 +msgid "Edit shifttype" +msgstr "Schichttyp bearbeiten" + +#: includes/view/ShiftTypes_view.php:54 +msgid "Create shifttype" +msgstr "Schichttyp erstellen" + +#: includes/view/ShiftTypes_view.php:79 +#, php-format +msgid "for team %s" +msgstr "für Team %s" + +#: includes/view/ShiftTypes_view.php:137 +msgid "New shifttype" +msgstr "Neuer Schichttyp" + +#: includes/view/Shifts_view.php:41 includes/view/User_view.php:590 +msgid "Location" +msgstr "Ort" + +#: includes/view/Shifts_view.php:56 +#, php-format +msgid "created at %s by %s" +msgstr "erstellt am %s von %s" + +#: includes/view/Shifts_view.php:63 +#, php-format +msgid "edited at %s by %s" +msgstr "bearbeitet am %s von %s" + +#: includes/view/UserAngelTypes_view.php:18 +#, php-format +msgid "Do you really want to add supporter rights for %s to %s?" +msgstr "Sollen %s %s als neuen Supporter bekommen?" + +#: includes/view/UserAngelTypes_view.php:19 +#, php-format +msgid "Do you really want to remove supporter rights for %s from %s?" +msgstr "Möchtest Du wirklich %s von %s als Supporter befreien?" + +#: includes/view/UserAngelTypes_view.php:47 +#, php-format +msgid "Do you really want to deny all users for %s?" +msgstr "Möchtest Du wirklich alle Benutzer als %s ablehnen?" + +#: includes/view/UserAngelTypes_view.php:71 +#, php-format +msgid "Do you really want to confirm all users for %s?" +msgstr "Möchtest Du wirklich alle Benutzer als %s bestätigen?" + +#: includes/view/UserAngelTypes_view.php:92 +#, php-format +msgid "Do you really want to confirm %s for %s?" +msgstr "Möchtest Du wirklich %s für %s bestätigen?" + +#: includes/view/UserAngelTypes_view.php:116 +#, php-format +msgid "Do you really want to delete %s from %s?" +msgstr "Möchtest Du wirklich %s von %s entfernen?" + +#: includes/view/UserAngelTypes_view.php:169 +#, php-format +msgid "Do you really want to add %s to %s?" +msgstr "Möchtest Du wirklich %s zu %s hinzufügen?" + +#: includes/view/UserAngelTypes_view.php:176 +msgid "save" +msgstr "Speichern" + +#: includes/view/UserDriverLicenses_view.php:17 +msgid "Back to profile" +msgstr "Zurück zum Profil" + +#: includes/view/UserDriverLicenses_view.php:21 +msgid "Privacy" +msgstr "Privatsphäre" + +#: includes/view/UserDriverLicenses_view.php:21 +msgid "" +"Your driving license information is only visible for supporters and admins." +msgstr "Deine Führerschein-Infos sind nur für Supporter und Admins sichtbar." + +#: includes/view/UserDriverLicenses_view.php:22 +msgid "I am willing to drive a car for the event" +msgstr "Ich möchte für das Event Auto fahren" + +#: includes/view/UserDriverLicenses_view.php:27 +msgid "" +"I have my own car with me and am willing to use it for the event (You'll get " +"reimbursed for fuel)" +msgstr "" +"Ich habe mein eigenes Auto dabei und möchte es zum Fahren für das " +"Event verwenden (Du wirst für Spritkosten entschädigt)" + +#: includes/view/UserDriverLicenses_view.php:30 +msgid "Driver license" +msgstr "Führerschein" + +#: includes/view/UserDriverLicenses_view.php:34 +msgid "Transporter 3,5t" +msgstr "3,5t Transporter" + +#: includes/view/UserDriverLicenses_view.php:39 +msgid "Truck 7,5t" +msgstr "7,5t LKW" + +#: includes/view/UserDriverLicenses_view.php:44 +msgid "Truck 12,5t" +msgstr "12,5t LKW" + +#: includes/view/UserWorkLog_view.php:15 +#, php-format +msgid "Do you want to delete the worklog entry for %s?" +msgstr "Möchtest du den Arbeitseinsatz von %s wirklich löschen?" + +#: includes/view/UserWorkLog_view.php:32 +msgid "Delete work log entry" +msgstr "Arbeitseinsatz gelöscht." + +#: includes/view/UserWorkLog_view.php:46 +msgid "Work date" +msgstr "Einsatzdatum" + +#: includes/view/UserWorkLog_view.php:47 +msgid "Work hours" +msgstr "Arbeitsstunden" + +#: includes/view/UserWorkLog_view.php:48 includes/view/User_view.php:592 +msgid "Comment" +msgstr "Kommentar" + +#: includes/view/UserWorkLog_view.php:94 +msgid "Edit work log entry" +msgstr "Arbeitseinsatz bearbeiten" + +#: includes/view/UserWorkLog_view.php:102 +msgid "Add work log entry" +msgstr "Arbeitseinsatz hinzufügen" + +#: includes/view/User_view.php:36 +msgid "Here you can change your user details." +msgstr "Hier kannst Du Deine Details ändern." + +#: includes/view/User_view.php:51 +msgid "Planned date of departure" +msgstr "Geplanter Abreisetag" + +#: includes/view/User_view.php:79 +msgid "Please visit the angeltypes page to manage your angeltypes." +msgstr "Bitte benutze die Engeltypen-Seite um deine Engeltypen zu verwalten." + +#: includes/view/User_view.php:85 +msgid "Here you can change your password." +msgstr "Hier kannst Du Dein Passwort ändern." + +#: includes/view/User_view.php:86 +msgid "Old password:" +msgstr "Altes Passwort:" + +#: includes/view/User_view.php:87 +msgid "New password:" +msgstr "Neues Passwort:" + +#: includes/view/User_view.php:88 +msgid "Password confirmation:" +msgstr "Passwort wiederholen:" + +#: includes/view/User_view.php:92 +msgid "Here you can choose your color settings:" +msgstr "Hier kannst Du das Aussehen auswählen:" + +#: includes/view/User_view.php:93 +msgid "Color settings:" +msgstr "Aussehen:" + +#: includes/view/User_view.php:97 +msgid "Here you can choose your language:" +msgstr "Hier kannst Du Deine Sprache auswählen:" + +#: includes/view/User_view.php:98 +msgid "Language:" +msgstr "Sprache:" + +#: includes/view/User_view.php:117 +msgid "Registration successful" +msgstr "Registrierung erfolgreich" + +#: includes/view/User_view.php:160 +msgid "" +"Do you really want to delete the user including all his shifts and every " +"other piece of his data?" +msgstr "" +"Möchtest Du wirklich den Engel inklusive aller seiner Schichten und allen " +"anderen seiner Daten löschen?" + +#: includes/view/User_view.php:164 +msgid "Your password" +msgstr "Dein Passwort" + +#: includes/view/User_view.php:184 +#, php-format +msgid "Angel should receive at least %d vouchers." +msgstr "Engel sollte mindestens %d Gutscheine bekommen." + +#: includes/view/User_view.php:189 +msgid "Number of vouchers given out" +msgstr "Anzahl Gutscheine bekommen" + +#: includes/view/User_view.php:232 +msgid "m/d/Y h:i a" +msgstr "d.m.Y H:i" + +#: includes/view/User_view.php:252 +msgid "New user" +msgstr "Neuer User" + +#: includes/view/User_view.php:256 +msgid "Prename" +msgstr "Vorname" + +#: includes/view/User_view.php:259 includes/view/User_view.php:715 +msgid "Arrived" +msgstr "Angekommen" + +#: includes/view/User_view.php:260 +msgid "Voucher" +msgstr "Gutschein" + +#: includes/view/User_view.php:261 +msgid "Freeloads" +msgstr "Schwänzereien" + +#: includes/view/User_view.php:262 includes/view/User_view.php:752 +msgid "Active" +msgstr "Aktiv" + +#: includes/view/User_view.php:264 includes/view/User_view.php:755 +msgid "T-Shirt" +msgstr "T-Shirt" + +#: includes/view/User_view.php:266 +msgid "Last login" +msgstr "Letzter Login" + +#: includes/view/User_view.php:299 +msgid "Free" +msgstr "Frei" + +#: includes/view/User_view.php:307 includes/view/User_view.php:311 +#, php-format +msgid "Next shift %c" +msgstr "Nächste Schicht %c" + +#: includes/view/User_view.php:318 +#, php-format +msgid "Shift started %c" +msgstr "Schicht startete %c" + +#: includes/view/User_view.php:323 +#, php-format +msgid "Shift ends %c" +msgstr "Schicht endet %c" + +#: includes/view/User_view.php:340 +#, php-format +msgid "Shift ended %c" +msgstr "Schicht endete %c" + +#: includes/view/User_view.php:425 +msgid "sign off" +msgstr "abmelden" + +#: includes/view/User_view.php:481 +msgid "Sum:" +msgstr "Summe:" + +#: includes/view/User_view.php:490 +msgid "Your t-shirt score" +msgstr "Dein T-Shirt Score" + +#: includes/view/User_view.php:531 +msgid "Work log entry" +msgstr "Arbeitseinsatz" + +#: includes/view/User_view.php:534 +#, php-format +msgid "Added by %s at %s" +msgstr "Erstellt von %s am %s" + +#: includes/view/User_view.php:588 +msgid "Day & time" +msgstr "Tag & Zeit" + +#: includes/view/User_view.php:589 +msgid "Duration" +msgstr "Dauer" + +#: includes/view/User_view.php:591 +msgid "Name & workmates" +msgstr "Name & Kollegen" + +#: includes/view/User_view.php:593 +msgid "Action" +msgstr "Aktion" + +#: includes/view/User_view.php:596 +msgid "You have done enough to get a t-shirt." +msgstr "Du hast genug für ein T-Shirt gemacht." + +#: includes/view/User_view.php:615 +msgid "driving license" +msgstr "Führerschein" + +#: includes/view/User_view.php:626 +msgid "Edit vouchers" +msgstr "Gutschein bearbeiten" + +#: includes/view/User_view.php:630 +msgid "Add work log" +msgstr "Neuer Arbeitseinsatz" + +#: includes/view/User_view.php:638 +msgid "iCal Export" +msgstr "iCal Export" + +#: includes/view/User_view.php:642 +msgid "JSON Export" +msgstr "JSON Export" + +#: includes/view/User_view.php:663 +#, php-format +msgid "Your night shifts between %d and %d am count twice." +msgstr "Deine Nachtschichten zwischen %d und %d Uhr zählen doppelt." + +#: includes/view/User_view.php:671 +#, php-format +msgid "" +"Go to the shifts table to sign yourself up for some " +"shifts." +msgstr "" +"Gehe zur Schicht-Tabelle, um Dich für Schichten " +"einzutragen." + +#: includes/view/User_view.php:697 +msgid "User state" +msgstr "Engelzustand" + +#: includes/view/User_view.php:717 +msgid "Not arrived" +msgstr "Nicht angekommen" + +#: includes/view/User_view.php:736 +msgid "Freeloader" +msgstr "Schwänzer" + +#: includes/view/User_view.php:744 +#, php-format +msgid "Arrived at %s" +msgstr "Angekommen am %s" + +#: includes/view/User_view.php:750 +msgid "Active (forced)" +msgstr "Aktiv (gezwungen)" + +#: includes/view/User_view.php:761 +#, php-format +msgid "Not arrived (Planned: %s)" +msgstr "Nicht angekommen (Geplant: %s)" + +#: includes/view/User_view.php:696 +#, php-format +msgid "Got %s voucher" +msgid_plural "Got %s vouchers" +msgstr[0] "Einen Gutschein bekommen" +msgstr[1] "%s Gutscheine bekommen" + +#: includes/view/User_view.php:774 +msgid "Got no vouchers" +msgstr "Gutschein nicht bekommen" + +#: includes/view/User_view.php:789 +msgid "" +"We will send you an e-mail with a password recovery link. Please use the " +"email address you used for registration." +msgstr "" +"Wir werden eine eMail mit einem Link schicken, mit dem du das Passwort " +"zurücksetzen kannst. Bitte benutze die Mailadresse, die du bei der Anmeldung " +"verwendet hast." + +#: includes/view/User_view.php:792 +msgid "Recover" +msgstr "Wiederherstellen" + +#: includes/view/User_view.php:806 +msgid "Please enter a new password." +msgstr "Gib bitte ein neues Passwort ein." + +#: includes/view/User_view.php:850 +msgid "Rights" +msgstr "Rechte" + +#: includes/view/User_view.php:901 +msgid "" +"Please enter your planned date of departure on your settings page to give us " +"a feeling for teardown capacities." +msgstr "" +"Bitte gib Dein geplantes Abreisedatum an, damit wir ein Gefühl für die Abbau-" +"Planung bekommen." + +#: includes/view/User_view.php:915 +#, php-format +msgid "" +"You freeloaded at least %s shifts. Shift signup is locked. Please go to " +"heavens desk to be unlocked again." +msgstr "" +"Du hast mindestens %s Schichten geschwänzt. Schicht-Registrierung ist " +"gesperrt. Bitte gehe zum Himmelsschreibtisch um wieder entsperrt zu werden." + +#: includes/view/User_view.php:934 +msgid "" +"You are not marked as arrived. Please go to heaven's desk, get your angel " +"badge and/or tell them that you arrived already." +msgstr "" +"Du bist nicht als angekommen markiert. Bitte gehe zur Himmelsverwaltung, " +"hole Dein Badge ab und/oder erkläre ihnen, dass Du bereits angekommen bist." + +#: includes/view/User_view.php:947 +msgid "You need to specify a tshirt size in your settings!" +msgstr "Bitte eine T-Shirt-Größe auswählen" + +#: includes/view/User_view.php:961 +msgid "" +"You need to specify a DECT phone number in your settings! If you don't have " +"a DECT phone, just enter '-'." +msgstr "" +"Bitte eine DECT-Telefonnummer in den Einstellungen eingeben. Wenn du noch " +"keine Nummer hast, bitte einfach \"-\" angeben." + +#: resources/views/emails/mail.twig:1 +#, python-format +msgid "Hi %s," +msgstr "Hallo %s," + +#: resources/views/emails/mail.twig:3 +#, python-format +msgid "here is a message for you from the %s:" +msgstr "hier ist eine Nachricht aus dem %s für Dich:" + +#: resources/views/emails/mail.twig:6 +#, python-format +msgid "" +"This email is autogenerated and has not been signed. You got this email " +"because you are registered in the %s." +msgstr "" +"Diese E-Mail wurde automatisch generiert und muss daher nicht unterschrieben " +"werden. Du hast diese E-Mail bekommen, weil Du im %s registriert bist." + +#: resources/views/errors/403.twig:3 +msgid "Forbidden" +msgstr "Nicht erlaubt" + +#: resources/views/errors/403.twig:5 +msgid "You are not allowed to access this page" +msgstr "Du darfst diese Seite nicht aufrufen" + +#: resources/views/errors/404.twig:3 +msgid "Page not found" +msgstr "Seite nicht gefunden" + +#: resources/views/errors/404.twig:10 +msgid "No sleep found" +msgstr "No sleep found" + +#: resources/views/errors/419.twig:3 +msgid "Authentication expired" +msgstr "Autorisierung ist abgelaufen" + +#: resources/views/errors/419.twig:6 +msgid "The provided CSRF token is invalid or has expired" +msgstr "Das angegebene CSRF Token ist ungültig oder abgelaufen" + +#: resources/views/layouts/parts/footer.twig:34 +msgid "Bugs / Features" +msgstr "Bugs / Features" + +#: resources/views/layouts/parts/footer.twig:35 +msgid "Development Platform" +msgstr "Entwicklerplattform" + +#: src/Middleware/LegacyMiddleware.php +msgid "" +"This page could not be found or you don't have permission to view it. You " +"probably have to sign in or register in order to gain access!" +msgstr "" +"Diese Seite existiert nicht oder Du hast keinen Zugriff. Melde Dich an um " +"Zugriff zu erhalten!" diff --git a/resources/lang/en_US.UTF-8/LC_MESSAGES/default.mo b/resources/lang/en_US.UTF-8/LC_MESSAGES/default.mo deleted file mode 100644 index e95ae703..00000000 Binary files a/resources/lang/en_US.UTF-8/LC_MESSAGES/default.mo and /dev/null differ diff --git a/resources/lang/en_US.UTF-8/LC_MESSAGES/default.po b/resources/lang/en_US.UTF-8/LC_MESSAGES/default.po deleted file mode 100644 index 22566e52..00000000 --- a/resources/lang/en_US.UTF-8/LC_MESSAGES/default.po +++ /dev/null @@ -1,26 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: Engelsystem 2.0\n" -"POT-Creation-Date: 2017-12-29 19:01+0100\n" -"PO-Revision-Date: 2018-11-27 00:28+0100\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.11\n" -"X-Poedit-KeywordsList: _;gettext;gettext_noop\n" -"X-Poedit-Basepath: .\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Poedit-SourceCharset: UTF-8\n" -"Last-Translator: \n" -"Language: en_US\n" -"X-Poedit-SearchPath-0: .\n" - -msgid "auth.no-nickname" -msgstr "Please enter a nickname." - -msgid "auth.no-password" -msgstr "Please enter a password." - -msgid "auth.not-found" -msgstr "No user was found. Please try again. If you are still having problems, ask Heaven." diff --git a/resources/lang/en_US/default.mo b/resources/lang/en_US/default.mo new file mode 100644 index 00000000..e95ae703 Binary files /dev/null and b/resources/lang/en_US/default.mo differ diff --git a/resources/lang/en_US/default.po b/resources/lang/en_US/default.po new file mode 100644 index 00000000..22566e52 --- /dev/null +++ b/resources/lang/en_US/default.po @@ -0,0 +1,26 @@ +msgid "" +msgstr "" +"Project-Id-Version: Engelsystem 2.0\n" +"POT-Creation-Date: 2017-12-29 19:01+0100\n" +"PO-Revision-Date: 2018-11-27 00:28+0100\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.11\n" +"X-Poedit-KeywordsList: _;gettext;gettext_noop\n" +"X-Poedit-Basepath: .\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"Last-Translator: \n" +"Language: en_US\n" +"X-Poedit-SearchPath-0: .\n" + +msgid "auth.no-nickname" +msgstr "Please enter a nickname." + +msgid "auth.no-password" +msgstr "Please enter a password." + +msgid "auth.not-found" +msgstr "No user was found. Please try again. If you are still having problems, ask Heaven." diff --git a/resources/lang/pt_BR.UTF.8/LC_MESSAGES/default.mo b/resources/lang/pt_BR.UTF.8/LC_MESSAGES/default.mo deleted file mode 100644 index 8b864156..00000000 Binary files a/resources/lang/pt_BR.UTF.8/LC_MESSAGES/default.mo and /dev/null differ diff --git a/resources/lang/pt_BR.UTF.8/LC_MESSAGES/default.po b/resources/lang/pt_BR.UTF.8/LC_MESSAGES/default.po deleted file mode 100644 index b9bf420d..00000000 --- a/resources/lang/pt_BR.UTF.8/LC_MESSAGES/default.po +++ /dev/null @@ -1,2645 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: Engelsystem 2.0\n" -"POT-Creation-Date: 2017-04-25 05:23+0200\n" -"PO-Revision-Date: 2018-11-27 00:29+0100\n" -"Last-Translator: samba \n" -"Language-Team: \n" -"Language: pt_BR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.1\n" -"X-Poedit-KeywordsList: _;gettext;gettext_noop\n" -"X-Poedit-Basepath: ../../..\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Poedit-SourceCharset: UTF-8\n" -"X-Poedit-SearchPath-0: .\n" - -#: includes/controller/angeltypes_controller.php:7 -#: includes/pages/user_shifts.php:164 includes/view/AngelTypes_view.php:62 -#: includes/view/AngelTypes_view.php:86 includes/view/User_view.php:356 -msgid "Angeltypes" -msgstr "Tipo de Anjo" - -#: includes/controller/angeltypes_controller.php:53 -#: includes/pages/guest_login.php:377 includes/view/AngelTypes_view.php:265 -#: includes/view/AngelTypes_view.php:326 includes/view/User_view.php:110 -msgid "Teams/Job description" -msgstr "Time/Descrição do trabalho" - -#: includes/controller/angeltypes_controller.php:72 -#, php-format -msgid "Angeltype %s deleted." -msgstr "Tipo de anjo %s apagado." - -#: includes/controller/angeltypes_controller.php:77 -#: includes/view/AngelTypes_view.php:41 -#, php-format -msgid "Delete angeltype %s" -msgstr "Apagar tipo de anjo %s" - -#: includes/controller/angeltypes_controller.php:116 -msgid "Please check the name. Maybe it already exists." -msgstr "Por favor verifique o nome. Pode ser que já exista." - -#: includes/controller/angeltypes_controller.php:141 -#: includes/view/AngelTypes_view.php:60 -#, php-format -msgid "Edit %s" -msgstr "Editar %s" - -#: includes/controller/angeltypes_controller.php:162 -#: includes/view/AngelTypes_view.php:252 -#, php-format -msgid "Team %s" -msgstr "Time %s" - -#: includes/controller/angeltypes_controller.php:181 -#: includes/view/User_view.php:274 -msgid "view" -msgstr "ver" - -#: includes/controller/angeltypes_controller.php:185 -#: includes/pages/admin_free.php:71 includes/pages/admin_groups.php:23 -#: includes/pages/admin_rooms.php:16 includes/view/AngelTypes_view.php:107 -#: includes/view/ShiftTypes_view.php:55 includes/view/ShiftTypes_view.php:67 -#: includes/view/Shifts_view.php:55 includes/view/User_view.php:277 -#: includes/view/User_view.php:328 -msgid "edit" -msgstr "editar" - -#: includes/controller/angeltypes_controller.php:186 -#: includes/controller/shifts_controller.php:178 -#: includes/pages/admin_questions.php:42 includes/pages/admin_questions.php:56 -#: includes/pages/admin_rooms.php:17 includes/pages/admin_user.php:120 -#: includes/view/AngelTypes_view.php:45 includes/view/AngelTypes_view.php:110 -#: includes/view/Questions_view.php:5 includes/view/Questions_view.php:12 -#: includes/view/ShiftTypes_view.php:16 includes/view/ShiftTypes_view.php:56 -#: includes/view/ShiftTypes_view.php:68 includes/view/Shifts_view.php:56 -msgid "delete" -msgstr "deletar" - -#: includes/controller/angeltypes_controller.php:191 -#: includes/view/AngelTypes_view.php:103 includes/view/AngelTypes_view.php:288 -msgid "leave" -msgstr "sair" - -#: includes/controller/angeltypes_controller.php:193 -#: includes/view/AngelTypes_view.php:94 includes/view/AngelTypes_view.php:290 -msgid "join" -msgstr "entrar" - -#: includes/controller/angeltypes_controller.php:220 -#: includes/controller/user_angeltypes_controller.php:29 -#: includes/controller/user_angeltypes_controller.php:35 -#: includes/controller/user_angeltypes_controller.php:65 -#: includes/controller/user_angeltypes_controller.php:71 -#: includes/controller/user_angeltypes_controller.php:119 -#: includes/controller/user_angeltypes_controller.php:170 -#: includes/controller/user_angeltypes_controller.php:235 -msgid "Angeltype doesn't exist." -msgstr "Esse tipo de anjo não existe." - -#: includes/controller/event_config_controller.php:4 -msgid "Event config" -msgstr "Configuração do evento" - -#: includes/controller/event_config_controller.php:48 -msgid "Please enter buildup start date." -msgstr "Por favor digite a data de início da montagem." - -#: includes/controller/event_config_controller.php:52 -msgid "Please enter event start date." -msgstr "Por favor digite a data de início do evento." - -#: includes/controller/event_config_controller.php:56 -msgid "Please enter event end date." -msgstr "Por favor digite a data de término do evento." - -#: includes/controller/event_config_controller.php:60 -msgid "Please enter teardown end date." -msgstr "Por favor digite a data de desmontagem do evento" - -#: includes/controller/event_config_controller.php:66 -msgid "The buildup start date has to be before the event start date." -msgstr "A data de montagem deve ser anterior a data de início do evento." - -#: includes/controller/event_config_controller.php:71 -msgid "The event start date has to be before the event end date." -msgstr "" -"A data de início do evento deve ser anterior a data de término do evento." - -#: includes/controller/event_config_controller.php:76 -msgid "The event end date has to be before the teardown end date." -msgstr "A data de término deve ser anterior a data de desmontagem do evento." - -#: includes/controller/event_config_controller.php:81 -msgid "The buildup start date has to be before the teardown end date." -msgstr "A data de montagem deve ser anterior a data de desmontagem do evento." - -#: includes/controller/event_config_controller.php:92 -#: includes/pages/user_settings.php:77 -msgid "Settings saved." -msgstr "Configurações salvas." - -#: includes/controller/shift_entries_controller.php:56 -msgid "" -"You are not allowed to sign up for this shift. Maybe shift is full or " -"already running." -msgstr "" -"Você não tem permissão para se inscrever nesse turno. Talvez o turno esteja " -"lotado ou já esteja em andamento." - -#: includes/controller/shift_entries_controller.php:103 -msgid "You are subscribed. Thank you!" -msgstr "Você já está inscrito. Obrigado!" - -#: includes/controller/shift_entries_controller.php:103 -#: includes/pages/user_myshifts.php:4 -msgid "My shifts" -msgstr "Meus turnos" - -#: includes/controller/shift_entries_controller.php:111 -#: includes/view/User_view.php:348 -msgid "Freeloader" -msgstr "Freeloader" - -#: includes/controller/shift_entries_controller.php:180 -msgid "Shift entry deleted." -msgstr "O turno foi deletado." - -#: includes/controller/shift_entries_controller.php:182 -msgid "Entry not found." -msgstr "Entrada não encontrada." - -#: includes/controller/shifts_controller.php:63 -msgid "Please select a room." -msgstr "Por favor selecione uma sala." - -#: includes/controller/shifts_controller.php:70 -msgid "Please select a shifttype." -msgstr "Por favor selecione um tssipo de turno." - -#: includes/controller/shifts_controller.php:77 -msgid "Please enter a valid starting time for the shifts." -msgstr "Por favor entre com um horário de início válido para os turnos." - -#: includes/controller/shifts_controller.php:84 -msgid "Please enter a valid ending time for the shifts." -msgstr "Por favor entre com um horário de término válido para os turnos." - -#: includes/controller/shifts_controller.php:89 -msgid "The ending time has to be after the starting time." -msgstr "O horário de término deve ser após o horário de início." - -#: includes/controller/shifts_controller.php:97 -#, php-format -msgid "Please check your input for needed angels of type %s." -msgstr "Por favor verifique seu input para os anjos de tipo %s necessários." - -#: includes/controller/shifts_controller.php:120 -msgid "Shift updated." -msgstr "Turno atualizado." - -#: includes/controller/shifts_controller.php:135 -msgid "This page is much more comfortable with javascript." -msgstr "Esta página é muito mais confortável com javascript" - -#: includes/controller/shifts_controller.php:137 -#: includes/pages/admin_import.php:98 includes/pages/admin_shifts.php:319 -msgid "Shifttype" -msgstr "Tipo de turno" - -#: includes/controller/shifts_controller.php:138 -#: includes/pages/admin_import.php:158 includes/pages/admin_import.php:167 -#: includes/pages/admin_import.php:176 includes/pages/admin_shifts.php:320 -#: includes/view/Shifts_view.php:62 -msgid "Title" -msgstr "Título" - -#: includes/controller/shifts_controller.php:139 -msgid "Room:" -msgstr "Sala:" - -#: includes/controller/shifts_controller.php:140 -msgid "Start:" -msgstr "Início:" - -#: includes/controller/shifts_controller.php:141 -msgid "End:" -msgstr "Fim:" - -#: includes/controller/shifts_controller.php:142 -#: includes/pages/admin_shifts.php:270 includes/pages/admin_shifts.php:334 -#: includes/view/Shifts_view.php:88 -msgid "Needed angels" -msgstr "Anjos necessários" - -#: includes/controller/shifts_controller.php:144 -#: includes/pages/admin_groups.php:54 includes/pages/admin_news.php:35 -#: includes/pages/admin_questions.php:40 includes/pages/admin_rooms.php:157 -#: includes/pages/admin_shifts.php:272 includes/pages/user_messages.php:44 -#: includes/pages/user_news.php:107 includes/pages/user_news.php:164 -#: includes/view/AngelTypes_view.php:76 includes/view/EventConfig_view.php:122 -#: includes/view/Questions_view.php:32 includes/view/ShiftEntry_view.php:32 -#: includes/view/ShiftTypes_view.php:39 -#: includes/view/UserDriverLicenses_view.php:34 includes/view/User_view.php:56 -#: includes/view/User_view.php:65 includes/view/User_view.php:70 -#: includes/view/User_view.php:75 includes/view/User_view.php:146 -#: includes/view/User_view.php:402 -msgid "Save" -msgstr "Salvar" - -#: includes/controller/shifts_controller.php:172 -msgid "Shift deleted." -msgstr "Turno deletado." - -#: includes/controller/shifts_controller.php:177 -#, php-format -msgid "Do you want to delete the shift %s from %s to %s?" -msgstr "Você quer deletar o turno %s de %s para %s?" - -#: includes/controller/shifts_controller.php:195 -msgid "Shift could not be found." -msgstr "O turno não pôde ser encontrado." - -#: includes/controller/shifttypes_controller.php:31 -#, php-format -msgid "Shifttype %s deleted." -msgstr "Tipo de turno %s deletado." - -#: includes/controller/shifttypes_controller.php:36 -#: includes/view/ShiftTypes_view.php:12 -#, php-format -msgid "Delete shifttype %s" -msgstr "Apagar tipo de turno %s" - -#: includes/controller/shifttypes_controller.php:58 -msgid "Shifttype not found." -msgstr "Tipo de turno não encontrado." - -#: includes/controller/shifttypes_controller.php:74 -#: includes/pages/admin_rooms.php:71 -msgid "Please enter a name." -msgstr "Por favor digite um nome." - -#: includes/controller/shifttypes_controller.php:94 -msgid "Updated shifttype." -msgstr "Tipo de turno atualizado." - -#: includes/controller/shifttypes_controller.php:101 -msgid "Created shifttype." -msgstr "Tipo de turno criado" - -#: includes/controller/shifttypes_controller.php:155 -msgid "Shifttypes" -msgstr "Tipos de turno" - -#: includes/controller/user_angeltypes_controller.php:19 -#, php-format -msgid "There is %d unconfirmed angeltype." -msgid_plural "There are %d unconfirmed angeltypes." -msgstr[0] "Há %d anjo não confirmado." -msgstr[1] "There are %d unconfirmed angeltypes." - -#: includes/controller/user_angeltypes_controller.php:19 -msgid "Angel types which need approvals:" -msgstr "Tipos de anjo que precisam de aprovações:" - -#: includes/controller/user_angeltypes_controller.php:40 -msgid "You are not allowed to delete all users for this angeltype." -msgstr "" -"Você não têm permissão para apagar todos os usuários desse tipo de anjo." - -#: includes/controller/user_angeltypes_controller.php:48 -#, php-format -msgid "Denied all users for angeltype %s." -msgstr "Todos os usuários com tipo de anjo %s negados." - -#: includes/controller/user_angeltypes_controller.php:53 -#: includes/view/UserAngelTypes_view.php:15 -msgid "Deny all users" -msgstr "Negar todos os usuários" - -#: includes/controller/user_angeltypes_controller.php:77 -#: includes/controller/user_angeltypes_controller.php:107 -#: includes/controller/user_angeltypes_controller.php:113 -#: includes/controller/user_angeltypes_controller.php:158 -#: includes/controller/user_angeltypes_controller.php:164 -#: includes/controller/user_angeltypes_controller.php:216 -#: includes/controller/user_angeltypes_controller.php:229 -msgid "User angeltype doesn't exist." -msgstr "O tipo de anjo deste usuário não existe." - -#: includes/controller/user_angeltypes_controller.php:82 -msgid "You are not allowed to confirm all users for this angeltype." -msgstr "" -"Você não tem permissão para confirmar todos os usuários com este tipo de " -"anjo." - -#: includes/controller/user_angeltypes_controller.php:90 -#, php-format -msgid "Confirmed all users for angeltype %s." -msgstr "Todos os usuários com tipo de anjo %s confirmados." - -#: includes/controller/user_angeltypes_controller.php:95 -#: includes/view/UserAngelTypes_view.php:26 -msgid "Confirm all users" -msgstr "Confirmar todos usuários" - -#: includes/controller/user_angeltypes_controller.php:124 -msgid "You are not allowed to confirm this users angeltype." -msgstr "Você não tem permissão para confirmar o tipo de anjo deste usuário." - -#: includes/controller/user_angeltypes_controller.php:130 -#: includes/controller/user_angeltypes_controller.php:176 -#: includes/controller/user_angeltypes_controller.php:241 -#: includes/controller/users_controller.php:312 -msgid "User doesn't exist." -msgstr "Usuário não existente." - -#: includes/controller/user_angeltypes_controller.php:141 -#, php-format -msgid "%s confirmed for angeltype %s." -msgstr "%s confirmado para o tipo de anjo %s." - -#: includes/controller/user_angeltypes_controller.php:146 -#: includes/view/UserAngelTypes_view.php:37 -msgid "Confirm angeltype for user" -msgstr "Confirme o tipo de anjo para o usuário" - -#: includes/controller/user_angeltypes_controller.php:181 -msgid "You are not allowed to delete this users angeltype." -msgstr "Você não tem permissão para deletar o tipo de anjo deste usuário." - -#: includes/controller/user_angeltypes_controller.php:191 -#, php-format -msgid "User %s removed from %s." -msgstr "Usuário %s removido de %s." - -#: includes/controller/user_angeltypes_controller.php:199 -#: includes/view/UserAngelTypes_view.php:48 -msgid "Remove angeltype" -msgstr "Remover esse tipo de anjo" - -#: includes/controller/user_angeltypes_controller.php:211 -msgid "You are not allowed to set supporter rights." -msgstr "Você não tem autorização para definir permissões de apoiadores." - -#: includes/controller/user_angeltypes_controller.php:223 -msgid "No supporter update given." -msgstr "Nenhuma atualização de apoiador informada." - -#: includes/controller/user_angeltypes_controller.php:248 -#, php-format -msgid "Added supporter rights for %s to %s." -msgstr "Permissões de apoiador incluídos para %s a %s." - -#: includes/controller/user_angeltypes_controller.php:248 -#, php-format -msgid "Removed supporter rights for %s from %s." -msgstr "Permissões de apoiador removidos para %s a %s." - -#: includes/controller/user_angeltypes_controller.php:256 -#: includes/view/AngelTypes_view.php:156 -#: includes/view/UserAngelTypes_view.php:4 -msgid "Add supporter rights" -msgstr "Adicionar permissão ao apoiador" - -#: includes/controller/user_angeltypes_controller.php:256 -#: includes/view/AngelTypes_view.php:147 -#: includes/view/UserAngelTypes_view.php:4 -msgid "Remove supporter rights" -msgstr "Remover permissões de apoiador" - -#: includes/controller/user_angeltypes_controller.php:289 -#, php-format -msgid "User %s added to %s." -msgstr "Usuário %s adicionado a %s." - -#: includes/controller/user_angeltypes_controller.php:299 -#: includes/view/UserAngelTypes_view.php:64 -msgid "Add user to angeltype" -msgstr "Adicionar usuário a tipo de anjo" - -#: includes/controller/user_angeltypes_controller.php:312 -#, php-format -msgid "You are already a %s." -msgstr "Você já é %s." - -#: includes/controller/user_angeltypes_controller.php:319 -#, php-format -msgid "You joined %s." -msgstr "Você se juntou a %s." - -#: includes/controller/user_angeltypes_controller.php:332 -#: includes/view/UserAngelTypes_view.php:78 -#, php-format -msgid "Become a %s" -msgstr "Torne-se %s" - -#: includes/controller/user_driver_licenses_controller.php:19 -#, php-format -msgid "" -"You joined an angeltype which requires a driving license. Please edit your " -"driving license information here: %s." -msgstr "" -"Você se tornou um tipo de anjo que requer carteira de motorista. Por favor " -"inclua \n" -"seus dados aqui: %s." - -#: includes/controller/user_driver_licenses_controller.php:19 -msgid "driving license information" -msgstr "dados da carteira de motorista" - -#: includes/controller/user_driver_licenses_controller.php:113 -msgid "Your driver license information has been saved." -msgstr "Dados da carteira de motorista salvos." - -#: includes/controller/user_driver_licenses_controller.php:116 -msgid "Please select at least one driving license." -msgstr "Selecione pelo menos uma carteira de motorista." - -#: includes/controller/user_driver_licenses_controller.php:121 -msgid "Your driver license information has been removed." -msgstr "Seus dados de carteira de motorista foram removidos." - -#: includes/controller/user_driver_licenses_controller.php:127 -#: includes/view/UserDriverLicenses_view.php:15 -#, php-format -msgid "Edit %s driving license information" -msgstr "Editar dados da carteira de motorista de %s" - -#: includes/controller/users_controller.php:52 -msgid "You cannot delete yourself." -msgstr "Você não pode se deletar." - -#: includes/controller/users_controller.php:61 -#: includes/pages/guest_login.php:315 -msgid "Your password is incorrect. Please try it again." -msgstr "Sua senha está incorreta. Por favor, tente novamente." - -#: includes/controller/users_controller.php:71 -msgid "User deleted." -msgstr "Usuário deletado." - -#: includes/controller/users_controller.php:79 includes/view/User_view.php:121 -#, php-format -msgid "Delete %s" -msgstr "Apagar %s" - -#: includes/controller/users_controller.php:120 -msgid "Please enter a valid number of vouchers." -msgstr "Por favor, entre com um número válido de vouchers." - -#: includes/controller/users_controller.php:131 -msgid "Saved the number of vouchers." -msgstr "Número de vouchers salvo." - -#: includes/controller/users_controller.php:139 includes/view/User_view.php:138 -#, php-format -msgid "%s's vouchers" -msgstr "Vouchers de %s" - -#: includes/controller/users_controller.php:151 -msgid "User not found." -msgstr "Usuário não encontrado." - -#: includes/controller/users_controller.php:205 includes/view/User_view.php:175 -msgid "All users" -msgstr "Todos usuários" - -#: includes/controller/users_controller.php:217 -msgid "Token is not correct." -msgstr "O token não está correto." - -#: includes/controller/users_controller.php:227 -#: includes/pages/guest_login.php:102 includes/pages/user_settings.php:97 -msgid "Your passwords don't match." -msgstr "Suas senhas não correspondem." - -#: includes/controller/users_controller.php:231 -#: includes/pages/user_settings.php:95 -msgid "Your password is to short (please use at least 6 characters)." -msgstr "Sua senha é muito curta (por favor use no mínimo 6 caracteres)." - -#: includes/controller/users_controller.php:236 -#: includes/pages/user_settings.php:99 -msgid "Password saved." -msgstr "Sua senha foi salva." - -#: includes/controller/users_controller.php:257 -#: includes/controller/users_controller.php:261 -#: includes/pages/guest_login.php:67 includes/pages/user_settings.php:21 -msgid "E-mail address is not correct." -msgstr "E-mail não está correto." - -#: includes/controller/users_controller.php:265 -#: includes/pages/guest_login.php:71 includes/pages/user_settings.php:25 -msgid "Please enter your e-mail." -msgstr "Por favor digite seu e-mail." - -#: includes/controller/users_controller.php:270 -#: includes/controller/users_controller.php:295 -msgid "Password recovery" -msgstr "Recuperação de senha" - -#: includes/controller/users_controller.php:270 -#, php-format -msgid "Please visit %s to recover your password." -msgstr "Por favor visite %s para recuperar sua senha" - -#: includes/controller/users_controller.php:271 -msgid "We sent an email containing your password recovery link." -msgstr "Nós enviamos um email com o link para recuperação da sua senha." - -#: includes/helper/email_helper.php:12 -#, php-format -msgid "Hi %s," -msgstr "Oi %s," - -#: includes/helper/email_helper.php:12 -#, php-format -msgid "here is a message for you from the %s:" -msgstr "aqui está uma mensagem do %s para você:" - -#: includes/helper/email_helper.php:12 -#, php-format -msgid "" -"This email is autogenerated and has not been signed. You got this email " -"because you are registered in the %s." -msgstr "Você recebeu esse email porque está registrado no %s." - -#: includes/mailer/shifts_mailer.php:10 -msgid "A Shift you are registered on has changed:" -msgstr "Um turno em que você estava registrado foi modificado:" - -#: includes/mailer/shifts_mailer.php:14 -#, php-format -msgid "* Shift type changed from %s to %s" -msgstr "* Tipo de turno alterado de %s para %s" - -#: includes/mailer/shifts_mailer.php:19 -#, php-format -msgid "* Shift title changed from %s to %s" -msgstr "* Título do turno alterado de %s para %s" - -#: includes/mailer/shifts_mailer.php:24 -#, php-format -msgid "* Shift Start changed from %s to %s" -msgstr "* Início do turno alterado de %s para %s" - -#: includes/mailer/shifts_mailer.php:29 -#, php-format -msgid "* Shift End changed from %s to %s" -msgstr "* Término do turno alterado de %s para %s" - -#: includes/mailer/shifts_mailer.php:34 -#, php-format -msgid "* Shift Location changed from %s to %s" -msgstr "* Local do turno alterado de %s para %s" - -#: includes/mailer/shifts_mailer.php:44 -msgid "The updated Shift:" -msgstr "Turno atualizado:" - -#: includes/mailer/shifts_mailer.php:53 -msgid "Your Shift has changed" -msgstr "O seu turno foi modificado" - -#: includes/mailer/shifts_mailer.php:62 -msgid "A Shift you are registered on was deleted:" -msgstr "Um turno em que você estava registrado foi apagado:" - -#: includes/mailer/shifts_mailer.php:71 -msgid "Your Shift was deleted" -msgstr "Seu turno foi apagado" - -#: includes/mailer/shifts_mailer.php:80 -msgid "You have been assigned to a Shift:" -msgstr "Você foi alocado a um turno:" - -#: includes/mailer/shifts_mailer.php:86 -msgid "Assigned to Shift" -msgstr "Alocado ao turno" - -#: includes/mailer/shifts_mailer.php:94 -msgid "You have been removed from a Shift:" -msgstr "Você foi removido de um turno:" - -#: includes/mailer/shifts_mailer.php:100 -msgid "Removed from Shift" -msgstr "Removido do turno" - -#: includes/mailer/users_mailer.php:7 -msgid "Your account has been deleted" -msgstr "A sua conta foi deletada." - -#: includes/mailer/users_mailer.php:7 -msgid "" -"Your angelsystem account has been deleted. If you have any questions " -"regarding your account deletion, please contact heaven." -msgstr "" -"Sua conta engelsystem foi deletada. Se você tiver questões sobre a deleção " -"da sua conta, por favor entre em contato com o paraíso." - -#: includes/pages/admin_active.php:4 -msgid "Active angels" -msgstr "Anjos ativos" - -#: includes/pages/admin_active.php:29 -#, php-format -msgid "" -"At least %s angels are forced to be active. The number has to be greater." -msgstr "No mínimo %s anjos precisam estar ativos. O número deve ser maior." - -#: includes/pages/admin_active.php:34 -msgid "Please enter a number of angels to be marked as active." -msgstr "Por favor insira o número de anjos a marcar como ativos." - -#: includes/pages/admin_active.php:59 -msgid "Marked angels." -msgstr "Anjos marcados." - -#: includes/pages/admin_active.php:61 includes/pages/admin_rooms.php:137 -#: includes/pages/admin_rooms.php:173 includes/pages/admin_shifts.php:266 -#: includes/view/UserAngelTypes_view.php:67 includes/view/User_view.php:124 -#: includes/view/User_view.php:141 -msgid "back" -msgstr "voltar" - -#: includes/pages/admin_active.php:61 -msgid "apply" -msgstr "aplicar" - -#: includes/pages/admin_active.php:71 -msgid "Angel has been marked as active." -msgstr "Anjo marcado como ativo." - -#: includes/pages/admin_active.php:73 includes/pages/admin_active.php:83 -#: includes/pages/admin_active.php:103 includes/pages/admin_arrive.php:23 -#: includes/pages/admin_arrive.php:34 -msgid "Angel not found." -msgstr "Anjo não encontrado." - -#: includes/pages/admin_active.php:81 -msgid "Angel has been marked as not active." -msgstr "Anjo marcado como não ativo." - -#: includes/pages/admin_active.php:91 -msgid "Angel has got a t-shirt." -msgstr "Anjo tem uma camiseta." - -#: includes/pages/admin_active.php:101 -msgid "Angel has got no t-shirt." -msgstr "Anjo não tem camiseta." - -#: includes/pages/admin_active.php:142 -msgid "set active" -msgstr "definir ativo" - -#: includes/pages/admin_active.php:145 -msgid "remove active" -msgstr "remover ativo" - -#: includes/pages/admin_active.php:146 -msgid "got t-shirt" -msgstr "pegou camiseta" - -#: includes/pages/admin_active.php:149 -msgid "remove t-shirt" -msgstr "remover camiseta" - -#: includes/pages/admin_active.php:168 includes/pages/admin_arrive.php:165 -#: includes/pages/admin_arrive.php:180 includes/pages/admin_arrive.php:195 -#: includes/view/AngelTypes_view.php:221 includes/view/AngelTypes_view.php:229 -#: includes/view/User_view.php:165 -msgid "Sum" -msgstr "Somatória" - -#: includes/pages/admin_active.php:175 -msgid "Search angel:" -msgstr "Buscar Anjo:" - -#: includes/pages/admin_active.php:176 -msgid "Show all shifts" -msgstr "Mostrar todos os turnos" - -#: includes/pages/admin_active.php:177 includes/pages/admin_arrive.php:141 -#: includes/pages/admin_arrive.php:142 includes/pages/admin_free.php:78 -#: includes/pages/admin_free.php:87 includes/pages/admin_log.php:23 -#: includes/pages/admin_log.php:24 -msgid "Search" -msgstr "Buscar" - -#: includes/pages/admin_active.php:180 -msgid "How much angels should be active?" -msgstr "Quantos anjos deverão estar ativos?" - -#: includes/pages/admin_active.php:181 includes/pages/admin_shifts.php:254 -#: includes/pages/admin_shifts.php:342 -msgid "Preview" -msgstr "Pré-visualizar" - -#: includes/pages/admin_active.php:185 includes/pages/admin_arrive.php:145 -msgid "Nickname" -msgstr "Apelido" - -#: includes/pages/admin_active.php:186 includes/pages/admin_active.php:196 -#: includes/view/User_view.php:191 -msgid "Size" -msgstr "Tamanho" - -#: includes/pages/admin_active.php:187 includes/pages/user_shifts.php:5 -#: includes/view/User_view.php:364 -msgid "Shifts" -msgstr "Turnos" - -#: includes/pages/admin_active.php:188 includes/pages/admin_shifts.php:329 -msgid "Length" -msgstr "Duração" - -#: includes/pages/admin_active.php:189 -msgid "Active?" -msgstr "Ativo?" - -#: includes/pages/admin_active.php:190 includes/view/User_view.php:189 -msgid "Forced" -msgstr "Forçados" - -#: includes/pages/admin_active.php:191 -msgid "T-shirt?" -msgstr "Camiseta?" - -#: includes/pages/admin_active.php:194 -msgid "Shirt statistics" -msgstr "Estatísticas de camiseta" - -#: includes/pages/admin_active.php:197 -msgid "Needed shirts" -msgstr "Camisetas necessárias" - -#: includes/pages/admin_active.php:198 -msgid "Given shirts" -msgstr "Camisetas entregues" - -#: includes/pages/admin_arrive.php:4 -msgid "Arrived angels" -msgstr "Anjos que chegaram" - -#: includes/pages/admin_arrive.php:20 -msgid "Reset done. Angel has not arrived." -msgstr "Reset realizado. Anjo não chegou." - -#: includes/pages/admin_arrive.php:31 -msgid "Angel has been marked as arrived." -msgstr "Chegada do anjo registrada." - -#: includes/pages/admin_arrive.php:71 includes/view/UserAngelTypes_view.php:9 -#: includes/view/UserAngelTypes_view.php:20 -#: includes/view/UserAngelTypes_view.php:31 -#: includes/view/UserAngelTypes_view.php:42 -#: includes/view/UserAngelTypes_view.php:53 -msgid "yes" -msgstr "sim" - -#: includes/pages/admin_arrive.php:72 -msgid "reset" -msgstr "resetar" - -#: includes/pages/admin_arrive.php:72 includes/pages/admin_arrive.php:156 -#: includes/pages/admin_arrive.php:171 includes/pages/admin_arrive.php:186 -#: includes/view/User_view.php:330 -msgid "arrived" -msgstr "chegou" - -#: includes/pages/admin_arrive.php:146 -msgid "Planned arrival" -msgstr "Chegada planejada" - -#: includes/pages/admin_arrive.php:147 -msgid "Arrived?" -msgstr "Chegou?" - -#: includes/pages/admin_arrive.php:148 -msgid "Arrival date" -msgstr "Data de chegada" - -#: includes/pages/admin_arrive.php:149 -msgid "Planned departure" -msgstr "Saída planejada" - -#: includes/pages/admin_arrive.php:154 -msgid "Planned arrival statistics" -msgstr "Estatísticas de chegadas planejadas" - -#: includes/pages/admin_arrive.php:157 includes/pages/admin_arrive.php:172 -#: includes/pages/admin_arrive.php:187 -msgid "arrived sum" -msgstr "soma dos que chegaram" - -#: includes/pages/admin_arrive.php:163 includes/pages/admin_arrive.php:178 -#: includes/pages/admin_arrive.php:193 includes/pages/admin_news.php:30 -#: includes/pages/user_messages.php:76 -msgid "Date" -msgstr "Data" - -#: includes/pages/admin_arrive.php:164 includes/pages/admin_arrive.php:179 -#: includes/pages/admin_arrive.php:194 -msgid "Count" -msgstr "Contar" - -#: includes/pages/admin_arrive.php:169 -msgid "Arrival statistics" -msgstr "Estatísticas de chegadas" - -#: includes/pages/admin_arrive.php:184 -msgid "Planned departure statistics" -msgstr "Estatísticas de saídas planejadas" - -#: includes/pages/admin_free.php:4 -msgid "Free angels" -msgstr "Anjos livres" - -#: includes/pages/admin_free.php:81 includes/view/ShiftTypes_view.php:36 -#: includes/view/UserAngelTypes_view.php:70 -msgid "Angeltype" -msgstr "Tipo de anjo" - -#: includes/pages/admin_free.php:84 -msgid "Only confirmed" -msgstr "Somente confirmados" - -#: includes/pages/admin_free.php:92 includes/pages/guest_login.php:225 -#: includes/pages/guest_login.php:354 includes/view/AngelTypes_view.php:177 -#: includes/view/AngelTypes_view.php:190 includes/view/User_view.php:40 -#: includes/view/User_view.php:97 includes/view/User_view.php:181 -msgid "Nick" -msgstr "Apelido" - -#: includes/pages/admin_free.php:94 includes/pages/guest_login.php:255 -#: includes/view/AngelTypes_view.php:178 includes/view/AngelTypes_view.php:191 -#: includes/view/User_view.php:47 includes/view/User_view.php:184 -msgid "DECT" -msgstr "DECT" - -#: includes/pages/admin_free.php:95 includes/pages/guest_login.php:264 -#: includes/view/User_view.php:52 -msgid "Jabber" -msgstr "Jabber" - -#: includes/pages/admin_free.php:96 includes/pages/guest_login.php:228 -#: includes/view/User_view.php:49 includes/view/User_view.php:386 -msgid "E-Mail" -msgstr "E-Mail" - -#: includes/pages/admin_groups.php:4 -msgid "Grouprights" -msgstr "Direitos de grupo" - -#: includes/pages/admin_groups.php:29 includes/pages/admin_import.php:145 -#: includes/pages/admin_import.php:149 includes/pages/admin_rooms.php:143 -#: includes/pages/admin_rooms.php:189 includes/view/AngelTypes_view.php:66 -#: includes/view/AngelTypes_view.php:268 includes/view/ShiftTypes_view.php:35 -#: includes/view/ShiftTypes_view.php:78 includes/view/User_view.php:183 -msgid "Name" -msgstr "Nome" - -#: includes/pages/admin_groups.php:30 -msgid "Privileges" -msgstr "Privilégios" - -#: includes/pages/admin_groups.php:55 -msgid "Edit group" -msgstr "Editar grupo" - -#: includes/pages/admin_import.php:4 includes/pages/admin_rooms.php:144 -#: includes/pages/admin_rooms.php:190 -msgid "Frab import" -msgstr "Importação Frab" - -#: includes/pages/admin_import.php:26 -msgid "Webserver has no write-permission on import directory." -msgstr "" -"O servidor web não possui permissão de escrita no diretório de importação." - -#: includes/pages/admin_import.php:54 includes/pages/admin_import.php:118 -#: includes/pages/admin_import.php:196 includes/pages/admin_shifts.php:53 -#: includes/pages/admin_shifts.php:59 -msgid "Please select a shift type." -msgstr "Por favor selecione um tipo de turno." - -#: includes/pages/admin_import.php:61 includes/pages/admin_import.php:125 -#: includes/pages/admin_import.php:203 -msgid "Please enter an amount of minutes to add to a talk's begin." -msgstr "" -"Por favor insira um número de minutos para adicionar ao início de uma " -"palestra." - -#: includes/pages/admin_import.php:68 includes/pages/admin_import.php:132 -#: includes/pages/admin_import.php:210 -msgid "Please enter an amount of minutes to add to a talk's end." -msgstr "" -"Por favor insira um número de minutos para adicionar ao término de uma " -"palestra." - -#: includes/pages/admin_import.php:76 -msgid "No valid xml/xcal file provided." -msgstr "Nenhum arquivo xml/xcal válido foi fornecido." - -#: includes/pages/admin_import.php:81 -msgid "File upload went wrong." -msgstr "Falha no upload do arquivo." - -#: includes/pages/admin_import.php:85 -msgid "Please provide some data." -msgstr "Por favor insira alguns dados." - -#: includes/pages/admin_import.php:93 includes/pages/admin_import.php:140 -#: includes/pages/admin_import.php:253 -msgid "File Upload" -msgstr "Enviar arquivo" - -#: includes/pages/admin_import.php:93 includes/pages/admin_import.php:140 -#: includes/pages/admin_import.php:253 -msgid "Validation" -msgstr "Validação" - -#: includes/pages/admin_import.php:93 includes/pages/admin_import.php:102 -#: includes/pages/admin_import.php:140 includes/pages/admin_import.php:179 -#: includes/pages/admin_import.php:253 -msgid "Import" -msgstr "Importar" - -#: includes/pages/admin_import.php:97 -msgid "" -"This import will create/update/delete rooms and shifts by given FRAB-export " -"file. The needed file format is xcal." -msgstr "" -"Esta importação irá criar/atualizar/deletar salas e turnos a partir do " -"arquivo FRAB-Export. O formato necessário é xcal." - -#: includes/pages/admin_import.php:99 -msgid "Add minutes to start" -msgstr "Adicionar minutos ao início" - -#: includes/pages/admin_import.php:100 -msgid "Add minutes to end" -msgstr "Adicionar minutos ao fim" - -#: includes/pages/admin_import.php:101 -msgid "xcal-File (.xcal)" -msgstr "Adicionar minutos ao fim" - -#: includes/pages/admin_import.php:111 includes/pages/admin_import.php:185 -msgid "Missing import file." -msgstr "Arquivo para importar não encontrado." - -#: includes/pages/admin_import.php:144 -msgid "Rooms to create" -msgstr "Salas para criar" - -#: includes/pages/admin_import.php:148 -msgid "Rooms to delete" -msgstr "Salas para apagar" - -#: includes/pages/admin_import.php:152 -msgid "Shifts to create" -msgstr "Turnos para criar" - -#: includes/pages/admin_import.php:154 includes/pages/admin_import.php:163 -#: includes/pages/admin_import.php:172 includes/view/User_view.php:366 -msgid "Day" -msgstr "Dia" - -#: includes/pages/admin_import.php:155 includes/pages/admin_import.php:164 -#: includes/pages/admin_import.php:173 includes/pages/admin_shifts.php:324 -#: includes/view/Shifts_view.php:66 -msgid "Start" -msgstr "Início" - -#: includes/pages/admin_import.php:156 includes/pages/admin_import.php:165 -#: includes/pages/admin_import.php:174 includes/pages/admin_shifts.php:325 -#: includes/view/Shifts_view.php:74 -msgid "End" -msgstr "Fim" - -#: includes/pages/admin_import.php:157 includes/pages/admin_import.php:166 -#: includes/pages/admin_import.php:175 -msgid "Shift type" -msgstr "Tipo de turno" - -#: includes/pages/admin_import.php:159 includes/pages/admin_import.php:168 -#: includes/pages/admin_import.php:177 includes/pages/admin_shifts.php:321 -msgid "Room" -msgstr "Sala" - -#: includes/pages/admin_import.php:161 -msgid "Shifts to update" -msgstr "Turnos para atualizar" - -#: includes/pages/admin_import.php:170 -msgid "Shifts to delete" -msgstr "Turnos para deletar" - -#: includes/pages/admin_import.php:254 -msgid "It's done!" -msgstr "Está feito!" - -#: includes/pages/admin_log.php:4 -msgid "Log" -msgstr "Log" - -#: includes/pages/admin_news.php:10 -msgid "Edit news entry" -msgstr "Editar notícia" - -#: includes/pages/admin_news.php:31 -msgid "Author" -msgstr "Autor" - -#: includes/pages/admin_news.php:32 includes/pages/user_news.php:161 -msgid "Subject" -msgstr "Assunto" - -#: includes/pages/admin_news.php:33 includes/pages/user_messages.php:79 -#: includes/pages/user_news.php:106 includes/pages/user_news.php:162 -msgid "Message" -msgstr "Mensagem" - -#: includes/pages/admin_news.php:34 includes/pages/user_news.php:163 -msgid "Meeting" -msgstr "Reunião" - -#: includes/pages/admin_news.php:38 includes/pages/admin_rooms.php:177 -#: includes/view/User_view.php:129 -msgid "Delete" -msgstr "Apagar" - -#: includes/pages/admin_news.php:52 -msgid "News entry updated." -msgstr "Notícia atualizada." - -#: includes/pages/admin_news.php:61 -msgid "News entry deleted." -msgstr "Notícia deletada." - -#: includes/pages/admin_questions.php:4 -msgid "Answer questions" -msgstr "Responder perguntas" - -#: includes/pages/admin_questions.php:18 -msgid "There are unanswered questions!" -msgstr "Existem perguntas não respondidas!" - -#: includes/pages/admin_questions.php:61 -msgid "Unanswered questions" -msgstr "Perguntas não respondidas" - -#: includes/pages/admin_questions.php:63 includes/pages/admin_questions.php:70 -msgid "From" -msgstr "De" - -#: includes/pages/admin_questions.php:64 includes/pages/admin_questions.php:71 -#: includes/view/Questions_view.php:19 includes/view/Questions_view.php:24 -msgid "Question" -msgstr "Questão" - -#: includes/pages/admin_questions.php:65 includes/pages/admin_questions.php:73 -#: includes/view/Questions_view.php:26 -msgid "Answer" -msgstr "Resposta" - -#: includes/pages/admin_questions.php:68 includes/view/Questions_view.php:22 -msgid "Answered questions" -msgstr "Perguntas respondidas" - -#: includes/pages/admin_questions.php:72 includes/view/Questions_view.php:25 -msgid "Answered by" -msgstr "Respondido por" - -#: includes/pages/admin_rooms.php:4 includes/pages/user_shifts.php:159 -#: includes/sys_menu.php:176 -msgid "Rooms" -msgstr "Salas" - -#: includes/pages/admin_rooms.php:67 -msgid "This name is already in use." -msgstr "Este nome já está em uso." - -#: includes/pages/admin_rooms.php:97 -#, php-format -msgid "Please enter needed angels for type %s." -msgstr "Por favor insira os anjos necessários de tipo %s." - -#: includes/pages/admin_rooms.php:124 -msgid "Room saved." -msgstr "Sala salva" - -#: includes/pages/admin_rooms.php:145 includes/pages/admin_rooms.php:191 -msgid "Public" -msgstr "Público" - -#: includes/pages/admin_rooms.php:146 -msgid "Room number" -msgstr "Número da sala" - -#: includes/pages/admin_rooms.php:151 -msgid "Needed angels:" -msgstr "Anjos necessários:" - -#: includes/pages/admin_rooms.php:167 -#, php-format -msgid "Room %s deleted." -msgstr "Sala %s deletada." - -#: includes/pages/admin_rooms.php:175 -#, php-format -msgid "Do you want to delete room %s?" -msgstr "Você quer deletar as salas %s?" - -#: includes/pages/admin_rooms.php:185 -msgid "add" -msgstr "adicionar" - -#: includes/pages/admin_shifts.php:4 -msgid "Create shifts" -msgstr "Criar turnos" - -#: includes/pages/admin_shifts.php:71 -msgid "Please select a location." -msgstr "Por favor, selecione uma localização." - -#: includes/pages/admin_shifts.php:78 -msgid "Please select a start time." -msgstr "Por favor, selecione um horário de início." - -#: includes/pages/admin_shifts.php:85 -msgid "Please select an end time." -msgstr "Por favor, selecione um horário de término." - -#: includes/pages/admin_shifts.php:90 -msgid "The shifts end has to be after its start." -msgstr "O término do turno deve ser posterior ao seu início." - -#: includes/pages/admin_shifts.php:102 -msgid "Please enter a shift duration in minutes." -msgstr "Por favor insira a duração do turno em minutos." - -#: includes/pages/admin_shifts.php:110 -msgid "Please split the shift-change hours by colons." -msgstr "Por favor divida os horários de mudança de turno por vírgulas." - -#: includes/pages/admin_shifts.php:115 -msgid "Please select a mode." -msgstr "Por favor selecione um modo." - -#: includes/pages/admin_shifts.php:128 -#, php-format -msgid "Please check the needed angels for team %s." -msgstr "Por favor confira os anjos necessários para o time %s." - -#: includes/pages/admin_shifts.php:133 -msgid "There are 0 angels needed. Please enter the amounts of needed angels." -msgstr "" -"Há 0 anjos necessários. Por favor insira o número de anjos necessários." - -#: includes/pages/admin_shifts.php:137 -msgid "Please select a mode for needed angels." -msgstr "Por favor escolha um modo para os anjos necessários." - -#: includes/pages/admin_shifts.php:141 -msgid "Please select needed angels." -msgstr "Por favor selecione os anjos necessários." - -#: includes/pages/admin_shifts.php:268 -msgid "Time and location" -msgstr "Horário e localização" - -#: includes/pages/admin_shifts.php:269 -msgid "Type and title" -msgstr "Tipo e título" - -#: includes/pages/admin_shifts.php:326 -msgid "Mode" -msgstr "Modo" - -#: includes/pages/admin_shifts.php:327 -msgid "Create one shift" -msgstr "Criar um turno" - -#: includes/pages/admin_shifts.php:328 -msgid "Create multiple shifts" -msgstr "Criar múltiplos turnos" - -#: includes/pages/admin_shifts.php:330 -msgid "Create multiple shifts with variable length" -msgstr "Criar múltiplos turnos com duração variável" - -#: includes/pages/admin_shifts.php:331 -msgid "Shift change hours" -msgstr "Mudança de horário do turno" - -#: includes/pages/admin_shifts.php:335 -msgid "Take needed angels from room settings" -msgstr "Pegar os anjos necessários a partir das configurações das salas" - -#: includes/pages/admin_shifts.php:336 -msgid "The following angels are needed" -msgstr "Os seguintes anjos são necessários" - -#: includes/pages/admin_user.php:4 -msgid "All Angels" -msgstr "Todos os anjos" - -#: includes/pages/admin_user.php:20 -msgid "This user does not exist." -msgstr "Esse usuário não existe." - -#: includes/pages/admin_user.php:46 includes/view/AngelTypes_view.php:67 -#: includes/view/AngelTypes_view.php:68 includes/view/AngelTypes_view.php:69 -msgid "Yes" -msgstr "Sim" - -#: includes/pages/admin_user.php:47 includes/view/AngelTypes_view.php:67 -#: includes/view/AngelTypes_view.php:68 includes/view/AngelTypes_view.php:69 -msgid "No" -msgstr "Não" - -#: includes/pages/admin_user.php:60 -msgid "Force active" -msgstr "Forçar ativação" - -#: includes/pages/admin_user.php:79 -msgid "" -"Please visit the angeltypes page or the users profile to manage users " -"angeltypes." -msgstr "" -"Por favor visite a página de tipos de anjo ou o perfil do usuário para " -"gerenciar\n" -"seus tipos de anjo." - -#: includes/pages/admin_user.php:204 -msgid "Edit user" -msgstr "Editar usuário" - -#: includes/pages/guest_credits.php:3 -msgid "Credits" -msgstr "Créditos" - -#: includes/pages/guest_login.php:4 includes/pages/guest_login.php:349 -#: includes/pages/guest_login.php:356 includes/view/User_view.php:95 -#: includes/view/User_view.php:99 -msgid "Login" -msgstr "Login" - -#: includes/pages/guest_login.php:8 includes/pages/guest_login.php:285 -msgid "Register" -msgstr "Registrar" - -#: includes/pages/guest_login.php:12 -msgid "Logout" -msgstr "Logout" - -#: includes/pages/guest_login.php:56 -#, php-format -msgid "Your nick "%s" already exists." -msgstr "Seu apelido "%s" já existe." - -#: includes/pages/guest_login.php:60 -#, php-format -msgid "Your nick "%s" is too short (min. 2 characters)." -msgstr "Seu apelido "%s" é muito pequeno (mínimo 2 caracteres)." - -#: includes/pages/guest_login.php:86 includes/pages/user_settings.php:36 -msgid "Please check your jabber account information." -msgstr "Por favor verifique a informação da sua conta jabber." - -#: includes/pages/guest_login.php:95 -msgid "Please select your shirt size." -msgstr "Por favor escolha o tamanho da camisa." - -#: includes/pages/guest_login.php:106 -#, php-format -msgid "Your password is too short (please use at least %s characters)." -msgstr "Sua senha é muito curta (por favor use pelo menos %s caracteres)." - -#: includes/pages/guest_login.php:115 includes/pages/user_settings.php:52 -msgid "" -"Please enter your planned date of arrival. It should be after the buildup " -"start date and before teardown end date." -msgstr "" -"Por favor insira a data planejada para sua chegada. Ela deve ser posterior à " -"data de montagem e anterior à data de desmontagem." - -#: includes/pages/guest_login.php:189 -msgid "Angel registration successful!" -msgstr "Conta criada com sucesso!" - -#: includes/pages/guest_login.php:217 -msgid "" -"By completing this form you're registering as a Chaos-Angel. This script " -"will create you an account in the angel task scheduler." -msgstr "" -"Ao completar esse formulário você estará se registrando como um voluntário. " -"Esse script criará uma conta no sistema." - -#: includes/pages/guest_login.php:229 includes/view/User_view.php:50 -#, php-format -msgid "" -"The %s is allowed to send me an email (e.g. when my shifts change)" -msgstr "" -"Permito que o %s me envie emails (por exemplo, quando meus turnos " -"mudam)" - -#: includes/pages/guest_login.php:230 includes/view/User_view.php:51 -msgid "Humans are allowed to send me an email (e.g. for ticket vouchers)" -msgstr "Permito que humanos me enviem emails (por exemplo, para um voucher)" - -#: includes/pages/guest_login.php:235 includes/view/User_view.php:43 -msgid "Planned date of arrival" -msgstr "Data planejada de chegada" - -#: includes/pages/guest_login.php:238 includes/view/User_view.php:54 -msgid "Shirt size" -msgstr "Tamanho da camiseta" - -#: includes/pages/guest_login.php:243 includes/pages/guest_login.php:355 -#: includes/view/User_view.php:98 includes/view/User_view.php:400 -msgid "Password" -msgstr "Senha" - -#: includes/pages/guest_login.php:246 includes/view/User_view.php:401 -msgid "Confirm password" -msgstr "Confirme a senha" - -#: includes/pages/guest_login.php:249 -msgid "What do you want to do?" -msgstr "O que você gostaria de fazer?" - -#: includes/pages/guest_login.php:249 -msgid "Description of job types" -msgstr "Descrição dos trabalhos" - -#: includes/pages/guest_login.php:250 -msgid "" -"Restricted angel types need will be confirmed later by a supporter. You can " -"change your selection in the options section." -msgstr "" -"Tipos de anjo restritos precisam de confirmação posterior de um apoiador. " -"Você pode \n" -"mudar sua seleção na seção 'Opções'." - -#: includes/pages/guest_login.php:258 includes/view/User_view.php:48 -msgid "Mobile" -msgstr "Celular" - -#: includes/pages/guest_login.php:261 includes/view/User_view.php:46 -msgid "Phone" -msgstr "Telefone" - -#: includes/pages/guest_login.php:267 includes/view/User_view.php:42 -msgid "First name" -msgstr "Nome" - -#: includes/pages/guest_login.php:270 includes/view/User_view.php:41 -msgid "Last name" -msgstr "Sobrenome" - -#: includes/pages/guest_login.php:275 includes/view/User_view.php:45 -msgid "Age" -msgstr "Idade" - -#: includes/pages/guest_login.php:278 includes/view/User_view.php:53 -msgid "Hometown" -msgstr "Cidade" - -#: includes/pages/guest_login.php:281 includes/view/User_view.php:39 -msgid "Entry required!" -msgstr "Campo necessário!" - -#: includes/pages/guest_login.php:319 -msgid "auth.no-password" -msgstr "Por favor digite uma senha." - -#: includes/pages/guest_login.php:323 -msgid "auth.not-found" -msgstr "" -"Nenhum usuário foi encontrado. Por favor tente novamente. \n" -"Se você continuar com problemas, pergunte a um Dispatcher." - -#: includes/pages/guest_login.php:327 -msgid "auth.no-nickname" -msgstr "Por favor digite um apelido." - -#: includes/pages/guest_login.php:358 includes/view/User_view.php:101 -msgid "I forgot my password" -msgstr "Esqueci minha senha" - -#: includes/pages/guest_login.php:363 includes/view/User_view.php:103 -msgid "Please note: You have to activate cookies!" -msgstr "Nota: você precisa habilitar cookies!" - -#: includes/pages/guest_login.php:374 includes/view/User_view.php:107 -msgid "What can I do?" -msgstr "O que posso fazer?" - -#: includes/pages/guest_login.php:375 includes/view/User_view.php:108 -msgid "Please read about the jobs you can do to help us." -msgstr "Por favor leia sobre as tarefas que pode realizar para nos ajudar." - -#: includes/pages/guest_login.php:390 -msgid "Please sign up, if you want to help us!" -msgstr "Se você quer nos ajudar, por favor se registre!" - -#: includes/pages/user_messages.php:4 -msgid "Messages" -msgstr "Mensagens" - -#: includes/pages/user_messages.php:26 -msgid "Select recipient..." -msgstr "Selecionar recipiente..." - -#: includes/pages/user_messages.php:62 -msgid "mark as read" -msgstr "marcar como lido" - -#: includes/pages/user_messages.php:65 -msgid "delete message" -msgstr "apagar mensagem" - -#: includes/pages/user_messages.php:72 -#, php-format -msgid "Hello %s, here can you leave messages for other angels" -msgstr "Oi %s, aqui você pode deixar mensagens para outros anjos." - -#: includes/pages/user_messages.php:75 -msgid "New" -msgstr "Nova" - -#: includes/pages/user_messages.php:77 -msgid "Transmitted" -msgstr "Enviado" - -#: includes/pages/user_messages.php:78 -msgid "Recipient" -msgstr "Recipiente" - -#: includes/pages/user_messages.php:90 includes/pages/user_messages.php:106 -msgid "Incomplete call, missing Message ID." -msgstr "Chamada incompleta, falta o ID da Mensagem." - -#: includes/pages/user_messages.php:98 includes/pages/user_messages.php:114 -msgid "No Message found." -msgstr "Nenhuma mensagem encontrada." - -#: includes/pages/user_messages.php:122 -msgid "Transmitting was terminated with an Error." -msgstr "Transmissão encerrada com um erro." - -#: includes/pages/user_messages.php:127 -msgid "Wrong action." -msgstr "Ação errada." - -#: includes/pages/user_myshifts.php:23 -msgid "Key changed." -msgstr "Chave modificada." - -#: includes/pages/user_myshifts.php:26 includes/view/User_view.php:335 -msgid "Reset API key" -msgstr "Resetar a chave API" - -#: includes/pages/user_myshifts.php:27 -msgid "" -"If you reset the key, the url to your iCal- and JSON-export and your atom " -"feed changes! You have to update it in every application using one of these " -"exports." -msgstr "" -"Se você reconfigurar a chave, as urls para seu iCal, a exportação em formato " -"JSON \n" -"e seu feed atom será alterada! Você precisará atualizá-las em todas as " -"aplicações que estiverem \n" -"usando uma delas." - -#: includes/pages/user_myshifts.php:28 -msgid "Continue" -msgstr "Continuar" - -#: includes/pages/user_myshifts.php:60 -msgid "Please enter a freeload comment!" -msgstr "Por favor insira um comentário freeload!" - -#: includes/pages/user_myshifts.php:79 -msgid "Shift saved." -msgstr "Turno salvo." - -#: includes/pages/user_myshifts.php:107 -msgid "Shift canceled." -msgstr "Turno cancelado." - -#: includes/pages/user_myshifts.php:109 -msgid "" -"It's too late to sign yourself off the shift. If neccessary, ask the " -"dispatcher to do so." -msgstr "" -"Está muito tarde para se retirar deste turno. Se necessário, peça a \n" -"um dispatcher para removê-lo." - -#: includes/pages/user_news.php:4 -msgid "News comments" -msgstr "Novos comentários" - -#: includes/pages/user_news.php:8 -msgid "News" -msgstr "Novidades" - -#: includes/pages/user_news.php:12 -msgid "Meetings" -msgstr "Encontros" - -#: includes/pages/user_news.php:68 -msgid "Comments" -msgstr "Comentários" - -#: includes/pages/user_news.php:86 includes/pages/user_news.php:127 -msgid "Entry saved." -msgstr "Entrada salva." - -#: includes/pages/user_news.php:104 -msgid "New Comment:" -msgstr "Novo comentário:" - -#: includes/pages/user_news.php:110 -msgid "Invalid request." -msgstr "Requisição inválida." - -#: includes/pages/user_news.php:158 -msgid "Create news:" -msgstr "Criar novidades:" - -#: includes/pages/user_questions.php:4 includes/view/Questions_view.php:29 -msgid "Ask the Heaven" -msgstr "Pergunte ao paraíso" - -#: includes/pages/user_questions.php:27 -msgid "Unable to save question." -msgstr "Não foi possível salvar a sua pergunta." - -#: includes/pages/user_questions.php:29 -msgid "You question was saved." -msgstr "Sua pergunta foi salva." - -#: includes/pages/user_questions.php:33 -msgid "Please enter a question!" -msgstr "Por favor digite sua dúvida!" - -#: includes/pages/user_questions.php:41 -msgid "Incomplete call, missing Question ID." -msgstr "Chamada incompletada, falta o ID da pergunta." - -#: includes/pages/user_questions.php:50 -msgid "No question found." -msgstr "Nenhuma dúvida encontrada." - -#: includes/pages/user_settings.php:4 includes/view/User_view.php:332 -msgid "Settings" -msgstr "Configurações" - -#: includes/pages/user_settings.php:62 -msgid "" -"Please enter your planned date of departure. It should be after your planned " -"arrival date and after buildup start date and before teardown end date." -msgstr "" -"Por favor digite sua data de saída. Ela deve ser posterior à data de " -"chegada\n" -"e ao início da montagem, e anterior à data de desmontagem." - -#: includes/pages/user_settings.php:93 -msgid "-> not OK. Please try again." -msgstr "-> não OK. Por favor tente novamente." - -#: includes/pages/user_settings.php:101 -msgid "Failed setting password." -msgstr "A alteração da senha falhaou." - -#: includes/pages/user_settings.php:126 -msgid "Theme changed." -msgstr "Tema alterado." - -#: includes/pages/user_shifts.php:82 -msgid "The administration has not configured any rooms yet." -msgstr "O administrador não configurou nenhuma sala ainda." - -#: includes/pages/user_shifts.php:94 -msgid "The administration has not configured any shifts yet." -msgstr "O administrador não configurou nenhum turno ainda." - -#: includes/pages/user_shifts.php:104 -msgid "" -"The administration has not configured any angeltypes yet - or you are not " -"subscribed to any angeltype." -msgstr "" -"O administrador ainda não configurou os tipos de anjos - ou você não está\n" -"inscrito em nenhum tipo de anjo." - -#: includes/pages/user_shifts.php:142 -msgid "occupied" -msgstr "ocupado" - -#: includes/pages/user_shifts.php:146 -msgid "free" -msgstr "livre" - -#: includes/pages/user_shifts.php:165 -msgid "Occupancy" -msgstr "Ocupação" - -#: includes/pages/user_shifts.php:166 -msgid "" -"The tasks shown here are influenced by the angeltypes you joined already!" -msgstr "" -"As tarefas mostradas aqui são influenciadas pelos tipos de anjos de que você " -"já faz parte!" - -#: includes/pages/user_shifts.php:166 -msgid "Description of the jobs." -msgstr "Descrição dos trabalhos." - -#: includes/pages/user_shifts.php:168 -msgid "iCal export" -msgstr "Exportar iCal" - -#: includes/pages/user_shifts.php:168 -#, php-format -msgid "" -"Export of shown shifts. iCal format or JSON format available (please keep secret, otherwise reset the api key)." -msgstr "" -"Exportar os turnos mostrados. formato iCal ou formato JSON disponíveis (por favor mantenha secreto, ou resete a chave API)." - -#: includes/pages/user_shifts.php:169 -msgid "Filter" -msgstr "Filtro" - -#: includes/pages/user_shifts.php:191 includes/view/ShiftTypes_view.php:23 -msgid "All" -msgstr "Todos" - -#: includes/pages/user_shifts.php:192 -msgid "None" -msgstr "Nenhum" - -#: includes/sys_menu.php:139 -msgid "Admin" -msgstr "Admin" - -#: includes/sys_menu.php:163 -msgid "Manage rooms" -msgstr "Gerenciar salas" - -#: includes/sys_template.php:166 -msgid "No data found." -msgstr "Nenhum dado encontrado." - -#: includes/view/AngelTypes_view.php:27 includes/view/AngelTypes_view.php:244 -msgid "Unconfirmed" -msgstr "Não confirmado" - -#: includes/view/AngelTypes_view.php:29 includes/view/AngelTypes_view.php:33 -msgid "Supporter" -msgstr "Apoiador" - -#: includes/view/AngelTypes_view.php:31 includes/view/AngelTypes_view.php:35 -msgid "Member" -msgstr "Membro" - -#: includes/view/AngelTypes_view.php:42 -#, php-format -msgid "Do you want to delete angeltype %s?" -msgstr "Você deseja apagar o tipo de anjo %s?" - -#: includes/view/AngelTypes_view.php:44 includes/view/ShiftTypes_view.php:15 -#: includes/view/UserAngelTypes_view.php:8 -#: includes/view/UserAngelTypes_view.php:19 -#: includes/view/UserAngelTypes_view.php:30 -#: includes/view/UserAngelTypes_view.php:41 -#: includes/view/UserAngelTypes_view.php:52 -#: includes/view/UserAngelTypes_view.php:82 -msgid "cancel" -msgstr "cancelar" - -#: includes/view/AngelTypes_view.php:67 includes/view/AngelTypes_view.php:269 -msgid "Restricted" -msgstr "Restrito" - -#: includes/view/AngelTypes_view.php:68 -msgid "No Self Sign Up" -msgstr "Auto inscrição não permitida" - -#: includes/view/AngelTypes_view.php:69 -msgid "Requires driver license" -msgstr "Requer carteira de motorista" - -#: includes/view/AngelTypes_view.php:73 -msgid "" -"Restricted angel types can only be used by an angel if enabled by a " -"supporter (double opt-in)." -msgstr "" -"Tipos de anjo restritos só podem ser usados por um anjo quando autorizados " -"por \n" -"um apoiador (duplo opt-in)." - -#: includes/view/AngelTypes_view.php:74 includes/view/AngelTypes_view.php:205 -#: includes/view/ShiftTypes_view.php:37 includes/view/ShiftTypes_view.php:58 -#: includes/view/Shifts_view.php:92 -msgid "Description" -msgstr "Descrição" - -#: includes/view/AngelTypes_view.php:75 includes/view/ShiftTypes_view.php:38 -msgid "Please use markdown for the description." -msgstr "Por favor use markdown para a descrição." - -#: includes/view/AngelTypes_view.php:90 -msgid "my driving license" -msgstr "Minha carteira de motorista" - -#: includes/view/AngelTypes_view.php:97 -msgid "" -"This angeltype requires a driver license. Please enter your driver license " -"information!" -msgstr "" -"Esse tipo de anjo requer carteira de motorista. Por favor digite sua " -"carteira de motorista." - -#: includes/view/AngelTypes_view.php:101 -#, php-format -msgid "" -"You are unconfirmed for this angeltype. Please go to the introduction for %s " -"to get confirmed." -msgstr "" -"Você não está confirmado para esse tipo de anjo. Por favor vá para a " -"apresentação para %s\n" -"para ser confirmado." - -#: includes/view/AngelTypes_view.php:140 -msgid "confirm" -msgstr "confirmar" - -#: includes/view/AngelTypes_view.php:141 -msgid "deny" -msgstr "rejeitar" - -#: includes/view/AngelTypes_view.php:157 -msgid "remove" -msgstr "remover" - -#: includes/view/AngelTypes_view.php:179 -msgid "Driver" -msgstr "Motorista" - -#: includes/view/AngelTypes_view.php:180 -msgid "Has car" -msgstr "Tem carro" - -#: includes/view/AngelTypes_view.php:181 -#: includes/view/UserDriverLicenses_view.php:27 -msgid "Car" -msgstr "Carro" - -#: includes/view/AngelTypes_view.php:182 -msgid "3,5t Transporter" -msgstr "Transporte 3,5t" - -#: includes/view/AngelTypes_view.php:183 -msgid "7,5t Truck" -msgstr "Caminhão 7,5t" - -#: includes/view/AngelTypes_view.php:184 -msgid "12,5t Truck" -msgstr "Caminhão 12,5t" - -#: includes/view/AngelTypes_view.php:185 -#: includes/view/UserDriverLicenses_view.php:31 -msgid "Forklift" -msgstr "Empilhadeira" - -#: includes/view/AngelTypes_view.php:215 -msgid "Supporters" -msgstr "Apoiadores" - -#: includes/view/AngelTypes_view.php:235 -msgid "Members" -msgstr "Membros" - -#: includes/view/AngelTypes_view.php:238 -#: includes/view/UserAngelTypes_view.php:72 -msgid "Add" -msgstr "Adicionar" - -#: includes/view/AngelTypes_view.php:246 -msgid "confirm all" -msgstr "confirmar todos" - -#: includes/view/AngelTypes_view.php:247 -msgid "deny all" -msgstr "rejeitar todos" - -#: includes/view/AngelTypes_view.php:264 -msgid "New angeltype" -msgstr "Novo tipo de anjo" - -#: includes/view/AngelTypes_view.php:270 -msgid "Self Sign Up Allowed" -msgstr "Auto Inscrição autorizada" - -#: includes/view/AngelTypes_view.php:271 -msgid "Membership" -msgstr "Membro" - -#: includes/view/AngelTypes_view.php:296 -msgid "" -"This angeltype is restricted by double-opt-in by a team supporter. Please " -"show up at the according introduction meetings." -msgstr "" -"Esse tipo de anjo é restrito por um opt-in duplo por um time de apoio. Por " -"favor\n" -"compareça de acordo com os encontros de introdução." - -#: includes/view/AngelTypes_view.php:317 -msgid "FAQ" -msgstr "FAQ" - -#: includes/view/AngelTypes_view.php:319 -msgid "" -"Here is the list of teams and their tasks. If you have questions, read the " -"FAQ." -msgstr "" -"Aqui está uma lista dos times e suas tarefas. Se você tem dúvidas, leia a\n" -"FAQ." - -#: includes/view/EventConfig_view.php:10 includes/view/EventConfig_view.php:18 -#, php-format -msgid "Welcome to the %s!" -msgstr "Bem vindo a %s!" - -#: includes/view/EventConfig_view.php:24 -msgid "Buildup starts" -msgstr "Início da montagem" - -#: includes/view/EventConfig_view.php:26 includes/view/EventConfig_view.php:34 -#: includes/view/EventConfig_view.php:42 includes/view/EventConfig_view.php:50 -#: includes/view/EventConfig_view.php:67 includes/view/EventConfig_view.php:72 -#: includes/view/EventConfig_view.php:77 includes/view/Shifts_view.php:68 -#: includes/view/Shifts_view.php:76 -msgid "Y-m-d" -msgstr "d/m/Y" - -#: includes/view/EventConfig_view.php:32 -msgid "Event starts" -msgstr "O evento começa em" - -#: includes/view/EventConfig_view.php:40 -msgid "Event ends" -msgstr "O evento termina em" - -#: includes/view/EventConfig_view.php:48 -msgid "Teardown ends" -msgstr "Desmontagem termina" - -#: includes/view/EventConfig_view.php:67 -#, php-format -msgid "%s, from %s to %s" -msgstr "%s, de %s para %s" - -#: includes/view/EventConfig_view.php:72 -#, php-format -msgid "%s, starting %s" -msgstr "%s, começando %s" - -#: includes/view/EventConfig_view.php:77 -#, php-format -msgid "Event from %s to %s" -msgstr "Evento de %s para %s" - -#: includes/view/EventConfig_view.php:106 -msgid "Event Name" -msgstr "Nome do evento" - -#: includes/view/EventConfig_view.php:107 -msgid "Event Name is shown on the start page." -msgstr "Nome do evento é mostrado na página inicial." - -#: includes/view/EventConfig_view.php:108 -msgid "Event Welcome Message" -msgstr "Mensagem de boas vindas do evento" - -#: includes/view/EventConfig_view.php:109 -msgid "" -"Welcome message is shown after successful registration. You can use markdown." -msgstr "" -"A mensagem de boas vindas é mostrada após a inscrição. Você pode usar " -"markdown." - -#: includes/view/EventConfig_view.php:112 -msgid "Buildup date" -msgstr "Data da montagem" - -#: includes/view/EventConfig_view.php:113 -msgid "Event start date" -msgstr "Data de início do evento" - -#: includes/view/EventConfig_view.php:116 -msgid "Teardown end date" -msgstr "Data da desmontagem" - -#: includes/view/EventConfig_view.php:117 -msgid "Event end date" -msgstr "Data de término do evento" - -#: includes/view/Questions_view.php:17 -msgid "Open questions" -msgstr "Dúvidas abertas" - -#: includes/view/Questions_view.php:31 -msgid "Your Question:" -msgstr "Sua dúvida:" - -#: includes/view/ShiftCalendarRenderer.php:209 includes/view/User_view.php:367 -msgid "Time" -msgstr "Hora" - -#: includes/view/ShiftCalendarRenderer.php:248 -msgid "Your shift" -msgstr "Seu turno" - -#: includes/view/ShiftCalendarRenderer.php:249 -msgid "Help needed" -msgstr "Necessita ajuda" - -#: includes/view/ShiftCalendarRenderer.php:250 -msgid "Other angeltype needed / collides with my shifts" -msgstr "Outro tipo de anjo necessário / colide com seus turnos" - -#: includes/view/ShiftCalendarRenderer.php:251 -msgid "Shift is full" -msgstr "O turno está lotado" - -#: includes/view/ShiftCalendarRenderer.php:252 -msgid "Shift running/ended" -msgstr "Turno em andamento/finalizado" - -#: includes/view/ShiftCalendarShiftRenderer.php:96 -msgid "Add more angels" -msgstr "Adicionar mais anjos" - -#: includes/view/ShiftCalendarShiftRenderer.php:127 -#, php-format -msgid "%d helper needed" -msgid_plural "%d helpers needed" -msgstr[0] "%d necessita de ajuda" -msgstr[1] "%d necessitam de ajuda" - -#: includes/view/ShiftCalendarShiftRenderer.php:132 -#: includes/view/Shifts_view.php:23 -msgid "Sign up" -msgstr "Registrar" - -#: includes/view/ShiftCalendarShiftRenderer.php:137 -msgid "ended" -msgstr "encerrado" - -#: includes/view/ShiftCalendarShiftRenderer.php:146 -#: includes/view/Shifts_view.php:25 -#, php-format -msgid "Become %s" -msgstr "Tornar-se %s" - -#: includes/view/ShiftEntry_view.php:18 includes/view/User_view.php:267 -#: includes/view/User_view.php:269 -msgid "Freeloaded" -msgstr "Freeloaded" - -#: includes/view/ShiftEntry_view.php:19 -msgid "Freeload comment (Only for shift coordination):" -msgstr "Comentário freeload (Apenas para coordenação de turno):" - -#: includes/view/ShiftEntry_view.php:22 -msgid "Edit shift entry" -msgstr "Editar entrada de turno" - -#: includes/view/ShiftEntry_view.php:25 -msgid "Angel:" -msgstr "Anjo:" - -#: includes/view/ShiftEntry_view.php:26 -msgid "Date, Duration:" -msgstr "Data, Duração:" - -#: includes/view/ShiftEntry_view.php:27 -msgid "Location:" -msgstr "Local:" - -#: includes/view/ShiftEntry_view.php:28 -msgid "Title:" -msgstr "Título:" - -#: includes/view/ShiftEntry_view.php:29 -msgid "Type:" -msgstr "Tipo:" - -#: includes/view/ShiftEntry_view.php:30 -msgid "Comment (for your eyes only):" -msgstr "Comentário (apenas para ler):" - -#: includes/view/ShiftTypes_view.php:13 -#, php-format -msgid "Do you want to delete shifttype %s?" -msgstr "Você quer apagar o turno %s?" - -#: includes/view/ShiftTypes_view.php:29 -msgid "Edit shifttype" -msgstr "Editar tipo de turno" - -#: includes/view/ShiftTypes_view.php:29 -msgid "Create shifttype" -msgstr "Criar tipo de turno" - -#: includes/view/ShiftTypes_view.php:48 -#, php-format -msgid "for team %s" -msgstr "para o time %s" - -#: includes/view/ShiftTypes_view.php:75 -msgid "New shifttype" -msgstr "Novo tipo de turno" - -#: includes/view/Shifts_view.php:7 -#, php-format -msgid "created at %s by %s" -msgstr "criado em %s por %s" - -#: includes/view/Shifts_view.php:10 -#, php-format -msgid "edited at %s by %s" -msgstr "editado em %s por %s" - -#: includes/view/Shifts_view.php:52 -msgid "This shift collides with one of your shifts." -msgstr "Esse turno colide com um dos seus outros turnos." - -#: includes/view/Shifts_view.php:53 -msgid "You are signed up for this shift." -msgstr "Você foi designado para esse turno." - -#: includes/view/Shifts_view.php:82 includes/view/User_view.php:368 -msgid "Location" -msgstr "Local" - -#: includes/view/UserAngelTypes_view.php:6 -#, php-format -msgid "Do you really want to add supporter rights for %s to %s?" -msgstr "Você realmente quer dar permissão de apoiador de %s para %s?" - -#: includes/view/UserAngelTypes_view.php:6 -#, php-format -msgid "Do you really want to remove supporter rights for %s from %s?" -msgstr "Você realmente quer remover a permissão de apoiador de %s para %s?" - -#: includes/view/UserAngelTypes_view.php:17 -#, php-format -msgid "Do you really want to deny all users for %s?" -msgstr "Você realmente quer negar todos os usuários para %s?" - -#: includes/view/UserAngelTypes_view.php:28 -#, php-format -msgid "Do you really want to confirm all users for %s?" -msgstr "Você realmente quer confirmar todos os usuários para %s?" - -#: includes/view/UserAngelTypes_view.php:39 -#, php-format -msgid "Do you really want to confirm %s for %s?" -msgstr "Você realmente quer confirmar %s para %s?" - -#: includes/view/UserAngelTypes_view.php:50 -#, php-format -msgid "Do you really want to delete %s from %s?" -msgstr "Você realmente quer apagar %s de %s?" - -#: includes/view/UserAngelTypes_view.php:71 -msgid "User" -msgstr "Usuário" - -#: includes/view/UserAngelTypes_view.php:80 -#, php-format -msgid "Do you really want to add %s to %s?" -msgstr "Você realmente quer adicionar %s em %s?" - -#: includes/view/UserAngelTypes_view.php:83 -msgid "save" -msgstr "salvar" - -#: includes/view/UserDriverLicenses_view.php:17 -msgid "Back to profile" -msgstr "Voltar para o perfil" - -#: includes/view/UserDriverLicenses_view.php:21 -msgid "Privacy" -msgstr "Privacidade" - -#: includes/view/UserDriverLicenses_view.php:21 -msgid "" -"Your driving license information is only visible for supporters and admins." -msgstr "" -"Os dados da sua carteira de motorista são apenas visíveis para os apoiadores " -"e os admins." - -#: includes/view/UserDriverLicenses_view.php:22 -msgid "I am willing to drive a car for the event" -msgstr "Eu desejo dirigir carros para o evento" - -#: includes/view/UserDriverLicenses_view.php:25 -msgid "" -"I have my own car with me and am willing to use it for the event (You'll get " -"reimbursed for fuel)" -msgstr "" -"Eu tenho meu próprio carro e estou disposto a usá-lo no evento\n" -"(Você terá o combustível reembolsado)" - -#: includes/view/UserDriverLicenses_view.php:26 -msgid "Driver license" -msgstr "Carteira de motorista" - -#: includes/view/UserDriverLicenses_view.php:28 -msgid "Transporter 3,5t" -msgstr "Transportador 3,5t" - -#: includes/view/UserDriverLicenses_view.php:29 -msgid "Truck 7,5t" -msgstr "Caminhão 7,5t" - -#: includes/view/UserDriverLicenses_view.php:30 -msgid "Truck 12,5t" -msgstr "Caminhão 12,5t" - -#: includes/view/User_view.php:7 -msgid "Please select..." -msgstr "Por favor selecione..." - -#: includes/view/User_view.php:38 -msgid "Here you can change your user details." -msgstr "Aqui você pode mudar os seus detalhes de usuário." - -#: includes/view/User_view.php:44 -msgid "Planned date of departure" -msgstr "Data planejada para saída" - -#: includes/view/User_view.php:55 -msgid "Please visit the angeltypes page to manage your angeltypes." -msgstr "" -"Por favor visite a página de tipos de anjo para gerenciar os tipos de anjo" - -#: includes/view/User_view.php:61 -msgid "Here you can change your password." -msgstr "Aqui você pode mudar sua senha." - -#: includes/view/User_view.php:62 -msgid "Old password:" -msgstr "Senha antiga:" - -#: includes/view/User_view.php:63 -msgid "New password:" -msgstr "Nova senha:" - -#: includes/view/User_view.php:64 -msgid "Password confirmation:" -msgstr "Confirmação de senha:" - -#: includes/view/User_view.php:68 -msgid "Here you can choose your color settings:" -msgstr "Aqui você pode selecionar sua configuração de cor:" - -#: includes/view/User_view.php:69 -msgid "Color settings:" -msgstr "Configuração de cor:" - -#: includes/view/User_view.php:73 -msgid "Here you can choose your language:" -msgstr "Aqui você pode selecionar seu idioma:" - -#: includes/view/User_view.php:74 -msgid "Language:" -msgstr "Idioma:" - -#: includes/view/User_view.php:88 -msgid "Registration successful" -msgstr "Registrado com sucesso" - -#: includes/view/User_view.php:126 -msgid "" -"Do you really want to delete the user including all his shifts and every " -"other piece of his data?" -msgstr "" -"Você realmente quer apagar o usuário, incluindo todos seus turnos e todos\n" -"os seus dados?" - -#: includes/view/User_view.php:128 -msgid "Your password" -msgstr "Sua senha" - -#: includes/view/User_view.php:143 -#, php-format -msgid "Angel should receive at least %d vouchers." -msgstr "Um anjo deve receber no mínimo %d vouchers." - -#: includes/view/User_view.php:145 -msgid "Number of vouchers given out" -msgstr "Número de vouchers dados" - -#: includes/view/User_view.php:159 -msgid "m/d/Y h:i a" -msgstr "d/m/Y H:i" - -#: includes/view/User_view.php:178 -msgid "New user" -msgstr "Novo usuário" - -#: includes/view/User_view.php:182 -msgid "Prename" -msgstr "Nome" - -#: includes/view/User_view.php:185 includes/view/User_view.php:350 -msgid "Arrived" -msgstr "Chegou" - -#: includes/view/User_view.php:186 -msgid "Voucher" -msgstr "Voucher" - -#: includes/view/User_view.php:187 -msgid "Freeloads" -msgstr "Freeloads" - -#: includes/view/User_view.php:188 includes/view/User_view.php:352 -msgid "Active" -msgstr "Ativo" - -#: includes/view/User_view.php:190 includes/view/User_view.php:353 -msgid "T-Shirt" -msgstr "Camiseta" - -#: includes/view/User_view.php:192 -msgid "Last login" -msgstr "Último login" - -#: includes/view/User_view.php:209 -msgid "Free" -msgstr "Livre" - -#: includes/view/User_view.php:214 includes/view/User_view.php:216 -#, php-format -msgid "Next shift %c" -msgstr "Próximo turno %c" - -#: includes/view/User_view.php:221 -#, php-format -msgid "Shift starts %c" -msgstr "Turno inicia em %c" - -#: includes/view/User_view.php:223 -#, php-format -msgid "Shift ends %c" -msgstr "Turno termina em %c" - -#: includes/view/User_view.php:280 -msgid "sign off" -msgstr "sair" - -#: includes/view/User_view.php:305 -msgid "Sum:" -msgstr "Soma:" - -#: includes/view/User_view.php:329 -msgid "driving license" -msgstr "carteira de motorista" - -#: includes/view/User_view.php:331 -msgid "Edit vouchers" -msgstr "Editar vouchers" - -#: includes/view/User_view.php:333 -msgid "iCal Export" -msgstr "Exportar iCal" - -#: includes/view/User_view.php:334 -msgid "JSON Export" -msgstr "Exportar em formato JSON" - -#: includes/view/User_view.php:347 -msgid "User state" -msgstr "Status" - -#: includes/view/User_view.php:350 -#, php-format -msgid "Arrived at %s" -msgstr "Chegous às %s" - -#: includes/view/User_view.php:350 -#, php-format -msgid "Not arrived (Planned: %s)" -msgstr "Não chegou (Planejado: %s)" - -#: includes/view/User_view.php:350 -msgid "Not arrived" -msgstr "Não chegou" - -#: includes/view/User_view.php:351 -#, php-format -msgid "Got %s voucher" -msgid_plural "Got %s vouchers" -msgstr[0] "Einen Voucher bekommen" -msgstr[1] "%s Voucher bekommen" - -#: includes/view/User_view.php:351 -msgid "Got no vouchers" -msgstr "Pegou voucher %s" - -#: includes/view/User_view.php:360 -msgid "Rights" -msgstr "Permissões" - -#: includes/view/User_view.php:369 -msgid "Name & workmates" -msgstr "Nome & colegas" - -#: includes/view/User_view.php:370 -msgid "Comment" -msgstr "Comentar" - -#: includes/view/User_view.php:371 -msgid "Action" -msgstr "Ação" - -#: includes/view/User_view.php:373 -#, php-format -msgid "Your night shifts between %d and %d am count twice." -msgstr "Os seus turnos noturnos entre %dh e %dh contam como dois." - -#: includes/view/User_view.php:374 -#, php-format -msgid "" -"Go to the shifts table to sign yourself up for some " -"shifts." -msgstr "" -"Vá para a tabela de turnos para se inscrever em alguns\n" -"turnos." - -#: includes/view/User_view.php:384 -msgid "" -"We will send you an e-mail with a password recovery link. Please use the " -"email address you used for registration." -msgstr "" -"Nós enviaremos um email com um link para recuperação de senha. Por favor use " -"o \n" -"endereço de email informado no seu registro." - -#: includes/view/User_view.php:387 -msgid "Recover" -msgstr "Recuperar" - -#: includes/view/User_view.php:398 -msgid "Please enter a new password." -msgstr "Por favor digite uma nova senha." - -#: includes/view/User_view.php:447 -msgid "" -"Please enter your planned date of departure on your settings page to give us " -"a feeling for teardown capacities." -msgstr "" -"Por favor digite sua data planejada de saída na sua página de configurações " -"para\n" -"termos uma noção da nossa capacidade de desmontagem." - -#: includes/view/User_view.php:457 -#, php-format -msgid "" -"You freeloaded at least %s shifts. Shift signup is locked. Please go to " -"heavens desk to be unlocked again." -msgstr "" -"Você deixou de participar de pelo menos %s dos turnos. O registro em turnos " -"está suspenso.\n" -"Por favor vá até a mesa do paraíso para ser desbloqueado novamente." - -#: includes/view/User_view.php:468 -msgid "" -"You are not marked as arrived. Please go to heaven's desk, get your angel " -"badge and/or tell them that you arrived already." -msgstr "" -"Sua chegada não foi marcada. Por favor vá até a mesa do paraíso, pegue sua " -"credencial\n" -"de anjo e/ou informe que você já chegou." - -#: includes/view/User_view.php:478 -msgid "You need to specify a tshirt size in your settings!" -msgstr "Você precisa especificar o tamanho de camiseta nas suas configurações!" - -#: includes/view/User_view.php:488 -msgid "" -"You need to specify a DECT phone number in your settings! If you don't have " -"a DECT phone, just enter \"-\"." -msgstr "" -"Você precisa especificar um número DECT de telefone nas suas configuracões!\n" -"Se você não tem um telefone DECT, apenas digite \\-\\." - -#: public/index.php:155 -msgid "No Access" -msgstr "Sem acesso" - -#: public/index.php:156 -msgid "" -"You don't have permission to view this page. You probably have to sign in or " -"register in order to gain access!" -msgstr "" -"Você não tem permissão para ver essa página. Você provavelmente terá que " -"fazer login ou se registrar para ganhar acesso!" - -#~ msgid "Registration is disabled." -#~ msgstr "Registros estão desabilitados." - -#~ msgid "Please enter your planned date of arrival." -#~ msgstr "Por favor digite seu horario planificado de chagada " - -#~ msgid "Password could not be updated." -#~ msgstr "Nao foi possivel atualizar a senha" - -#~ msgid "We got no information about the event right now." -#~ msgstr "Nao tem info sobre o evento agora" - -#~ msgid "from %s to %s" -#~ msgstr "desde %s ate %s" - -#~ msgid "Please enter your planned date of departure." -#~ msgstr "Por favor pone seu horario planificado de ida" - -#~ msgid "Please select a user." -#~ msgstr "Seleciona um usuario" - -#~ msgid "Unable to load user." -#~ msgstr "Nao foi possivel carregar o usuario" - -#~ msgid "Entries" -#~ msgstr "Entradas" - -#~ msgid "Use new style if possible" -#~ msgstr "Usa umo estilo novo se possivel" - -#~ msgid "Coordinator" -#~ msgstr "Coordinador" - -#~ msgid "Coordinators" -#~ msgstr "Coordinadores" - -#~ msgid " vouchers." -#~ msgstr " vouchers." - -#~ msgid "" -#~ "This is a automatically calculated MINIMUM value, you can of course give " -#~ "out more if appropriate!" -#~ msgstr "" -#~ "Esso e' calucula automaticamente o valor MINIMO, voce pode claramente " -#~ "mudar isso com umo mais appropriado! " - -#~ msgid "You have been signed off from the shift." -#~ msgstr "Voce se desconnecto do seu turno" - -#~ msgid "planned departure" -#~ msgstr "saida planejada" - -#~ msgid "Tasks" -#~ msgstr "tarefas" - -#~ msgid "User didnt got vouchers." -#~ msgstr "O usuario nao tem vouchers." - -#~ msgid "Remove vouchers" -#~ msgstr "Apaga voucher" - -#~ msgid "" -#~ "This shift is running now or ended already. Please contact a dispatcher " -#~ "to join the shift." -#~ msgstr "" -#~ "Esse turno esta ativo agora o ja acabou. Por favor contata o coordinador " -#~ "para partecipar nesse turno" - -#~ msgid "" -#~ "You already subscribed to shift in the same timeslot. Please contact a " -#~ "dispatcher to join the shift." -#~ msgstr "" -#~ "Voce ja se registrou al turno no mesmo timeslot. Por favor contata o " -#~ "coordinador para partecipar a esse turno." - -#~ msgid "" -#~ "Hello %s, here you can change your personal settings i.e. password, color " -#~ "settings etc." -#~ msgstr "" -#~ "Oi %s, aqui pode mudar as tuas configuraçeos pessoal (i.e. senha, " -#~ "cor, ...)" - -#~ msgid "Name/Description:" -#~ msgstr "Nome/Descriçao:" - -#~ msgid "Timeslot" -#~ msgstr "Timeslot" - -#~ msgid "The first wants to join %s." -#~ msgstr "O primeiro que quer partecipar %s" - -#~ msgid "Groups" -#~ msgstr "Grupos" - -#~ msgid "ICQ" -#~ msgstr "ICQ" - -#~ msgid "You are not confirmed for this angel type." -#~ msgstr "Voce nao ta confirmado por esse tipo de anjo." - -#~ msgid "Exports" -#~ msgstr "Esporta" - -#~ msgid "Add new angeltype" -#~ msgstr "Adicione um novo tipo de anjo" - -#~ msgid "Language" -#~ msgstr "Idioma" - -#~ msgid "You have %s new message." -#~ msgid_plural "You have %s new messages." -#~ msgstr[0] "Voce tem %s novo message" -#~ msgstr[1] "" - -#~ msgid "" -#~ "These are your shifts.
Please try to appear 15 minutes before " -#~ "your shift begins!
You can remove yourself from a shift up to %d " -#~ "hours before it starts." -#~ msgstr "" -#~ "Esses som teu turnos.
Por favor tenta chegar 15 minudos antes " -#~ "que seu turno comença!
Voce pode se tirar desse turno ate %d horas " -#~ "antes dele començar." - -#~ msgid "Page:" -#~ msgstr "Pagina" - -#~ msgid "Message:" -#~ msgstr "Messagem:" - -#~ msgid "Wakeup" -#~ msgstr "Wakeup" - -#~ msgid "Incomplete call, missing wake-up ID." -#~ msgstr "chamada incompleta, falta o wake-up ID" - -#~ msgid "Wake-up call deleted." -#~ msgstr "wake-up chamada apagada" - -#~ msgid "No wake-up found." -#~ msgstr "Nao encontrei nenhum wake-up" - -#~ msgid "" -#~ "Hello %s, here you can register for a wake-up call. Simply say when and " -#~ "where the angel should come to wake you." -#~ msgstr "" -#~ "Oi %s, aqui voce pode se registrar para a chamada wake-up. So tem que " -#~ "dizer quando e onde os anjos tem que chegar para te acordar (wake up)" - -#~ msgid "All ordered wake-up calls, next first." -#~ msgstr "Todos os ordem wake-up, o proximo primeiro" - -#~ msgid "Place" -#~ msgstr "Lugar" - -#~ msgid "Notes" -#~ msgstr "Notas" - -#~ msgid "Schedule a new wake-up here:" -#~ msgstr "Planifica um novo wake-up aqui:" - -#~ msgid "User %s confirmed as %s." -#~ msgstr "Usuario %s confirmado como %s" - -#~ msgid "" -#~ "Resistance is futile! Your biological and physical parameters will be " -#~ "added to our collectiv! Assimilating angel:" -#~ msgstr "" -#~ "Resistir e' inútil! Seus parâmetros biológico e físico serão adicionados " -#~ "dentro do nosso coletivo! Anjo assimilado: " - -#~ msgid "Confirmed all." -#~ msgstr "Tudo confirmado." - -#~ msgid "asdf" -#~ msgstr "asdf" diff --git a/resources/lang/pt_BR/default.mo b/resources/lang/pt_BR/default.mo new file mode 100644 index 00000000..8b864156 Binary files /dev/null and b/resources/lang/pt_BR/default.mo differ diff --git a/resources/lang/pt_BR/default.po b/resources/lang/pt_BR/default.po new file mode 100644 index 00000000..b9bf420d --- /dev/null +++ b/resources/lang/pt_BR/default.po @@ -0,0 +1,2645 @@ +msgid "" +msgstr "" +"Project-Id-Version: Engelsystem 2.0\n" +"POT-Creation-Date: 2017-04-25 05:23+0200\n" +"PO-Revision-Date: 2018-11-27 00:29+0100\n" +"Last-Translator: samba \n" +"Language-Team: \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.1\n" +"X-Poedit-KeywordsList: _;gettext;gettext_noop\n" +"X-Poedit-Basepath: ../../..\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-SearchPath-0: .\n" + +#: includes/controller/angeltypes_controller.php:7 +#: includes/pages/user_shifts.php:164 includes/view/AngelTypes_view.php:62 +#: includes/view/AngelTypes_view.php:86 includes/view/User_view.php:356 +msgid "Angeltypes" +msgstr "Tipo de Anjo" + +#: includes/controller/angeltypes_controller.php:53 +#: includes/pages/guest_login.php:377 includes/view/AngelTypes_view.php:265 +#: includes/view/AngelTypes_view.php:326 includes/view/User_view.php:110 +msgid "Teams/Job description" +msgstr "Time/Descrição do trabalho" + +#: includes/controller/angeltypes_controller.php:72 +#, php-format +msgid "Angeltype %s deleted." +msgstr "Tipo de anjo %s apagado." + +#: includes/controller/angeltypes_controller.php:77 +#: includes/view/AngelTypes_view.php:41 +#, php-format +msgid "Delete angeltype %s" +msgstr "Apagar tipo de anjo %s" + +#: includes/controller/angeltypes_controller.php:116 +msgid "Please check the name. Maybe it already exists." +msgstr "Por favor verifique o nome. Pode ser que já exista." + +#: includes/controller/angeltypes_controller.php:141 +#: includes/view/AngelTypes_view.php:60 +#, php-format +msgid "Edit %s" +msgstr "Editar %s" + +#: includes/controller/angeltypes_controller.php:162 +#: includes/view/AngelTypes_view.php:252 +#, php-format +msgid "Team %s" +msgstr "Time %s" + +#: includes/controller/angeltypes_controller.php:181 +#: includes/view/User_view.php:274 +msgid "view" +msgstr "ver" + +#: includes/controller/angeltypes_controller.php:185 +#: includes/pages/admin_free.php:71 includes/pages/admin_groups.php:23 +#: includes/pages/admin_rooms.php:16 includes/view/AngelTypes_view.php:107 +#: includes/view/ShiftTypes_view.php:55 includes/view/ShiftTypes_view.php:67 +#: includes/view/Shifts_view.php:55 includes/view/User_view.php:277 +#: includes/view/User_view.php:328 +msgid "edit" +msgstr "editar" + +#: includes/controller/angeltypes_controller.php:186 +#: includes/controller/shifts_controller.php:178 +#: includes/pages/admin_questions.php:42 includes/pages/admin_questions.php:56 +#: includes/pages/admin_rooms.php:17 includes/pages/admin_user.php:120 +#: includes/view/AngelTypes_view.php:45 includes/view/AngelTypes_view.php:110 +#: includes/view/Questions_view.php:5 includes/view/Questions_view.php:12 +#: includes/view/ShiftTypes_view.php:16 includes/view/ShiftTypes_view.php:56 +#: includes/view/ShiftTypes_view.php:68 includes/view/Shifts_view.php:56 +msgid "delete" +msgstr "deletar" + +#: includes/controller/angeltypes_controller.php:191 +#: includes/view/AngelTypes_view.php:103 includes/view/AngelTypes_view.php:288 +msgid "leave" +msgstr "sair" + +#: includes/controller/angeltypes_controller.php:193 +#: includes/view/AngelTypes_view.php:94 includes/view/AngelTypes_view.php:290 +msgid "join" +msgstr "entrar" + +#: includes/controller/angeltypes_controller.php:220 +#: includes/controller/user_angeltypes_controller.php:29 +#: includes/controller/user_angeltypes_controller.php:35 +#: includes/controller/user_angeltypes_controller.php:65 +#: includes/controller/user_angeltypes_controller.php:71 +#: includes/controller/user_angeltypes_controller.php:119 +#: includes/controller/user_angeltypes_controller.php:170 +#: includes/controller/user_angeltypes_controller.php:235 +msgid "Angeltype doesn't exist." +msgstr "Esse tipo de anjo não existe." + +#: includes/controller/event_config_controller.php:4 +msgid "Event config" +msgstr "Configuração do evento" + +#: includes/controller/event_config_controller.php:48 +msgid "Please enter buildup start date." +msgstr "Por favor digite a data de início da montagem." + +#: includes/controller/event_config_controller.php:52 +msgid "Please enter event start date." +msgstr "Por favor digite a data de início do evento." + +#: includes/controller/event_config_controller.php:56 +msgid "Please enter event end date." +msgstr "Por favor digite a data de término do evento." + +#: includes/controller/event_config_controller.php:60 +msgid "Please enter teardown end date." +msgstr "Por favor digite a data de desmontagem do evento" + +#: includes/controller/event_config_controller.php:66 +msgid "The buildup start date has to be before the event start date." +msgstr "A data de montagem deve ser anterior a data de início do evento." + +#: includes/controller/event_config_controller.php:71 +msgid "The event start date has to be before the event end date." +msgstr "" +"A data de início do evento deve ser anterior a data de término do evento." + +#: includes/controller/event_config_controller.php:76 +msgid "The event end date has to be before the teardown end date." +msgstr "A data de término deve ser anterior a data de desmontagem do evento." + +#: includes/controller/event_config_controller.php:81 +msgid "The buildup start date has to be before the teardown end date." +msgstr "A data de montagem deve ser anterior a data de desmontagem do evento." + +#: includes/controller/event_config_controller.php:92 +#: includes/pages/user_settings.php:77 +msgid "Settings saved." +msgstr "Configurações salvas." + +#: includes/controller/shift_entries_controller.php:56 +msgid "" +"You are not allowed to sign up for this shift. Maybe shift is full or " +"already running." +msgstr "" +"Você não tem permissão para se inscrever nesse turno. Talvez o turno esteja " +"lotado ou já esteja em andamento." + +#: includes/controller/shift_entries_controller.php:103 +msgid "You are subscribed. Thank you!" +msgstr "Você já está inscrito. Obrigado!" + +#: includes/controller/shift_entries_controller.php:103 +#: includes/pages/user_myshifts.php:4 +msgid "My shifts" +msgstr "Meus turnos" + +#: includes/controller/shift_entries_controller.php:111 +#: includes/view/User_view.php:348 +msgid "Freeloader" +msgstr "Freeloader" + +#: includes/controller/shift_entries_controller.php:180 +msgid "Shift entry deleted." +msgstr "O turno foi deletado." + +#: includes/controller/shift_entries_controller.php:182 +msgid "Entry not found." +msgstr "Entrada não encontrada." + +#: includes/controller/shifts_controller.php:63 +msgid "Please select a room." +msgstr "Por favor selecione uma sala." + +#: includes/controller/shifts_controller.php:70 +msgid "Please select a shifttype." +msgstr "Por favor selecione um tssipo de turno." + +#: includes/controller/shifts_controller.php:77 +msgid "Please enter a valid starting time for the shifts." +msgstr "Por favor entre com um horário de início válido para os turnos." + +#: includes/controller/shifts_controller.php:84 +msgid "Please enter a valid ending time for the shifts." +msgstr "Por favor entre com um horário de término válido para os turnos." + +#: includes/controller/shifts_controller.php:89 +msgid "The ending time has to be after the starting time." +msgstr "O horário de término deve ser após o horário de início." + +#: includes/controller/shifts_controller.php:97 +#, php-format +msgid "Please check your input for needed angels of type %s." +msgstr "Por favor verifique seu input para os anjos de tipo %s necessários." + +#: includes/controller/shifts_controller.php:120 +msgid "Shift updated." +msgstr "Turno atualizado." + +#: includes/controller/shifts_controller.php:135 +msgid "This page is much more comfortable with javascript." +msgstr "Esta página é muito mais confortável com javascript" + +#: includes/controller/shifts_controller.php:137 +#: includes/pages/admin_import.php:98 includes/pages/admin_shifts.php:319 +msgid "Shifttype" +msgstr "Tipo de turno" + +#: includes/controller/shifts_controller.php:138 +#: includes/pages/admin_import.php:158 includes/pages/admin_import.php:167 +#: includes/pages/admin_import.php:176 includes/pages/admin_shifts.php:320 +#: includes/view/Shifts_view.php:62 +msgid "Title" +msgstr "Título" + +#: includes/controller/shifts_controller.php:139 +msgid "Room:" +msgstr "Sala:" + +#: includes/controller/shifts_controller.php:140 +msgid "Start:" +msgstr "Início:" + +#: includes/controller/shifts_controller.php:141 +msgid "End:" +msgstr "Fim:" + +#: includes/controller/shifts_controller.php:142 +#: includes/pages/admin_shifts.php:270 includes/pages/admin_shifts.php:334 +#: includes/view/Shifts_view.php:88 +msgid "Needed angels" +msgstr "Anjos necessários" + +#: includes/controller/shifts_controller.php:144 +#: includes/pages/admin_groups.php:54 includes/pages/admin_news.php:35 +#: includes/pages/admin_questions.php:40 includes/pages/admin_rooms.php:157 +#: includes/pages/admin_shifts.php:272 includes/pages/user_messages.php:44 +#: includes/pages/user_news.php:107 includes/pages/user_news.php:164 +#: includes/view/AngelTypes_view.php:76 includes/view/EventConfig_view.php:122 +#: includes/view/Questions_view.php:32 includes/view/ShiftEntry_view.php:32 +#: includes/view/ShiftTypes_view.php:39 +#: includes/view/UserDriverLicenses_view.php:34 includes/view/User_view.php:56 +#: includes/view/User_view.php:65 includes/view/User_view.php:70 +#: includes/view/User_view.php:75 includes/view/User_view.php:146 +#: includes/view/User_view.php:402 +msgid "Save" +msgstr "Salvar" + +#: includes/controller/shifts_controller.php:172 +msgid "Shift deleted." +msgstr "Turno deletado." + +#: includes/controller/shifts_controller.php:177 +#, php-format +msgid "Do you want to delete the shift %s from %s to %s?" +msgstr "Você quer deletar o turno %s de %s para %s?" + +#: includes/controller/shifts_controller.php:195 +msgid "Shift could not be found." +msgstr "O turno não pôde ser encontrado." + +#: includes/controller/shifttypes_controller.php:31 +#, php-format +msgid "Shifttype %s deleted." +msgstr "Tipo de turno %s deletado." + +#: includes/controller/shifttypes_controller.php:36 +#: includes/view/ShiftTypes_view.php:12 +#, php-format +msgid "Delete shifttype %s" +msgstr "Apagar tipo de turno %s" + +#: includes/controller/shifttypes_controller.php:58 +msgid "Shifttype not found." +msgstr "Tipo de turno não encontrado." + +#: includes/controller/shifttypes_controller.php:74 +#: includes/pages/admin_rooms.php:71 +msgid "Please enter a name." +msgstr "Por favor digite um nome." + +#: includes/controller/shifttypes_controller.php:94 +msgid "Updated shifttype." +msgstr "Tipo de turno atualizado." + +#: includes/controller/shifttypes_controller.php:101 +msgid "Created shifttype." +msgstr "Tipo de turno criado" + +#: includes/controller/shifttypes_controller.php:155 +msgid "Shifttypes" +msgstr "Tipos de turno" + +#: includes/controller/user_angeltypes_controller.php:19 +#, php-format +msgid "There is %d unconfirmed angeltype." +msgid_plural "There are %d unconfirmed angeltypes." +msgstr[0] "Há %d anjo não confirmado." +msgstr[1] "There are %d unconfirmed angeltypes." + +#: includes/controller/user_angeltypes_controller.php:19 +msgid "Angel types which need approvals:" +msgstr "Tipos de anjo que precisam de aprovações:" + +#: includes/controller/user_angeltypes_controller.php:40 +msgid "You are not allowed to delete all users for this angeltype." +msgstr "" +"Você não têm permissão para apagar todos os usuários desse tipo de anjo." + +#: includes/controller/user_angeltypes_controller.php:48 +#, php-format +msgid "Denied all users for angeltype %s." +msgstr "Todos os usuários com tipo de anjo %s negados." + +#: includes/controller/user_angeltypes_controller.php:53 +#: includes/view/UserAngelTypes_view.php:15 +msgid "Deny all users" +msgstr "Negar todos os usuários" + +#: includes/controller/user_angeltypes_controller.php:77 +#: includes/controller/user_angeltypes_controller.php:107 +#: includes/controller/user_angeltypes_controller.php:113 +#: includes/controller/user_angeltypes_controller.php:158 +#: includes/controller/user_angeltypes_controller.php:164 +#: includes/controller/user_angeltypes_controller.php:216 +#: includes/controller/user_angeltypes_controller.php:229 +msgid "User angeltype doesn't exist." +msgstr "O tipo de anjo deste usuário não existe." + +#: includes/controller/user_angeltypes_controller.php:82 +msgid "You are not allowed to confirm all users for this angeltype." +msgstr "" +"Você não tem permissão para confirmar todos os usuários com este tipo de " +"anjo." + +#: includes/controller/user_angeltypes_controller.php:90 +#, php-format +msgid "Confirmed all users for angeltype %s." +msgstr "Todos os usuários com tipo de anjo %s confirmados." + +#: includes/controller/user_angeltypes_controller.php:95 +#: includes/view/UserAngelTypes_view.php:26 +msgid "Confirm all users" +msgstr "Confirmar todos usuários" + +#: includes/controller/user_angeltypes_controller.php:124 +msgid "You are not allowed to confirm this users angeltype." +msgstr "Você não tem permissão para confirmar o tipo de anjo deste usuário." + +#: includes/controller/user_angeltypes_controller.php:130 +#: includes/controller/user_angeltypes_controller.php:176 +#: includes/controller/user_angeltypes_controller.php:241 +#: includes/controller/users_controller.php:312 +msgid "User doesn't exist." +msgstr "Usuário não existente." + +#: includes/controller/user_angeltypes_controller.php:141 +#, php-format +msgid "%s confirmed for angeltype %s." +msgstr "%s confirmado para o tipo de anjo %s." + +#: includes/controller/user_angeltypes_controller.php:146 +#: includes/view/UserAngelTypes_view.php:37 +msgid "Confirm angeltype for user" +msgstr "Confirme o tipo de anjo para o usuário" + +#: includes/controller/user_angeltypes_controller.php:181 +msgid "You are not allowed to delete this users angeltype." +msgstr "Você não tem permissão para deletar o tipo de anjo deste usuário." + +#: includes/controller/user_angeltypes_controller.php:191 +#, php-format +msgid "User %s removed from %s." +msgstr "Usuário %s removido de %s." + +#: includes/controller/user_angeltypes_controller.php:199 +#: includes/view/UserAngelTypes_view.php:48 +msgid "Remove angeltype" +msgstr "Remover esse tipo de anjo" + +#: includes/controller/user_angeltypes_controller.php:211 +msgid "You are not allowed to set supporter rights." +msgstr "Você não tem autorização para definir permissões de apoiadores." + +#: includes/controller/user_angeltypes_controller.php:223 +msgid "No supporter update given." +msgstr "Nenhuma atualização de apoiador informada." + +#: includes/controller/user_angeltypes_controller.php:248 +#, php-format +msgid "Added supporter rights for %s to %s." +msgstr "Permissões de apoiador incluídos para %s a %s." + +#: includes/controller/user_angeltypes_controller.php:248 +#, php-format +msgid "Removed supporter rights for %s from %s." +msgstr "Permissões de apoiador removidos para %s a %s." + +#: includes/controller/user_angeltypes_controller.php:256 +#: includes/view/AngelTypes_view.php:156 +#: includes/view/UserAngelTypes_view.php:4 +msgid "Add supporter rights" +msgstr "Adicionar permissão ao apoiador" + +#: includes/controller/user_angeltypes_controller.php:256 +#: includes/view/AngelTypes_view.php:147 +#: includes/view/UserAngelTypes_view.php:4 +msgid "Remove supporter rights" +msgstr "Remover permissões de apoiador" + +#: includes/controller/user_angeltypes_controller.php:289 +#, php-format +msgid "User %s added to %s." +msgstr "Usuário %s adicionado a %s." + +#: includes/controller/user_angeltypes_controller.php:299 +#: includes/view/UserAngelTypes_view.php:64 +msgid "Add user to angeltype" +msgstr "Adicionar usuário a tipo de anjo" + +#: includes/controller/user_angeltypes_controller.php:312 +#, php-format +msgid "You are already a %s." +msgstr "Você já é %s." + +#: includes/controller/user_angeltypes_controller.php:319 +#, php-format +msgid "You joined %s." +msgstr "Você se juntou a %s." + +#: includes/controller/user_angeltypes_controller.php:332 +#: includes/view/UserAngelTypes_view.php:78 +#, php-format +msgid "Become a %s" +msgstr "Torne-se %s" + +#: includes/controller/user_driver_licenses_controller.php:19 +#, php-format +msgid "" +"You joined an angeltype which requires a driving license. Please edit your " +"driving license information here: %s." +msgstr "" +"Você se tornou um tipo de anjo que requer carteira de motorista. Por favor " +"inclua \n" +"seus dados aqui: %s." + +#: includes/controller/user_driver_licenses_controller.php:19 +msgid "driving license information" +msgstr "dados da carteira de motorista" + +#: includes/controller/user_driver_licenses_controller.php:113 +msgid "Your driver license information has been saved." +msgstr "Dados da carteira de motorista salvos." + +#: includes/controller/user_driver_licenses_controller.php:116 +msgid "Please select at least one driving license." +msgstr "Selecione pelo menos uma carteira de motorista." + +#: includes/controller/user_driver_licenses_controller.php:121 +msgid "Your driver license information has been removed." +msgstr "Seus dados de carteira de motorista foram removidos." + +#: includes/controller/user_driver_licenses_controller.php:127 +#: includes/view/UserDriverLicenses_view.php:15 +#, php-format +msgid "Edit %s driving license information" +msgstr "Editar dados da carteira de motorista de %s" + +#: includes/controller/users_controller.php:52 +msgid "You cannot delete yourself." +msgstr "Você não pode se deletar." + +#: includes/controller/users_controller.php:61 +#: includes/pages/guest_login.php:315 +msgid "Your password is incorrect. Please try it again." +msgstr "Sua senha está incorreta. Por favor, tente novamente." + +#: includes/controller/users_controller.php:71 +msgid "User deleted." +msgstr "Usuário deletado." + +#: includes/controller/users_controller.php:79 includes/view/User_view.php:121 +#, php-format +msgid "Delete %s" +msgstr "Apagar %s" + +#: includes/controller/users_controller.php:120 +msgid "Please enter a valid number of vouchers." +msgstr "Por favor, entre com um número válido de vouchers." + +#: includes/controller/users_controller.php:131 +msgid "Saved the number of vouchers." +msgstr "Número de vouchers salvo." + +#: includes/controller/users_controller.php:139 includes/view/User_view.php:138 +#, php-format +msgid "%s's vouchers" +msgstr "Vouchers de %s" + +#: includes/controller/users_controller.php:151 +msgid "User not found." +msgstr "Usuário não encontrado." + +#: includes/controller/users_controller.php:205 includes/view/User_view.php:175 +msgid "All users" +msgstr "Todos usuários" + +#: includes/controller/users_controller.php:217 +msgid "Token is not correct." +msgstr "O token não está correto." + +#: includes/controller/users_controller.php:227 +#: includes/pages/guest_login.php:102 includes/pages/user_settings.php:97 +msgid "Your passwords don't match." +msgstr "Suas senhas não correspondem." + +#: includes/controller/users_controller.php:231 +#: includes/pages/user_settings.php:95 +msgid "Your password is to short (please use at least 6 characters)." +msgstr "Sua senha é muito curta (por favor use no mínimo 6 caracteres)." + +#: includes/controller/users_controller.php:236 +#: includes/pages/user_settings.php:99 +msgid "Password saved." +msgstr "Sua senha foi salva." + +#: includes/controller/users_controller.php:257 +#: includes/controller/users_controller.php:261 +#: includes/pages/guest_login.php:67 includes/pages/user_settings.php:21 +msgid "E-mail address is not correct." +msgstr "E-mail não está correto." + +#: includes/controller/users_controller.php:265 +#: includes/pages/guest_login.php:71 includes/pages/user_settings.php:25 +msgid "Please enter your e-mail." +msgstr "Por favor digite seu e-mail." + +#: includes/controller/users_controller.php:270 +#: includes/controller/users_controller.php:295 +msgid "Password recovery" +msgstr "Recuperação de senha" + +#: includes/controller/users_controller.php:270 +#, php-format +msgid "Please visit %s to recover your password." +msgstr "Por favor visite %s para recuperar sua senha" + +#: includes/controller/users_controller.php:271 +msgid "We sent an email containing your password recovery link." +msgstr "Nós enviamos um email com o link para recuperação da sua senha." + +#: includes/helper/email_helper.php:12 +#, php-format +msgid "Hi %s," +msgstr "Oi %s," + +#: includes/helper/email_helper.php:12 +#, php-format +msgid "here is a message for you from the %s:" +msgstr "aqui está uma mensagem do %s para você:" + +#: includes/helper/email_helper.php:12 +#, php-format +msgid "" +"This email is autogenerated and has not been signed. You got this email " +"because you are registered in the %s." +msgstr "Você recebeu esse email porque está registrado no %s." + +#: includes/mailer/shifts_mailer.php:10 +msgid "A Shift you are registered on has changed:" +msgstr "Um turno em que você estava registrado foi modificado:" + +#: includes/mailer/shifts_mailer.php:14 +#, php-format +msgid "* Shift type changed from %s to %s" +msgstr "* Tipo de turno alterado de %s para %s" + +#: includes/mailer/shifts_mailer.php:19 +#, php-format +msgid "* Shift title changed from %s to %s" +msgstr "* Título do turno alterado de %s para %s" + +#: includes/mailer/shifts_mailer.php:24 +#, php-format +msgid "* Shift Start changed from %s to %s" +msgstr "* Início do turno alterado de %s para %s" + +#: includes/mailer/shifts_mailer.php:29 +#, php-format +msgid "* Shift End changed from %s to %s" +msgstr "* Término do turno alterado de %s para %s" + +#: includes/mailer/shifts_mailer.php:34 +#, php-format +msgid "* Shift Location changed from %s to %s" +msgstr "* Local do turno alterado de %s para %s" + +#: includes/mailer/shifts_mailer.php:44 +msgid "The updated Shift:" +msgstr "Turno atualizado:" + +#: includes/mailer/shifts_mailer.php:53 +msgid "Your Shift has changed" +msgstr "O seu turno foi modificado" + +#: includes/mailer/shifts_mailer.php:62 +msgid "A Shift you are registered on was deleted:" +msgstr "Um turno em que você estava registrado foi apagado:" + +#: includes/mailer/shifts_mailer.php:71 +msgid "Your Shift was deleted" +msgstr "Seu turno foi apagado" + +#: includes/mailer/shifts_mailer.php:80 +msgid "You have been assigned to a Shift:" +msgstr "Você foi alocado a um turno:" + +#: includes/mailer/shifts_mailer.php:86 +msgid "Assigned to Shift" +msgstr "Alocado ao turno" + +#: includes/mailer/shifts_mailer.php:94 +msgid "You have been removed from a Shift:" +msgstr "Você foi removido de um turno:" + +#: includes/mailer/shifts_mailer.php:100 +msgid "Removed from Shift" +msgstr "Removido do turno" + +#: includes/mailer/users_mailer.php:7 +msgid "Your account has been deleted" +msgstr "A sua conta foi deletada." + +#: includes/mailer/users_mailer.php:7 +msgid "" +"Your angelsystem account has been deleted. If you have any questions " +"regarding your account deletion, please contact heaven." +msgstr "" +"Sua conta engelsystem foi deletada. Se você tiver questões sobre a deleção " +"da sua conta, por favor entre em contato com o paraíso." + +#: includes/pages/admin_active.php:4 +msgid "Active angels" +msgstr "Anjos ativos" + +#: includes/pages/admin_active.php:29 +#, php-format +msgid "" +"At least %s angels are forced to be active. The number has to be greater." +msgstr "No mínimo %s anjos precisam estar ativos. O número deve ser maior." + +#: includes/pages/admin_active.php:34 +msgid "Please enter a number of angels to be marked as active." +msgstr "Por favor insira o número de anjos a marcar como ativos." + +#: includes/pages/admin_active.php:59 +msgid "Marked angels." +msgstr "Anjos marcados." + +#: includes/pages/admin_active.php:61 includes/pages/admin_rooms.php:137 +#: includes/pages/admin_rooms.php:173 includes/pages/admin_shifts.php:266 +#: includes/view/UserAngelTypes_view.php:67 includes/view/User_view.php:124 +#: includes/view/User_view.php:141 +msgid "back" +msgstr "voltar" + +#: includes/pages/admin_active.php:61 +msgid "apply" +msgstr "aplicar" + +#: includes/pages/admin_active.php:71 +msgid "Angel has been marked as active." +msgstr "Anjo marcado como ativo." + +#: includes/pages/admin_active.php:73 includes/pages/admin_active.php:83 +#: includes/pages/admin_active.php:103 includes/pages/admin_arrive.php:23 +#: includes/pages/admin_arrive.php:34 +msgid "Angel not found." +msgstr "Anjo não encontrado." + +#: includes/pages/admin_active.php:81 +msgid "Angel has been marked as not active." +msgstr "Anjo marcado como não ativo." + +#: includes/pages/admin_active.php:91 +msgid "Angel has got a t-shirt." +msgstr "Anjo tem uma camiseta." + +#: includes/pages/admin_active.php:101 +msgid "Angel has got no t-shirt." +msgstr "Anjo não tem camiseta." + +#: includes/pages/admin_active.php:142 +msgid "set active" +msgstr "definir ativo" + +#: includes/pages/admin_active.php:145 +msgid "remove active" +msgstr "remover ativo" + +#: includes/pages/admin_active.php:146 +msgid "got t-shirt" +msgstr "pegou camiseta" + +#: includes/pages/admin_active.php:149 +msgid "remove t-shirt" +msgstr "remover camiseta" + +#: includes/pages/admin_active.php:168 includes/pages/admin_arrive.php:165 +#: includes/pages/admin_arrive.php:180 includes/pages/admin_arrive.php:195 +#: includes/view/AngelTypes_view.php:221 includes/view/AngelTypes_view.php:229 +#: includes/view/User_view.php:165 +msgid "Sum" +msgstr "Somatória" + +#: includes/pages/admin_active.php:175 +msgid "Search angel:" +msgstr "Buscar Anjo:" + +#: includes/pages/admin_active.php:176 +msgid "Show all shifts" +msgstr "Mostrar todos os turnos" + +#: includes/pages/admin_active.php:177 includes/pages/admin_arrive.php:141 +#: includes/pages/admin_arrive.php:142 includes/pages/admin_free.php:78 +#: includes/pages/admin_free.php:87 includes/pages/admin_log.php:23 +#: includes/pages/admin_log.php:24 +msgid "Search" +msgstr "Buscar" + +#: includes/pages/admin_active.php:180 +msgid "How much angels should be active?" +msgstr "Quantos anjos deverão estar ativos?" + +#: includes/pages/admin_active.php:181 includes/pages/admin_shifts.php:254 +#: includes/pages/admin_shifts.php:342 +msgid "Preview" +msgstr "Pré-visualizar" + +#: includes/pages/admin_active.php:185 includes/pages/admin_arrive.php:145 +msgid "Nickname" +msgstr "Apelido" + +#: includes/pages/admin_active.php:186 includes/pages/admin_active.php:196 +#: includes/view/User_view.php:191 +msgid "Size" +msgstr "Tamanho" + +#: includes/pages/admin_active.php:187 includes/pages/user_shifts.php:5 +#: includes/view/User_view.php:364 +msgid "Shifts" +msgstr "Turnos" + +#: includes/pages/admin_active.php:188 includes/pages/admin_shifts.php:329 +msgid "Length" +msgstr "Duração" + +#: includes/pages/admin_active.php:189 +msgid "Active?" +msgstr "Ativo?" + +#: includes/pages/admin_active.php:190 includes/view/User_view.php:189 +msgid "Forced" +msgstr "Forçados" + +#: includes/pages/admin_active.php:191 +msgid "T-shirt?" +msgstr "Camiseta?" + +#: includes/pages/admin_active.php:194 +msgid "Shirt statistics" +msgstr "Estatísticas de camiseta" + +#: includes/pages/admin_active.php:197 +msgid "Needed shirts" +msgstr "Camisetas necessárias" + +#: includes/pages/admin_active.php:198 +msgid "Given shirts" +msgstr "Camisetas entregues" + +#: includes/pages/admin_arrive.php:4 +msgid "Arrived angels" +msgstr "Anjos que chegaram" + +#: includes/pages/admin_arrive.php:20 +msgid "Reset done. Angel has not arrived." +msgstr "Reset realizado. Anjo não chegou." + +#: includes/pages/admin_arrive.php:31 +msgid "Angel has been marked as arrived." +msgstr "Chegada do anjo registrada." + +#: includes/pages/admin_arrive.php:71 includes/view/UserAngelTypes_view.php:9 +#: includes/view/UserAngelTypes_view.php:20 +#: includes/view/UserAngelTypes_view.php:31 +#: includes/view/UserAngelTypes_view.php:42 +#: includes/view/UserAngelTypes_view.php:53 +msgid "yes" +msgstr "sim" + +#: includes/pages/admin_arrive.php:72 +msgid "reset" +msgstr "resetar" + +#: includes/pages/admin_arrive.php:72 includes/pages/admin_arrive.php:156 +#: includes/pages/admin_arrive.php:171 includes/pages/admin_arrive.php:186 +#: includes/view/User_view.php:330 +msgid "arrived" +msgstr "chegou" + +#: includes/pages/admin_arrive.php:146 +msgid "Planned arrival" +msgstr "Chegada planejada" + +#: includes/pages/admin_arrive.php:147 +msgid "Arrived?" +msgstr "Chegou?" + +#: includes/pages/admin_arrive.php:148 +msgid "Arrival date" +msgstr "Data de chegada" + +#: includes/pages/admin_arrive.php:149 +msgid "Planned departure" +msgstr "Saída planejada" + +#: includes/pages/admin_arrive.php:154 +msgid "Planned arrival statistics" +msgstr "Estatísticas de chegadas planejadas" + +#: includes/pages/admin_arrive.php:157 includes/pages/admin_arrive.php:172 +#: includes/pages/admin_arrive.php:187 +msgid "arrived sum" +msgstr "soma dos que chegaram" + +#: includes/pages/admin_arrive.php:163 includes/pages/admin_arrive.php:178 +#: includes/pages/admin_arrive.php:193 includes/pages/admin_news.php:30 +#: includes/pages/user_messages.php:76 +msgid "Date" +msgstr "Data" + +#: includes/pages/admin_arrive.php:164 includes/pages/admin_arrive.php:179 +#: includes/pages/admin_arrive.php:194 +msgid "Count" +msgstr "Contar" + +#: includes/pages/admin_arrive.php:169 +msgid "Arrival statistics" +msgstr "Estatísticas de chegadas" + +#: includes/pages/admin_arrive.php:184 +msgid "Planned departure statistics" +msgstr "Estatísticas de saídas planejadas" + +#: includes/pages/admin_free.php:4 +msgid "Free angels" +msgstr "Anjos livres" + +#: includes/pages/admin_free.php:81 includes/view/ShiftTypes_view.php:36 +#: includes/view/UserAngelTypes_view.php:70 +msgid "Angeltype" +msgstr "Tipo de anjo" + +#: includes/pages/admin_free.php:84 +msgid "Only confirmed" +msgstr "Somente confirmados" + +#: includes/pages/admin_free.php:92 includes/pages/guest_login.php:225 +#: includes/pages/guest_login.php:354 includes/view/AngelTypes_view.php:177 +#: includes/view/AngelTypes_view.php:190 includes/view/User_view.php:40 +#: includes/view/User_view.php:97 includes/view/User_view.php:181 +msgid "Nick" +msgstr "Apelido" + +#: includes/pages/admin_free.php:94 includes/pages/guest_login.php:255 +#: includes/view/AngelTypes_view.php:178 includes/view/AngelTypes_view.php:191 +#: includes/view/User_view.php:47 includes/view/User_view.php:184 +msgid "DECT" +msgstr "DECT" + +#: includes/pages/admin_free.php:95 includes/pages/guest_login.php:264 +#: includes/view/User_view.php:52 +msgid "Jabber" +msgstr "Jabber" + +#: includes/pages/admin_free.php:96 includes/pages/guest_login.php:228 +#: includes/view/User_view.php:49 includes/view/User_view.php:386 +msgid "E-Mail" +msgstr "E-Mail" + +#: includes/pages/admin_groups.php:4 +msgid "Grouprights" +msgstr "Direitos de grupo" + +#: includes/pages/admin_groups.php:29 includes/pages/admin_import.php:145 +#: includes/pages/admin_import.php:149 includes/pages/admin_rooms.php:143 +#: includes/pages/admin_rooms.php:189 includes/view/AngelTypes_view.php:66 +#: includes/view/AngelTypes_view.php:268 includes/view/ShiftTypes_view.php:35 +#: includes/view/ShiftTypes_view.php:78 includes/view/User_view.php:183 +msgid "Name" +msgstr "Nome" + +#: includes/pages/admin_groups.php:30 +msgid "Privileges" +msgstr "Privilégios" + +#: includes/pages/admin_groups.php:55 +msgid "Edit group" +msgstr "Editar grupo" + +#: includes/pages/admin_import.php:4 includes/pages/admin_rooms.php:144 +#: includes/pages/admin_rooms.php:190 +msgid "Frab import" +msgstr "Importação Frab" + +#: includes/pages/admin_import.php:26 +msgid "Webserver has no write-permission on import directory." +msgstr "" +"O servidor web não possui permissão de escrita no diretório de importação." + +#: includes/pages/admin_import.php:54 includes/pages/admin_import.php:118 +#: includes/pages/admin_import.php:196 includes/pages/admin_shifts.php:53 +#: includes/pages/admin_shifts.php:59 +msgid "Please select a shift type." +msgstr "Por favor selecione um tipo de turno." + +#: includes/pages/admin_import.php:61 includes/pages/admin_import.php:125 +#: includes/pages/admin_import.php:203 +msgid "Please enter an amount of minutes to add to a talk's begin." +msgstr "" +"Por favor insira um número de minutos para adicionar ao início de uma " +"palestra." + +#: includes/pages/admin_import.php:68 includes/pages/admin_import.php:132 +#: includes/pages/admin_import.php:210 +msgid "Please enter an amount of minutes to add to a talk's end." +msgstr "" +"Por favor insira um número de minutos para adicionar ao término de uma " +"palestra." + +#: includes/pages/admin_import.php:76 +msgid "No valid xml/xcal file provided." +msgstr "Nenhum arquivo xml/xcal válido foi fornecido." + +#: includes/pages/admin_import.php:81 +msgid "File upload went wrong." +msgstr "Falha no upload do arquivo." + +#: includes/pages/admin_import.php:85 +msgid "Please provide some data." +msgstr "Por favor insira alguns dados." + +#: includes/pages/admin_import.php:93 includes/pages/admin_import.php:140 +#: includes/pages/admin_import.php:253 +msgid "File Upload" +msgstr "Enviar arquivo" + +#: includes/pages/admin_import.php:93 includes/pages/admin_import.php:140 +#: includes/pages/admin_import.php:253 +msgid "Validation" +msgstr "Validação" + +#: includes/pages/admin_import.php:93 includes/pages/admin_import.php:102 +#: includes/pages/admin_import.php:140 includes/pages/admin_import.php:179 +#: includes/pages/admin_import.php:253 +msgid "Import" +msgstr "Importar" + +#: includes/pages/admin_import.php:97 +msgid "" +"This import will create/update/delete rooms and shifts by given FRAB-export " +"file. The needed file format is xcal." +msgstr "" +"Esta importação irá criar/atualizar/deletar salas e turnos a partir do " +"arquivo FRAB-Export. O formato necessário é xcal." + +#: includes/pages/admin_import.php:99 +msgid "Add minutes to start" +msgstr "Adicionar minutos ao início" + +#: includes/pages/admin_import.php:100 +msgid "Add minutes to end" +msgstr "Adicionar minutos ao fim" + +#: includes/pages/admin_import.php:101 +msgid "xcal-File (.xcal)" +msgstr "Adicionar minutos ao fim" + +#: includes/pages/admin_import.php:111 includes/pages/admin_import.php:185 +msgid "Missing import file." +msgstr "Arquivo para importar não encontrado." + +#: includes/pages/admin_import.php:144 +msgid "Rooms to create" +msgstr "Salas para criar" + +#: includes/pages/admin_import.php:148 +msgid "Rooms to delete" +msgstr "Salas para apagar" + +#: includes/pages/admin_import.php:152 +msgid "Shifts to create" +msgstr "Turnos para criar" + +#: includes/pages/admin_import.php:154 includes/pages/admin_import.php:163 +#: includes/pages/admin_import.php:172 includes/view/User_view.php:366 +msgid "Day" +msgstr "Dia" + +#: includes/pages/admin_import.php:155 includes/pages/admin_import.php:164 +#: includes/pages/admin_import.php:173 includes/pages/admin_shifts.php:324 +#: includes/view/Shifts_view.php:66 +msgid "Start" +msgstr "Início" + +#: includes/pages/admin_import.php:156 includes/pages/admin_import.php:165 +#: includes/pages/admin_import.php:174 includes/pages/admin_shifts.php:325 +#: includes/view/Shifts_view.php:74 +msgid "End" +msgstr "Fim" + +#: includes/pages/admin_import.php:157 includes/pages/admin_import.php:166 +#: includes/pages/admin_import.php:175 +msgid "Shift type" +msgstr "Tipo de turno" + +#: includes/pages/admin_import.php:159 includes/pages/admin_import.php:168 +#: includes/pages/admin_import.php:177 includes/pages/admin_shifts.php:321 +msgid "Room" +msgstr "Sala" + +#: includes/pages/admin_import.php:161 +msgid "Shifts to update" +msgstr "Turnos para atualizar" + +#: includes/pages/admin_import.php:170 +msgid "Shifts to delete" +msgstr "Turnos para deletar" + +#: includes/pages/admin_import.php:254 +msgid "It's done!" +msgstr "Está feito!" + +#: includes/pages/admin_log.php:4 +msgid "Log" +msgstr "Log" + +#: includes/pages/admin_news.php:10 +msgid "Edit news entry" +msgstr "Editar notícia" + +#: includes/pages/admin_news.php:31 +msgid "Author" +msgstr "Autor" + +#: includes/pages/admin_news.php:32 includes/pages/user_news.php:161 +msgid "Subject" +msgstr "Assunto" + +#: includes/pages/admin_news.php:33 includes/pages/user_messages.php:79 +#: includes/pages/user_news.php:106 includes/pages/user_news.php:162 +msgid "Message" +msgstr "Mensagem" + +#: includes/pages/admin_news.php:34 includes/pages/user_news.php:163 +msgid "Meeting" +msgstr "Reunião" + +#: includes/pages/admin_news.php:38 includes/pages/admin_rooms.php:177 +#: includes/view/User_view.php:129 +msgid "Delete" +msgstr "Apagar" + +#: includes/pages/admin_news.php:52 +msgid "News entry updated." +msgstr "Notícia atualizada." + +#: includes/pages/admin_news.php:61 +msgid "News entry deleted." +msgstr "Notícia deletada." + +#: includes/pages/admin_questions.php:4 +msgid "Answer questions" +msgstr "Responder perguntas" + +#: includes/pages/admin_questions.php:18 +msgid "There are unanswered questions!" +msgstr "Existem perguntas não respondidas!" + +#: includes/pages/admin_questions.php:61 +msgid "Unanswered questions" +msgstr "Perguntas não respondidas" + +#: includes/pages/admin_questions.php:63 includes/pages/admin_questions.php:70 +msgid "From" +msgstr "De" + +#: includes/pages/admin_questions.php:64 includes/pages/admin_questions.php:71 +#: includes/view/Questions_view.php:19 includes/view/Questions_view.php:24 +msgid "Question" +msgstr "Questão" + +#: includes/pages/admin_questions.php:65 includes/pages/admin_questions.php:73 +#: includes/view/Questions_view.php:26 +msgid "Answer" +msgstr "Resposta" + +#: includes/pages/admin_questions.php:68 includes/view/Questions_view.php:22 +msgid "Answered questions" +msgstr "Perguntas respondidas" + +#: includes/pages/admin_questions.php:72 includes/view/Questions_view.php:25 +msgid "Answered by" +msgstr "Respondido por" + +#: includes/pages/admin_rooms.php:4 includes/pages/user_shifts.php:159 +#: includes/sys_menu.php:176 +msgid "Rooms" +msgstr "Salas" + +#: includes/pages/admin_rooms.php:67 +msgid "This name is already in use." +msgstr "Este nome já está em uso." + +#: includes/pages/admin_rooms.php:97 +#, php-format +msgid "Please enter needed angels for type %s." +msgstr "Por favor insira os anjos necessários de tipo %s." + +#: includes/pages/admin_rooms.php:124 +msgid "Room saved." +msgstr "Sala salva" + +#: includes/pages/admin_rooms.php:145 includes/pages/admin_rooms.php:191 +msgid "Public" +msgstr "Público" + +#: includes/pages/admin_rooms.php:146 +msgid "Room number" +msgstr "Número da sala" + +#: includes/pages/admin_rooms.php:151 +msgid "Needed angels:" +msgstr "Anjos necessários:" + +#: includes/pages/admin_rooms.php:167 +#, php-format +msgid "Room %s deleted." +msgstr "Sala %s deletada." + +#: includes/pages/admin_rooms.php:175 +#, php-format +msgid "Do you want to delete room %s?" +msgstr "Você quer deletar as salas %s?" + +#: includes/pages/admin_rooms.php:185 +msgid "add" +msgstr "adicionar" + +#: includes/pages/admin_shifts.php:4 +msgid "Create shifts" +msgstr "Criar turnos" + +#: includes/pages/admin_shifts.php:71 +msgid "Please select a location." +msgstr "Por favor, selecione uma localização." + +#: includes/pages/admin_shifts.php:78 +msgid "Please select a start time." +msgstr "Por favor, selecione um horário de início." + +#: includes/pages/admin_shifts.php:85 +msgid "Please select an end time." +msgstr "Por favor, selecione um horário de término." + +#: includes/pages/admin_shifts.php:90 +msgid "The shifts end has to be after its start." +msgstr "O término do turno deve ser posterior ao seu início." + +#: includes/pages/admin_shifts.php:102 +msgid "Please enter a shift duration in minutes." +msgstr "Por favor insira a duração do turno em minutos." + +#: includes/pages/admin_shifts.php:110 +msgid "Please split the shift-change hours by colons." +msgstr "Por favor divida os horários de mudança de turno por vírgulas." + +#: includes/pages/admin_shifts.php:115 +msgid "Please select a mode." +msgstr "Por favor selecione um modo." + +#: includes/pages/admin_shifts.php:128 +#, php-format +msgid "Please check the needed angels for team %s." +msgstr "Por favor confira os anjos necessários para o time %s." + +#: includes/pages/admin_shifts.php:133 +msgid "There are 0 angels needed. Please enter the amounts of needed angels." +msgstr "" +"Há 0 anjos necessários. Por favor insira o número de anjos necessários." + +#: includes/pages/admin_shifts.php:137 +msgid "Please select a mode for needed angels." +msgstr "Por favor escolha um modo para os anjos necessários." + +#: includes/pages/admin_shifts.php:141 +msgid "Please select needed angels." +msgstr "Por favor selecione os anjos necessários." + +#: includes/pages/admin_shifts.php:268 +msgid "Time and location" +msgstr "Horário e localização" + +#: includes/pages/admin_shifts.php:269 +msgid "Type and title" +msgstr "Tipo e título" + +#: includes/pages/admin_shifts.php:326 +msgid "Mode" +msgstr "Modo" + +#: includes/pages/admin_shifts.php:327 +msgid "Create one shift" +msgstr "Criar um turno" + +#: includes/pages/admin_shifts.php:328 +msgid "Create multiple shifts" +msgstr "Criar múltiplos turnos" + +#: includes/pages/admin_shifts.php:330 +msgid "Create multiple shifts with variable length" +msgstr "Criar múltiplos turnos com duração variável" + +#: includes/pages/admin_shifts.php:331 +msgid "Shift change hours" +msgstr "Mudança de horário do turno" + +#: includes/pages/admin_shifts.php:335 +msgid "Take needed angels from room settings" +msgstr "Pegar os anjos necessários a partir das configurações das salas" + +#: includes/pages/admin_shifts.php:336 +msgid "The following angels are needed" +msgstr "Os seguintes anjos são necessários" + +#: includes/pages/admin_user.php:4 +msgid "All Angels" +msgstr "Todos os anjos" + +#: includes/pages/admin_user.php:20 +msgid "This user does not exist." +msgstr "Esse usuário não existe." + +#: includes/pages/admin_user.php:46 includes/view/AngelTypes_view.php:67 +#: includes/view/AngelTypes_view.php:68 includes/view/AngelTypes_view.php:69 +msgid "Yes" +msgstr "Sim" + +#: includes/pages/admin_user.php:47 includes/view/AngelTypes_view.php:67 +#: includes/view/AngelTypes_view.php:68 includes/view/AngelTypes_view.php:69 +msgid "No" +msgstr "Não" + +#: includes/pages/admin_user.php:60 +msgid "Force active" +msgstr "Forçar ativação" + +#: includes/pages/admin_user.php:79 +msgid "" +"Please visit the angeltypes page or the users profile to manage users " +"angeltypes." +msgstr "" +"Por favor visite a página de tipos de anjo ou o perfil do usuário para " +"gerenciar\n" +"seus tipos de anjo." + +#: includes/pages/admin_user.php:204 +msgid "Edit user" +msgstr "Editar usuário" + +#: includes/pages/guest_credits.php:3 +msgid "Credits" +msgstr "Créditos" + +#: includes/pages/guest_login.php:4 includes/pages/guest_login.php:349 +#: includes/pages/guest_login.php:356 includes/view/User_view.php:95 +#: includes/view/User_view.php:99 +msgid "Login" +msgstr "Login" + +#: includes/pages/guest_login.php:8 includes/pages/guest_login.php:285 +msgid "Register" +msgstr "Registrar" + +#: includes/pages/guest_login.php:12 +msgid "Logout" +msgstr "Logout" + +#: includes/pages/guest_login.php:56 +#, php-format +msgid "Your nick "%s" already exists." +msgstr "Seu apelido "%s" já existe." + +#: includes/pages/guest_login.php:60 +#, php-format +msgid "Your nick "%s" is too short (min. 2 characters)." +msgstr "Seu apelido "%s" é muito pequeno (mínimo 2 caracteres)." + +#: includes/pages/guest_login.php:86 includes/pages/user_settings.php:36 +msgid "Please check your jabber account information." +msgstr "Por favor verifique a informação da sua conta jabber." + +#: includes/pages/guest_login.php:95 +msgid "Please select your shirt size." +msgstr "Por favor escolha o tamanho da camisa." + +#: includes/pages/guest_login.php:106 +#, php-format +msgid "Your password is too short (please use at least %s characters)." +msgstr "Sua senha é muito curta (por favor use pelo menos %s caracteres)." + +#: includes/pages/guest_login.php:115 includes/pages/user_settings.php:52 +msgid "" +"Please enter your planned date of arrival. It should be after the buildup " +"start date and before teardown end date." +msgstr "" +"Por favor insira a data planejada para sua chegada. Ela deve ser posterior à " +"data de montagem e anterior à data de desmontagem." + +#: includes/pages/guest_login.php:189 +msgid "Angel registration successful!" +msgstr "Conta criada com sucesso!" + +#: includes/pages/guest_login.php:217 +msgid "" +"By completing this form you're registering as a Chaos-Angel. This script " +"will create you an account in the angel task scheduler." +msgstr "" +"Ao completar esse formulário você estará se registrando como um voluntário. " +"Esse script criará uma conta no sistema." + +#: includes/pages/guest_login.php:229 includes/view/User_view.php:50 +#, php-format +msgid "" +"The %s is allowed to send me an email (e.g. when my shifts change)" +msgstr "" +"Permito que o %s me envie emails (por exemplo, quando meus turnos " +"mudam)" + +#: includes/pages/guest_login.php:230 includes/view/User_view.php:51 +msgid "Humans are allowed to send me an email (e.g. for ticket vouchers)" +msgstr "Permito que humanos me enviem emails (por exemplo, para um voucher)" + +#: includes/pages/guest_login.php:235 includes/view/User_view.php:43 +msgid "Planned date of arrival" +msgstr "Data planejada de chegada" + +#: includes/pages/guest_login.php:238 includes/view/User_view.php:54 +msgid "Shirt size" +msgstr "Tamanho da camiseta" + +#: includes/pages/guest_login.php:243 includes/pages/guest_login.php:355 +#: includes/view/User_view.php:98 includes/view/User_view.php:400 +msgid "Password" +msgstr "Senha" + +#: includes/pages/guest_login.php:246 includes/view/User_view.php:401 +msgid "Confirm password" +msgstr "Confirme a senha" + +#: includes/pages/guest_login.php:249 +msgid "What do you want to do?" +msgstr "O que você gostaria de fazer?" + +#: includes/pages/guest_login.php:249 +msgid "Description of job types" +msgstr "Descrição dos trabalhos" + +#: includes/pages/guest_login.php:250 +msgid "" +"Restricted angel types need will be confirmed later by a supporter. You can " +"change your selection in the options section." +msgstr "" +"Tipos de anjo restritos precisam de confirmação posterior de um apoiador. " +"Você pode \n" +"mudar sua seleção na seção 'Opções'." + +#: includes/pages/guest_login.php:258 includes/view/User_view.php:48 +msgid "Mobile" +msgstr "Celular" + +#: includes/pages/guest_login.php:261 includes/view/User_view.php:46 +msgid "Phone" +msgstr "Telefone" + +#: includes/pages/guest_login.php:267 includes/view/User_view.php:42 +msgid "First name" +msgstr "Nome" + +#: includes/pages/guest_login.php:270 includes/view/User_view.php:41 +msgid "Last name" +msgstr "Sobrenome" + +#: includes/pages/guest_login.php:275 includes/view/User_view.php:45 +msgid "Age" +msgstr "Idade" + +#: includes/pages/guest_login.php:278 includes/view/User_view.php:53 +msgid "Hometown" +msgstr "Cidade" + +#: includes/pages/guest_login.php:281 includes/view/User_view.php:39 +msgid "Entry required!" +msgstr "Campo necessário!" + +#: includes/pages/guest_login.php:319 +msgid "auth.no-password" +msgstr "Por favor digite uma senha." + +#: includes/pages/guest_login.php:323 +msgid "auth.not-found" +msgstr "" +"Nenhum usuário foi encontrado. Por favor tente novamente. \n" +"Se você continuar com problemas, pergunte a um Dispatcher." + +#: includes/pages/guest_login.php:327 +msgid "auth.no-nickname" +msgstr "Por favor digite um apelido." + +#: includes/pages/guest_login.php:358 includes/view/User_view.php:101 +msgid "I forgot my password" +msgstr "Esqueci minha senha" + +#: includes/pages/guest_login.php:363 includes/view/User_view.php:103 +msgid "Please note: You have to activate cookies!" +msgstr "Nota: você precisa habilitar cookies!" + +#: includes/pages/guest_login.php:374 includes/view/User_view.php:107 +msgid "What can I do?" +msgstr "O que posso fazer?" + +#: includes/pages/guest_login.php:375 includes/view/User_view.php:108 +msgid "Please read about the jobs you can do to help us." +msgstr "Por favor leia sobre as tarefas que pode realizar para nos ajudar." + +#: includes/pages/guest_login.php:390 +msgid "Please sign up, if you want to help us!" +msgstr "Se você quer nos ajudar, por favor se registre!" + +#: includes/pages/user_messages.php:4 +msgid "Messages" +msgstr "Mensagens" + +#: includes/pages/user_messages.php:26 +msgid "Select recipient..." +msgstr "Selecionar recipiente..." + +#: includes/pages/user_messages.php:62 +msgid "mark as read" +msgstr "marcar como lido" + +#: includes/pages/user_messages.php:65 +msgid "delete message" +msgstr "apagar mensagem" + +#: includes/pages/user_messages.php:72 +#, php-format +msgid "Hello %s, here can you leave messages for other angels" +msgstr "Oi %s, aqui você pode deixar mensagens para outros anjos." + +#: includes/pages/user_messages.php:75 +msgid "New" +msgstr "Nova" + +#: includes/pages/user_messages.php:77 +msgid "Transmitted" +msgstr "Enviado" + +#: includes/pages/user_messages.php:78 +msgid "Recipient" +msgstr "Recipiente" + +#: includes/pages/user_messages.php:90 includes/pages/user_messages.php:106 +msgid "Incomplete call, missing Message ID." +msgstr "Chamada incompleta, falta o ID da Mensagem." + +#: includes/pages/user_messages.php:98 includes/pages/user_messages.php:114 +msgid "No Message found." +msgstr "Nenhuma mensagem encontrada." + +#: includes/pages/user_messages.php:122 +msgid "Transmitting was terminated with an Error." +msgstr "Transmissão encerrada com um erro." + +#: includes/pages/user_messages.php:127 +msgid "Wrong action." +msgstr "Ação errada." + +#: includes/pages/user_myshifts.php:23 +msgid "Key changed." +msgstr "Chave modificada." + +#: includes/pages/user_myshifts.php:26 includes/view/User_view.php:335 +msgid "Reset API key" +msgstr "Resetar a chave API" + +#: includes/pages/user_myshifts.php:27 +msgid "" +"If you reset the key, the url to your iCal- and JSON-export and your atom " +"feed changes! You have to update it in every application using one of these " +"exports." +msgstr "" +"Se você reconfigurar a chave, as urls para seu iCal, a exportação em formato " +"JSON \n" +"e seu feed atom será alterada! Você precisará atualizá-las em todas as " +"aplicações que estiverem \n" +"usando uma delas." + +#: includes/pages/user_myshifts.php:28 +msgid "Continue" +msgstr "Continuar" + +#: includes/pages/user_myshifts.php:60 +msgid "Please enter a freeload comment!" +msgstr "Por favor insira um comentário freeload!" + +#: includes/pages/user_myshifts.php:79 +msgid "Shift saved." +msgstr "Turno salvo." + +#: includes/pages/user_myshifts.php:107 +msgid "Shift canceled." +msgstr "Turno cancelado." + +#: includes/pages/user_myshifts.php:109 +msgid "" +"It's too late to sign yourself off the shift. If neccessary, ask the " +"dispatcher to do so." +msgstr "" +"Está muito tarde para se retirar deste turno. Se necessário, peça a \n" +"um dispatcher para removê-lo." + +#: includes/pages/user_news.php:4 +msgid "News comments" +msgstr "Novos comentários" + +#: includes/pages/user_news.php:8 +msgid "News" +msgstr "Novidades" + +#: includes/pages/user_news.php:12 +msgid "Meetings" +msgstr "Encontros" + +#: includes/pages/user_news.php:68 +msgid "Comments" +msgstr "Comentários" + +#: includes/pages/user_news.php:86 includes/pages/user_news.php:127 +msgid "Entry saved." +msgstr "Entrada salva." + +#: includes/pages/user_news.php:104 +msgid "New Comment:" +msgstr "Novo comentário:" + +#: includes/pages/user_news.php:110 +msgid "Invalid request." +msgstr "Requisição inválida." + +#: includes/pages/user_news.php:158 +msgid "Create news:" +msgstr "Criar novidades:" + +#: includes/pages/user_questions.php:4 includes/view/Questions_view.php:29 +msgid "Ask the Heaven" +msgstr "Pergunte ao paraíso" + +#: includes/pages/user_questions.php:27 +msgid "Unable to save question." +msgstr "Não foi possível salvar a sua pergunta." + +#: includes/pages/user_questions.php:29 +msgid "You question was saved." +msgstr "Sua pergunta foi salva." + +#: includes/pages/user_questions.php:33 +msgid "Please enter a question!" +msgstr "Por favor digite sua dúvida!" + +#: includes/pages/user_questions.php:41 +msgid "Incomplete call, missing Question ID." +msgstr "Chamada incompletada, falta o ID da pergunta." + +#: includes/pages/user_questions.php:50 +msgid "No question found." +msgstr "Nenhuma dúvida encontrada." + +#: includes/pages/user_settings.php:4 includes/view/User_view.php:332 +msgid "Settings" +msgstr "Configurações" + +#: includes/pages/user_settings.php:62 +msgid "" +"Please enter your planned date of departure. It should be after your planned " +"arrival date and after buildup start date and before teardown end date." +msgstr "" +"Por favor digite sua data de saída. Ela deve ser posterior à data de " +"chegada\n" +"e ao início da montagem, e anterior à data de desmontagem." + +#: includes/pages/user_settings.php:93 +msgid "-> not OK. Please try again." +msgstr "-> não OK. Por favor tente novamente." + +#: includes/pages/user_settings.php:101 +msgid "Failed setting password." +msgstr "A alteração da senha falhaou." + +#: includes/pages/user_settings.php:126 +msgid "Theme changed." +msgstr "Tema alterado." + +#: includes/pages/user_shifts.php:82 +msgid "The administration has not configured any rooms yet." +msgstr "O administrador não configurou nenhuma sala ainda." + +#: includes/pages/user_shifts.php:94 +msgid "The administration has not configured any shifts yet." +msgstr "O administrador não configurou nenhum turno ainda." + +#: includes/pages/user_shifts.php:104 +msgid "" +"The administration has not configured any angeltypes yet - or you are not " +"subscribed to any angeltype." +msgstr "" +"O administrador ainda não configurou os tipos de anjos - ou você não está\n" +"inscrito em nenhum tipo de anjo." + +#: includes/pages/user_shifts.php:142 +msgid "occupied" +msgstr "ocupado" + +#: includes/pages/user_shifts.php:146 +msgid "free" +msgstr "livre" + +#: includes/pages/user_shifts.php:165 +msgid "Occupancy" +msgstr "Ocupação" + +#: includes/pages/user_shifts.php:166 +msgid "" +"The tasks shown here are influenced by the angeltypes you joined already!" +msgstr "" +"As tarefas mostradas aqui são influenciadas pelos tipos de anjos de que você " +"já faz parte!" + +#: includes/pages/user_shifts.php:166 +msgid "Description of the jobs." +msgstr "Descrição dos trabalhos." + +#: includes/pages/user_shifts.php:168 +msgid "iCal export" +msgstr "Exportar iCal" + +#: includes/pages/user_shifts.php:168 +#, php-format +msgid "" +"Export of shown shifts. iCal format or JSON format available (please keep secret, otherwise reset the api key)." +msgstr "" +"Exportar os turnos mostrados. formato iCal ou formato JSON disponíveis (por favor mantenha secreto, ou resete a chave API)." + +#: includes/pages/user_shifts.php:169 +msgid "Filter" +msgstr "Filtro" + +#: includes/pages/user_shifts.php:191 includes/view/ShiftTypes_view.php:23 +msgid "All" +msgstr "Todos" + +#: includes/pages/user_shifts.php:192 +msgid "None" +msgstr "Nenhum" + +#: includes/sys_menu.php:139 +msgid "Admin" +msgstr "Admin" + +#: includes/sys_menu.php:163 +msgid "Manage rooms" +msgstr "Gerenciar salas" + +#: includes/sys_template.php:166 +msgid "No data found." +msgstr "Nenhum dado encontrado." + +#: includes/view/AngelTypes_view.php:27 includes/view/AngelTypes_view.php:244 +msgid "Unconfirmed" +msgstr "Não confirmado" + +#: includes/view/AngelTypes_view.php:29 includes/view/AngelTypes_view.php:33 +msgid "Supporter" +msgstr "Apoiador" + +#: includes/view/AngelTypes_view.php:31 includes/view/AngelTypes_view.php:35 +msgid "Member" +msgstr "Membro" + +#: includes/view/AngelTypes_view.php:42 +#, php-format +msgid "Do you want to delete angeltype %s?" +msgstr "Você deseja apagar o tipo de anjo %s?" + +#: includes/view/AngelTypes_view.php:44 includes/view/ShiftTypes_view.php:15 +#: includes/view/UserAngelTypes_view.php:8 +#: includes/view/UserAngelTypes_view.php:19 +#: includes/view/UserAngelTypes_view.php:30 +#: includes/view/UserAngelTypes_view.php:41 +#: includes/view/UserAngelTypes_view.php:52 +#: includes/view/UserAngelTypes_view.php:82 +msgid "cancel" +msgstr "cancelar" + +#: includes/view/AngelTypes_view.php:67 includes/view/AngelTypes_view.php:269 +msgid "Restricted" +msgstr "Restrito" + +#: includes/view/AngelTypes_view.php:68 +msgid "No Self Sign Up" +msgstr "Auto inscrição não permitida" + +#: includes/view/AngelTypes_view.php:69 +msgid "Requires driver license" +msgstr "Requer carteira de motorista" + +#: includes/view/AngelTypes_view.php:73 +msgid "" +"Restricted angel types can only be used by an angel if enabled by a " +"supporter (double opt-in)." +msgstr "" +"Tipos de anjo restritos só podem ser usados por um anjo quando autorizados " +"por \n" +"um apoiador (duplo opt-in)." + +#: includes/view/AngelTypes_view.php:74 includes/view/AngelTypes_view.php:205 +#: includes/view/ShiftTypes_view.php:37 includes/view/ShiftTypes_view.php:58 +#: includes/view/Shifts_view.php:92 +msgid "Description" +msgstr "Descrição" + +#: includes/view/AngelTypes_view.php:75 includes/view/ShiftTypes_view.php:38 +msgid "Please use markdown for the description." +msgstr "Por favor use markdown para a descrição." + +#: includes/view/AngelTypes_view.php:90 +msgid "my driving license" +msgstr "Minha carteira de motorista" + +#: includes/view/AngelTypes_view.php:97 +msgid "" +"This angeltype requires a driver license. Please enter your driver license " +"information!" +msgstr "" +"Esse tipo de anjo requer carteira de motorista. Por favor digite sua " +"carteira de motorista." + +#: includes/view/AngelTypes_view.php:101 +#, php-format +msgid "" +"You are unconfirmed for this angeltype. Please go to the introduction for %s " +"to get confirmed." +msgstr "" +"Você não está confirmado para esse tipo de anjo. Por favor vá para a " +"apresentação para %s\n" +"para ser confirmado." + +#: includes/view/AngelTypes_view.php:140 +msgid "confirm" +msgstr "confirmar" + +#: includes/view/AngelTypes_view.php:141 +msgid "deny" +msgstr "rejeitar" + +#: includes/view/AngelTypes_view.php:157 +msgid "remove" +msgstr "remover" + +#: includes/view/AngelTypes_view.php:179 +msgid "Driver" +msgstr "Motorista" + +#: includes/view/AngelTypes_view.php:180 +msgid "Has car" +msgstr "Tem carro" + +#: includes/view/AngelTypes_view.php:181 +#: includes/view/UserDriverLicenses_view.php:27 +msgid "Car" +msgstr "Carro" + +#: includes/view/AngelTypes_view.php:182 +msgid "3,5t Transporter" +msgstr "Transporte 3,5t" + +#: includes/view/AngelTypes_view.php:183 +msgid "7,5t Truck" +msgstr "Caminhão 7,5t" + +#: includes/view/AngelTypes_view.php:184 +msgid "12,5t Truck" +msgstr "Caminhão 12,5t" + +#: includes/view/AngelTypes_view.php:185 +#: includes/view/UserDriverLicenses_view.php:31 +msgid "Forklift" +msgstr "Empilhadeira" + +#: includes/view/AngelTypes_view.php:215 +msgid "Supporters" +msgstr "Apoiadores" + +#: includes/view/AngelTypes_view.php:235 +msgid "Members" +msgstr "Membros" + +#: includes/view/AngelTypes_view.php:238 +#: includes/view/UserAngelTypes_view.php:72 +msgid "Add" +msgstr "Adicionar" + +#: includes/view/AngelTypes_view.php:246 +msgid "confirm all" +msgstr "confirmar todos" + +#: includes/view/AngelTypes_view.php:247 +msgid "deny all" +msgstr "rejeitar todos" + +#: includes/view/AngelTypes_view.php:264 +msgid "New angeltype" +msgstr "Novo tipo de anjo" + +#: includes/view/AngelTypes_view.php:270 +msgid "Self Sign Up Allowed" +msgstr "Auto Inscrição autorizada" + +#: includes/view/AngelTypes_view.php:271 +msgid "Membership" +msgstr "Membro" + +#: includes/view/AngelTypes_view.php:296 +msgid "" +"This angeltype is restricted by double-opt-in by a team supporter. Please " +"show up at the according introduction meetings." +msgstr "" +"Esse tipo de anjo é restrito por um opt-in duplo por um time de apoio. Por " +"favor\n" +"compareça de acordo com os encontros de introdução." + +#: includes/view/AngelTypes_view.php:317 +msgid "FAQ" +msgstr "FAQ" + +#: includes/view/AngelTypes_view.php:319 +msgid "" +"Here is the list of teams and their tasks. If you have questions, read the " +"FAQ." +msgstr "" +"Aqui está uma lista dos times e suas tarefas. Se você tem dúvidas, leia a\n" +"FAQ." + +#: includes/view/EventConfig_view.php:10 includes/view/EventConfig_view.php:18 +#, php-format +msgid "Welcome to the %s!" +msgstr "Bem vindo a %s!" + +#: includes/view/EventConfig_view.php:24 +msgid "Buildup starts" +msgstr "Início da montagem" + +#: includes/view/EventConfig_view.php:26 includes/view/EventConfig_view.php:34 +#: includes/view/EventConfig_view.php:42 includes/view/EventConfig_view.php:50 +#: includes/view/EventConfig_view.php:67 includes/view/EventConfig_view.php:72 +#: includes/view/EventConfig_view.php:77 includes/view/Shifts_view.php:68 +#: includes/view/Shifts_view.php:76 +msgid "Y-m-d" +msgstr "d/m/Y" + +#: includes/view/EventConfig_view.php:32 +msgid "Event starts" +msgstr "O evento começa em" + +#: includes/view/EventConfig_view.php:40 +msgid "Event ends" +msgstr "O evento termina em" + +#: includes/view/EventConfig_view.php:48 +msgid "Teardown ends" +msgstr "Desmontagem termina" + +#: includes/view/EventConfig_view.php:67 +#, php-format +msgid "%s, from %s to %s" +msgstr "%s, de %s para %s" + +#: includes/view/EventConfig_view.php:72 +#, php-format +msgid "%s, starting %s" +msgstr "%s, começando %s" + +#: includes/view/EventConfig_view.php:77 +#, php-format +msgid "Event from %s to %s" +msgstr "Evento de %s para %s" + +#: includes/view/EventConfig_view.php:106 +msgid "Event Name" +msgstr "Nome do evento" + +#: includes/view/EventConfig_view.php:107 +msgid "Event Name is shown on the start page." +msgstr "Nome do evento é mostrado na página inicial." + +#: includes/view/EventConfig_view.php:108 +msgid "Event Welcome Message" +msgstr "Mensagem de boas vindas do evento" + +#: includes/view/EventConfig_view.php:109 +msgid "" +"Welcome message is shown after successful registration. You can use markdown." +msgstr "" +"A mensagem de boas vindas é mostrada após a inscrição. Você pode usar " +"markdown." + +#: includes/view/EventConfig_view.php:112 +msgid "Buildup date" +msgstr "Data da montagem" + +#: includes/view/EventConfig_view.php:113 +msgid "Event start date" +msgstr "Data de início do evento" + +#: includes/view/EventConfig_view.php:116 +msgid "Teardown end date" +msgstr "Data da desmontagem" + +#: includes/view/EventConfig_view.php:117 +msgid "Event end date" +msgstr "Data de término do evento" + +#: includes/view/Questions_view.php:17 +msgid "Open questions" +msgstr "Dúvidas abertas" + +#: includes/view/Questions_view.php:31 +msgid "Your Question:" +msgstr "Sua dúvida:" + +#: includes/view/ShiftCalendarRenderer.php:209 includes/view/User_view.php:367 +msgid "Time" +msgstr "Hora" + +#: includes/view/ShiftCalendarRenderer.php:248 +msgid "Your shift" +msgstr "Seu turno" + +#: includes/view/ShiftCalendarRenderer.php:249 +msgid "Help needed" +msgstr "Necessita ajuda" + +#: includes/view/ShiftCalendarRenderer.php:250 +msgid "Other angeltype needed / collides with my shifts" +msgstr "Outro tipo de anjo necessário / colide com seus turnos" + +#: includes/view/ShiftCalendarRenderer.php:251 +msgid "Shift is full" +msgstr "O turno está lotado" + +#: includes/view/ShiftCalendarRenderer.php:252 +msgid "Shift running/ended" +msgstr "Turno em andamento/finalizado" + +#: includes/view/ShiftCalendarShiftRenderer.php:96 +msgid "Add more angels" +msgstr "Adicionar mais anjos" + +#: includes/view/ShiftCalendarShiftRenderer.php:127 +#, php-format +msgid "%d helper needed" +msgid_plural "%d helpers needed" +msgstr[0] "%d necessita de ajuda" +msgstr[1] "%d necessitam de ajuda" + +#: includes/view/ShiftCalendarShiftRenderer.php:132 +#: includes/view/Shifts_view.php:23 +msgid "Sign up" +msgstr "Registrar" + +#: includes/view/ShiftCalendarShiftRenderer.php:137 +msgid "ended" +msgstr "encerrado" + +#: includes/view/ShiftCalendarShiftRenderer.php:146 +#: includes/view/Shifts_view.php:25 +#, php-format +msgid "Become %s" +msgstr "Tornar-se %s" + +#: includes/view/ShiftEntry_view.php:18 includes/view/User_view.php:267 +#: includes/view/User_view.php:269 +msgid "Freeloaded" +msgstr "Freeloaded" + +#: includes/view/ShiftEntry_view.php:19 +msgid "Freeload comment (Only for shift coordination):" +msgstr "Comentário freeload (Apenas para coordenação de turno):" + +#: includes/view/ShiftEntry_view.php:22 +msgid "Edit shift entry" +msgstr "Editar entrada de turno" + +#: includes/view/ShiftEntry_view.php:25 +msgid "Angel:" +msgstr "Anjo:" + +#: includes/view/ShiftEntry_view.php:26 +msgid "Date, Duration:" +msgstr "Data, Duração:" + +#: includes/view/ShiftEntry_view.php:27 +msgid "Location:" +msgstr "Local:" + +#: includes/view/ShiftEntry_view.php:28 +msgid "Title:" +msgstr "Título:" + +#: includes/view/ShiftEntry_view.php:29 +msgid "Type:" +msgstr "Tipo:" + +#: includes/view/ShiftEntry_view.php:30 +msgid "Comment (for your eyes only):" +msgstr "Comentário (apenas para ler):" + +#: includes/view/ShiftTypes_view.php:13 +#, php-format +msgid "Do you want to delete shifttype %s?" +msgstr "Você quer apagar o turno %s?" + +#: includes/view/ShiftTypes_view.php:29 +msgid "Edit shifttype" +msgstr "Editar tipo de turno" + +#: includes/view/ShiftTypes_view.php:29 +msgid "Create shifttype" +msgstr "Criar tipo de turno" + +#: includes/view/ShiftTypes_view.php:48 +#, php-format +msgid "for team %s" +msgstr "para o time %s" + +#: includes/view/ShiftTypes_view.php:75 +msgid "New shifttype" +msgstr "Novo tipo de turno" + +#: includes/view/Shifts_view.php:7 +#, php-format +msgid "created at %s by %s" +msgstr "criado em %s por %s" + +#: includes/view/Shifts_view.php:10 +#, php-format +msgid "edited at %s by %s" +msgstr "editado em %s por %s" + +#: includes/view/Shifts_view.php:52 +msgid "This shift collides with one of your shifts." +msgstr "Esse turno colide com um dos seus outros turnos." + +#: includes/view/Shifts_view.php:53 +msgid "You are signed up for this shift." +msgstr "Você foi designado para esse turno." + +#: includes/view/Shifts_view.php:82 includes/view/User_view.php:368 +msgid "Location" +msgstr "Local" + +#: includes/view/UserAngelTypes_view.php:6 +#, php-format +msgid "Do you really want to add supporter rights for %s to %s?" +msgstr "Você realmente quer dar permissão de apoiador de %s para %s?" + +#: includes/view/UserAngelTypes_view.php:6 +#, php-format +msgid "Do you really want to remove supporter rights for %s from %s?" +msgstr "Você realmente quer remover a permissão de apoiador de %s para %s?" + +#: includes/view/UserAngelTypes_view.php:17 +#, php-format +msgid "Do you really want to deny all users for %s?" +msgstr "Você realmente quer negar todos os usuários para %s?" + +#: includes/view/UserAngelTypes_view.php:28 +#, php-format +msgid "Do you really want to confirm all users for %s?" +msgstr "Você realmente quer confirmar todos os usuários para %s?" + +#: includes/view/UserAngelTypes_view.php:39 +#, php-format +msgid "Do you really want to confirm %s for %s?" +msgstr "Você realmente quer confirmar %s para %s?" + +#: includes/view/UserAngelTypes_view.php:50 +#, php-format +msgid "Do you really want to delete %s from %s?" +msgstr "Você realmente quer apagar %s de %s?" + +#: includes/view/UserAngelTypes_view.php:71 +msgid "User" +msgstr "Usuário" + +#: includes/view/UserAngelTypes_view.php:80 +#, php-format +msgid "Do you really want to add %s to %s?" +msgstr "Você realmente quer adicionar %s em %s?" + +#: includes/view/UserAngelTypes_view.php:83 +msgid "save" +msgstr "salvar" + +#: includes/view/UserDriverLicenses_view.php:17 +msgid "Back to profile" +msgstr "Voltar para o perfil" + +#: includes/view/UserDriverLicenses_view.php:21 +msgid "Privacy" +msgstr "Privacidade" + +#: includes/view/UserDriverLicenses_view.php:21 +msgid "" +"Your driving license information is only visible for supporters and admins." +msgstr "" +"Os dados da sua carteira de motorista são apenas visíveis para os apoiadores " +"e os admins." + +#: includes/view/UserDriverLicenses_view.php:22 +msgid "I am willing to drive a car for the event" +msgstr "Eu desejo dirigir carros para o evento" + +#: includes/view/UserDriverLicenses_view.php:25 +msgid "" +"I have my own car with me and am willing to use it for the event (You'll get " +"reimbursed for fuel)" +msgstr "" +"Eu tenho meu próprio carro e estou disposto a usá-lo no evento\n" +"(Você terá o combustível reembolsado)" + +#: includes/view/UserDriverLicenses_view.php:26 +msgid "Driver license" +msgstr "Carteira de motorista" + +#: includes/view/UserDriverLicenses_view.php:28 +msgid "Transporter 3,5t" +msgstr "Transportador 3,5t" + +#: includes/view/UserDriverLicenses_view.php:29 +msgid "Truck 7,5t" +msgstr "Caminhão 7,5t" + +#: includes/view/UserDriverLicenses_view.php:30 +msgid "Truck 12,5t" +msgstr "Caminhão 12,5t" + +#: includes/view/User_view.php:7 +msgid "Please select..." +msgstr "Por favor selecione..." + +#: includes/view/User_view.php:38 +msgid "Here you can change your user details." +msgstr "Aqui você pode mudar os seus detalhes de usuário." + +#: includes/view/User_view.php:44 +msgid "Planned date of departure" +msgstr "Data planejada para saída" + +#: includes/view/User_view.php:55 +msgid "Please visit the angeltypes page to manage your angeltypes." +msgstr "" +"Por favor visite a página de tipos de anjo para gerenciar os tipos de anjo" + +#: includes/view/User_view.php:61 +msgid "Here you can change your password." +msgstr "Aqui você pode mudar sua senha." + +#: includes/view/User_view.php:62 +msgid "Old password:" +msgstr "Senha antiga:" + +#: includes/view/User_view.php:63 +msgid "New password:" +msgstr "Nova senha:" + +#: includes/view/User_view.php:64 +msgid "Password confirmation:" +msgstr "Confirmação de senha:" + +#: includes/view/User_view.php:68 +msgid "Here you can choose your color settings:" +msgstr "Aqui você pode selecionar sua configuração de cor:" + +#: includes/view/User_view.php:69 +msgid "Color settings:" +msgstr "Configuração de cor:" + +#: includes/view/User_view.php:73 +msgid "Here you can choose your language:" +msgstr "Aqui você pode selecionar seu idioma:" + +#: includes/view/User_view.php:74 +msgid "Language:" +msgstr "Idioma:" + +#: includes/view/User_view.php:88 +msgid "Registration successful" +msgstr "Registrado com sucesso" + +#: includes/view/User_view.php:126 +msgid "" +"Do you really want to delete the user including all his shifts and every " +"other piece of his data?" +msgstr "" +"Você realmente quer apagar o usuário, incluindo todos seus turnos e todos\n" +"os seus dados?" + +#: includes/view/User_view.php:128 +msgid "Your password" +msgstr "Sua senha" + +#: includes/view/User_view.php:143 +#, php-format +msgid "Angel should receive at least %d vouchers." +msgstr "Um anjo deve receber no mínimo %d vouchers." + +#: includes/view/User_view.php:145 +msgid "Number of vouchers given out" +msgstr "Número de vouchers dados" + +#: includes/view/User_view.php:159 +msgid "m/d/Y h:i a" +msgstr "d/m/Y H:i" + +#: includes/view/User_view.php:178 +msgid "New user" +msgstr "Novo usuário" + +#: includes/view/User_view.php:182 +msgid "Prename" +msgstr "Nome" + +#: includes/view/User_view.php:185 includes/view/User_view.php:350 +msgid "Arrived" +msgstr "Chegou" + +#: includes/view/User_view.php:186 +msgid "Voucher" +msgstr "Voucher" + +#: includes/view/User_view.php:187 +msgid "Freeloads" +msgstr "Freeloads" + +#: includes/view/User_view.php:188 includes/view/User_view.php:352 +msgid "Active" +msgstr "Ativo" + +#: includes/view/User_view.php:190 includes/view/User_view.php:353 +msgid "T-Shirt" +msgstr "Camiseta" + +#: includes/view/User_view.php:192 +msgid "Last login" +msgstr "Último login" + +#: includes/view/User_view.php:209 +msgid "Free" +msgstr "Livre" + +#: includes/view/User_view.php:214 includes/view/User_view.php:216 +#, php-format +msgid "Next shift %c" +msgstr "Próximo turno %c" + +#: includes/view/User_view.php:221 +#, php-format +msgid "Shift starts %c" +msgstr "Turno inicia em %c" + +#: includes/view/User_view.php:223 +#, php-format +msgid "Shift ends %c" +msgstr "Turno termina em %c" + +#: includes/view/User_view.php:280 +msgid "sign off" +msgstr "sair" + +#: includes/view/User_view.php:305 +msgid "Sum:" +msgstr "Soma:" + +#: includes/view/User_view.php:329 +msgid "driving license" +msgstr "carteira de motorista" + +#: includes/view/User_view.php:331 +msgid "Edit vouchers" +msgstr "Editar vouchers" + +#: includes/view/User_view.php:333 +msgid "iCal Export" +msgstr "Exportar iCal" + +#: includes/view/User_view.php:334 +msgid "JSON Export" +msgstr "Exportar em formato JSON" + +#: includes/view/User_view.php:347 +msgid "User state" +msgstr "Status" + +#: includes/view/User_view.php:350 +#, php-format +msgid "Arrived at %s" +msgstr "Chegous às %s" + +#: includes/view/User_view.php:350 +#, php-format +msgid "Not arrived (Planned: %s)" +msgstr "Não chegou (Planejado: %s)" + +#: includes/view/User_view.php:350 +msgid "Not arrived" +msgstr "Não chegou" + +#: includes/view/User_view.php:351 +#, php-format +msgid "Got %s voucher" +msgid_plural "Got %s vouchers" +msgstr[0] "Einen Voucher bekommen" +msgstr[1] "%s Voucher bekommen" + +#: includes/view/User_view.php:351 +msgid "Got no vouchers" +msgstr "Pegou voucher %s" + +#: includes/view/User_view.php:360 +msgid "Rights" +msgstr "Permissões" + +#: includes/view/User_view.php:369 +msgid "Name & workmates" +msgstr "Nome & colegas" + +#: includes/view/User_view.php:370 +msgid "Comment" +msgstr "Comentar" + +#: includes/view/User_view.php:371 +msgid "Action" +msgstr "Ação" + +#: includes/view/User_view.php:373 +#, php-format +msgid "Your night shifts between %d and %d am count twice." +msgstr "Os seus turnos noturnos entre %dh e %dh contam como dois." + +#: includes/view/User_view.php:374 +#, php-format +msgid "" +"Go to the shifts table to sign yourself up for some " +"shifts." +msgstr "" +"Vá para a tabela de turnos para se inscrever em alguns\n" +"turnos." + +#: includes/view/User_view.php:384 +msgid "" +"We will send you an e-mail with a password recovery link. Please use the " +"email address you used for registration." +msgstr "" +"Nós enviaremos um email com um link para recuperação de senha. Por favor use " +"o \n" +"endereço de email informado no seu registro." + +#: includes/view/User_view.php:387 +msgid "Recover" +msgstr "Recuperar" + +#: includes/view/User_view.php:398 +msgid "Please enter a new password." +msgstr "Por favor digite uma nova senha." + +#: includes/view/User_view.php:447 +msgid "" +"Please enter your planned date of departure on your settings page to give us " +"a feeling for teardown capacities." +msgstr "" +"Por favor digite sua data planejada de saída na sua página de configurações " +"para\n" +"termos uma noção da nossa capacidade de desmontagem." + +#: includes/view/User_view.php:457 +#, php-format +msgid "" +"You freeloaded at least %s shifts. Shift signup is locked. Please go to " +"heavens desk to be unlocked again." +msgstr "" +"Você deixou de participar de pelo menos %s dos turnos. O registro em turnos " +"está suspenso.\n" +"Por favor vá até a mesa do paraíso para ser desbloqueado novamente." + +#: includes/view/User_view.php:468 +msgid "" +"You are not marked as arrived. Please go to heaven's desk, get your angel " +"badge and/or tell them that you arrived already." +msgstr "" +"Sua chegada não foi marcada. Por favor vá até a mesa do paraíso, pegue sua " +"credencial\n" +"de anjo e/ou informe que você já chegou." + +#: includes/view/User_view.php:478 +msgid "You need to specify a tshirt size in your settings!" +msgstr "Você precisa especificar o tamanho de camiseta nas suas configurações!" + +#: includes/view/User_view.php:488 +msgid "" +"You need to specify a DECT phone number in your settings! If you don't have " +"a DECT phone, just enter \"-\"." +msgstr "" +"Você precisa especificar um número DECT de telefone nas suas configuracões!\n" +"Se você não tem um telefone DECT, apenas digite \\-\\." + +#: public/index.php:155 +msgid "No Access" +msgstr "Sem acesso" + +#: public/index.php:156 +msgid "" +"You don't have permission to view this page. You probably have to sign in or " +"register in order to gain access!" +msgstr "" +"Você não tem permissão para ver essa página. Você provavelmente terá que " +"fazer login ou se registrar para ganhar acesso!" + +#~ msgid "Registration is disabled." +#~ msgstr "Registros estão desabilitados." + +#~ msgid "Please enter your planned date of arrival." +#~ msgstr "Por favor digite seu horario planificado de chagada " + +#~ msgid "Password could not be updated." +#~ msgstr "Nao foi possivel atualizar a senha" + +#~ msgid "We got no information about the event right now." +#~ msgstr "Nao tem info sobre o evento agora" + +#~ msgid "from %s to %s" +#~ msgstr "desde %s ate %s" + +#~ msgid "Please enter your planned date of departure." +#~ msgstr "Por favor pone seu horario planificado de ida" + +#~ msgid "Please select a user." +#~ msgstr "Seleciona um usuario" + +#~ msgid "Unable to load user." +#~ msgstr "Nao foi possivel carregar o usuario" + +#~ msgid "Entries" +#~ msgstr "Entradas" + +#~ msgid "Use new style if possible" +#~ msgstr "Usa umo estilo novo se possivel" + +#~ msgid "Coordinator" +#~ msgstr "Coordinador" + +#~ msgid "Coordinators" +#~ msgstr "Coordinadores" + +#~ msgid " vouchers." +#~ msgstr " vouchers." + +#~ msgid "" +#~ "This is a automatically calculated MINIMUM value, you can of course give " +#~ "out more if appropriate!" +#~ msgstr "" +#~ "Esso e' calucula automaticamente o valor MINIMO, voce pode claramente " +#~ "mudar isso com umo mais appropriado! " + +#~ msgid "You have been signed off from the shift." +#~ msgstr "Voce se desconnecto do seu turno" + +#~ msgid "planned departure" +#~ msgstr "saida planejada" + +#~ msgid "Tasks" +#~ msgstr "tarefas" + +#~ msgid "User didnt got vouchers." +#~ msgstr "O usuario nao tem vouchers." + +#~ msgid "Remove vouchers" +#~ msgstr "Apaga voucher" + +#~ msgid "" +#~ "This shift is running now or ended already. Please contact a dispatcher " +#~ "to join the shift." +#~ msgstr "" +#~ "Esse turno esta ativo agora o ja acabou. Por favor contata o coordinador " +#~ "para partecipar nesse turno" + +#~ msgid "" +#~ "You already subscribed to shift in the same timeslot. Please contact a " +#~ "dispatcher to join the shift." +#~ msgstr "" +#~ "Voce ja se registrou al turno no mesmo timeslot. Por favor contata o " +#~ "coordinador para partecipar a esse turno." + +#~ msgid "" +#~ "Hello %s, here you can change your personal settings i.e. password, color " +#~ "settings etc." +#~ msgstr "" +#~ "Oi %s, aqui pode mudar as tuas configuraçeos pessoal (i.e. senha, " +#~ "cor, ...)" + +#~ msgid "Name/Description:" +#~ msgstr "Nome/Descriçao:" + +#~ msgid "Timeslot" +#~ msgstr "Timeslot" + +#~ msgid "The first wants to join %s." +#~ msgstr "O primeiro que quer partecipar %s" + +#~ msgid "Groups" +#~ msgstr "Grupos" + +#~ msgid "ICQ" +#~ msgstr "ICQ" + +#~ msgid "You are not confirmed for this angel type." +#~ msgstr "Voce nao ta confirmado por esse tipo de anjo." + +#~ msgid "Exports" +#~ msgstr "Esporta" + +#~ msgid "Add new angeltype" +#~ msgstr "Adicione um novo tipo de anjo" + +#~ msgid "Language" +#~ msgstr "Idioma" + +#~ msgid "You have %s new message." +#~ msgid_plural "You have %s new messages." +#~ msgstr[0] "Voce tem %s novo message" +#~ msgstr[1] "" + +#~ msgid "" +#~ "These are your shifts.
Please try to appear 15 minutes before " +#~ "your shift begins!
You can remove yourself from a shift up to %d " +#~ "hours before it starts." +#~ msgstr "" +#~ "Esses som teu turnos.
Por favor tenta chegar 15 minudos antes " +#~ "que seu turno comença!
Voce pode se tirar desse turno ate %d horas " +#~ "antes dele començar." + +#~ msgid "Page:" +#~ msgstr "Pagina" + +#~ msgid "Message:" +#~ msgstr "Messagem:" + +#~ msgid "Wakeup" +#~ msgstr "Wakeup" + +#~ msgid "Incomplete call, missing wake-up ID." +#~ msgstr "chamada incompleta, falta o wake-up ID" + +#~ msgid "Wake-up call deleted." +#~ msgstr "wake-up chamada apagada" + +#~ msgid "No wake-up found." +#~ msgstr "Nao encontrei nenhum wake-up" + +#~ msgid "" +#~ "Hello %s, here you can register for a wake-up call. Simply say when and " +#~ "where the angel should come to wake you." +#~ msgstr "" +#~ "Oi %s, aqui voce pode se registrar para a chamada wake-up. So tem que " +#~ "dizer quando e onde os anjos tem que chegar para te acordar (wake up)" + +#~ msgid "All ordered wake-up calls, next first." +#~ msgstr "Todos os ordem wake-up, o proximo primeiro" + +#~ msgid "Place" +#~ msgstr "Lugar" + +#~ msgid "Notes" +#~ msgstr "Notas" + +#~ msgid "Schedule a new wake-up here:" +#~ msgstr "Planifica um novo wake-up aqui:" + +#~ msgid "User %s confirmed as %s." +#~ msgstr "Usuario %s confirmado como %s" + +#~ msgid "" +#~ "Resistance is futile! Your biological and physical parameters will be " +#~ "added to our collectiv! Assimilating angel:" +#~ msgstr "" +#~ "Resistir e' inútil! Seus parâmetros biológico e físico serão adicionados " +#~ "dentro do nosso coletivo! Anjo assimilado: " + +#~ msgid "Confirmed all." +#~ msgstr "Tudo confirmado." + +#~ msgid "asdf" +#~ msgstr "asdf" diff --git a/src/Helpers/Translation/GettextTranslator.php b/src/Helpers/Translation/GettextTranslator.php new file mode 100644 index 00000000..7f2299e2 --- /dev/null +++ b/src/Helpers/Translation/GettextTranslator.php @@ -0,0 +1,53 @@ +assertHasTranslation($domain, $context, $original); + + return parent::dpgettext($domain, $context, $original); + } + + /** + * @param string $domain + * @param string $context + * @param string $original + * @param string $plural + * @param string $value + * @return string + * @throws TranslationNotFound + */ + public function dnpgettext($domain, $context, $original, $plural, $value) + { + $this->assertHasTranslation($domain, $context, $original); + + return parent::dnpgettext($domain, $context, $original, $plural, $value); + } + + /** + * @param string $domain + * @param string $context + * @param string $original + * @throws TranslationNotFound + */ + protected function assertHasTranslation($domain, $context, $original) + { + if ($this->getTranslation($domain, $context, $original)) { + return; + } + + throw new TranslationNotFound(implode('/', [$domain, $context, $original])); + } +} diff --git a/src/Helpers/Translation/TranslationNotFound.php b/src/Helpers/Translation/TranslationNotFound.php new file mode 100644 index 00000000..1552838b --- /dev/null +++ b/src/Helpers/Translation/TranslationNotFound.php @@ -0,0 +1,9 @@ +app->get('config'); @@ -17,41 +21,36 @@ class TranslationServiceProvider extends ServiceProvider $locales = $config->get('locales'); $locale = $config->get('default_locale'); + $fallbackLocale = $config->get('fallback_locale', 'en_US'); $sessionLocale = $session->get('locale', $locale); if (isset($locales[$sessionLocale])) { $locale = $sessionLocale; } - $this->initGettext(); $session->set('locale', $locale); $translator = $this->app->make( Translator::class, - ['locale' => $locale, 'locales' => $locales, 'localeChangeCallback' => [$this, 'setLocale']] + [ + 'locale' => $locale, + 'locales' => $locales, + 'fallbackLocale' => $fallbackLocale, + 'getTranslatorCallback' => [$this, 'getTranslator'], + 'localeChangeCallback' => [$this, 'setLocale'], + ] ); $this->app->instance(Translator::class, $translator); $this->app->instance('translator', $translator); } - /** - * @param string $textDomain - * @param string $encoding - * @codeCoverageIgnore - */ - protected function initGettext($textDomain = 'default', $encoding = 'UTF-8') - { - bindtextdomain($textDomain, $this->app->get('path.lang')); - bind_textdomain_codeset($textDomain, $encoding); - textdomain($textDomain); - } - /** * @param string $locale * @codeCoverageIgnore */ - public function setLocale($locale) + public function setLocale(string $locale): void { + $locale .= '.UTF-8'; // Set the users locale putenv('LC_ALL=' . $locale); setlocale(LC_ALL, $locale); @@ -60,4 +59,28 @@ class TranslationServiceProvider extends ServiceProvider putenv('LC_NUMERIC=C'); setlocale(LC_NUMERIC, 'C'); } + + /** + * @param string $locale + * @return GettextTranslator + */ + public function getTranslator(string $locale): GettextTranslator + { + if (!isset($this->translators[$locale])) { + $file = $this->app->get('path.lang') . '/' . $locale . '/default.mo'; + + /** @var GettextTranslator $translator */ + $translator = $this->app->make(GettextTranslator::class); + + /** @var Translations $translations */ + $translations = $this->app->make(Translations::class); + $translations->addFromMoFile($file); + + $translator->loadTranslations($translations); + + $this->translators[$locale] = $translator; + } + + return $this->translators[$locale]; + } } diff --git a/src/Helpers/Translation/Translator.php b/src/Helpers/Translation/Translator.php index 545963eb..8b11ecb4 100644 --- a/src/Helpers/Translation/Translator.php +++ b/src/Helpers/Translation/Translator.php @@ -10,6 +10,12 @@ class Translator /** @var string */ protected $locale; + /** @var string */ + protected $fallbackLocale; + + /** @var callable */ + protected $getTranslatorCallback; + /** @var callable */ protected $localeChangeCallback; @@ -17,15 +23,24 @@ class Translator * Translator constructor. * * @param string $locale + * @param string $fallbackLocale + * @param callable $getTranslatorCallback * @param string[] $locales * @param callable $localeChangeCallback */ - public function __construct(string $locale, array $locales = [], callable $localeChangeCallback = null) - { + public function __construct( + string $locale, + string $fallbackLocale, + callable $getTranslatorCallback, + array $locales = [], + callable $localeChangeCallback = null + ) { $this->localeChangeCallback = $localeChangeCallback; + $this->getTranslatorCallback = $getTranslatorCallback; $this->setLocale($locale); - $this->setLocales($locales); + $this->fallbackLocale = $fallbackLocale; + $this->locales = $locales; } /** @@ -37,9 +52,7 @@ class Translator */ public function translate(string $key, array $replace = []): string { - $translated = $this->translateGettext($key); - - return $this->replaceText($translated, $replace); + return $this->translateText('gettext', [$key], $replace); } /** @@ -53,7 +66,29 @@ class Translator */ public function translatePlural(string $key, string $pluralKey, int $number, array $replace = []): string { - $translated = $this->translateGettextPlural($key, $pluralKey, $number); + return $this->translateText('ngettext', [$key, $pluralKey, $number], $replace); + } + + /** + * @param string $type + * @param array $parameters + * @param array $replace + * @return mixed|string + */ + protected function translateText(string $type, array $parameters, array $replace = []) + { + $translated = $parameters[0]; + + foreach ([$this->locale, $this->fallbackLocale] as $lang) { + /** @var GettextTranslator $translator */ + $translator = call_user_func($this->getTranslatorCallback, $lang); + + try { + $translated = call_user_func_array([$translator, $type], $parameters); + break; + } catch (TranslationNotFound $e) { + } + } return $this->replaceText($translated, $replace); } @@ -74,32 +109,6 @@ class Translator return call_user_func_array('sprintf', array_merge([$key], $replace)); } - /** - * Translate the key via gettext - * - * @param string $key - * @return string - * @codeCoverageIgnore - */ - protected function translateGettext(string $key): string - { - return gettext($key); - } - - /** - * Translate the key via gettext - * - * @param string $key - * @param string $keyPlural - * @param int $number - * @return string - * @codeCoverageIgnore - */ - protected function translateGettextPlural(string $key, string $keyPlural, int $number): string - { - return ngettext($key, $keyPlural, $number); - } - /** * @return string */ diff --git a/tests/Unit/Helpers/Translation/Assets/fo_OO/default.mo b/tests/Unit/Helpers/Translation/Assets/fo_OO/default.mo new file mode 100644 index 00000000..96f1f3ca Binary files /dev/null and b/tests/Unit/Helpers/Translation/Assets/fo_OO/default.mo differ diff --git a/tests/Unit/Helpers/Translation/Assets/fo_OO/default.po b/tests/Unit/Helpers/Translation/Assets/fo_OO/default.po new file mode 100644 index 00000000..015bc36d --- /dev/null +++ b/tests/Unit/Helpers/Translation/Assets/fo_OO/default.po @@ -0,0 +1,3 @@ +# Testing content +msgid "foo.bar" +msgstr "Foo Bar!" diff --git a/tests/Unit/Helpers/Translation/GettextTranslatorTest.php b/tests/Unit/Helpers/Translation/GettextTranslatorTest.php new file mode 100644 index 00000000..825cf5b7 --- /dev/null +++ b/tests/Unit/Helpers/Translation/GettextTranslatorTest.php @@ -0,0 +1,67 @@ +getTranslations(); + + $translator = new GettextTranslator(); + $translator->loadTranslations($translations); + + $this->assertEquals('Translation!', $translator->gettext('test.value')); + + $this->expectException(TranslationNotFound::class); + $this->expectExceptionMessage('//foo.bar'); + + $translator->gettext('foo.bar'); + } + + /** + * @covers \Engelsystem\Helpers\Translation\GettextTranslator::dpgettext() + */ + public function testDpgettext() + { + $translations = $this->getTranslations(); + + $translator = new GettextTranslator(); + $translator->loadTranslations($translations); + + $this->assertEquals('Translation!', $translator->dpgettext(null, null, 'test.value')); + } + + /** + * @covers \Engelsystem\Helpers\Translation\GettextTranslator::dnpgettext() + */ + public function testDnpgettext() + { + $translations = $this->getTranslations(); + + $translator = new GettextTranslator(); + $translator->loadTranslations($translations); + + $this->assertEquals('Translations!', $translator->dnpgettext(null, null, 'test.value', 'test.values', 2)); + } + + protected function getTranslations(): Translations + { + $translations = new Translations(); + $translations[] = + (new Translation(null, 'test.value', 'test.values')) + ->setTranslation('Translation!') + ->setPluralTranslations(['Translations!']); + + return $translations; + } +} diff --git a/tests/Unit/Helpers/Translation/TranslationServiceProviderTest.php b/tests/Unit/Helpers/Translation/TranslationServiceProviderTest.php index 171b5967..91307bdd 100644 --- a/tests/Unit/Helpers/Translation/TranslationServiceProviderTest.php +++ b/tests/Unit/Helpers/Translation/TranslationServiceProviderTest.php @@ -14,11 +14,14 @@ class TranslationServiceProviderTest extends ServiceProviderTest /** * @covers \Engelsystem\Helpers\Translation\TranslationServiceProvider::register() */ - public function testRegister() + public function testRegister(): void { + $defaultLocale = 'fo_OO'; + $locale = 'te_ST.WTF-9'; + $locales = ['fo_OO' => 'Foo', 'fo_OO.BAR' => 'Foo (Bar)', 'te_ST.WTF-9' => 'WTF\'s Testing?']; + $config = new Config(['locales' => $locales, 'default_locale' => $defaultLocale]); + $app = $this->getApp(['make', 'instance', 'get']); - /** @var Config|MockObject $config */ - $config = $this->createMock(Config::class); /** @var Session|MockObject $session */ $session = $this->createMock(Session::class); /** @var Translator|MockObject $translator */ @@ -27,31 +30,14 @@ class TranslationServiceProviderTest extends ServiceProviderTest /** @var TranslationServiceProvider|MockObject $serviceProvider */ $serviceProvider = $this->getMockBuilder(TranslationServiceProvider::class) ->setConstructorArgs([$app]) - ->setMethods(['initGettext', 'setLocale']) + ->setMethods(['setLocale']) ->getMock(); - $serviceProvider->expects($this->once()) - ->method('initGettext'); - $app->expects($this->exactly(2)) ->method('get') ->withConsecutive(['config'], ['session']) ->willReturnOnConsecutiveCalls($config, $session); - $defaultLocale = 'fo_OO'; - $locale = 'te_ST.WTF-9'; - $locales = ['fo_OO' => 'Foo', 'fo_OO.BAR' => 'Foo (Bar)', 'te_ST.WTF-9' => 'WTF\'s Testing?']; - $config->expects($this->exactly(2)) - ->method('get') - ->withConsecutive( - ['locales'], - ['default_locale'] - ) - ->willReturnOnConsecutiveCalls( - $locales, - $defaultLocale - ); - $session->expects($this->once()) ->method('get') ->with('locale', $defaultLocale) @@ -65,9 +51,11 @@ class TranslationServiceProviderTest extends ServiceProviderTest ->with( Translator::class, [ - 'locale' => $locale, - 'locales' => $locales, - 'localeChangeCallback' => [$serviceProvider, 'setLocale'], + 'locale' => $locale, + 'locales' => $locales, + 'fallbackLocale' => 'en_US', + 'getTranslatorCallback' => [$serviceProvider, 'getTranslator'], + 'localeChangeCallback' => [$serviceProvider, 'setLocale'], ] ) ->willReturn($translator); @@ -81,4 +69,22 @@ class TranslationServiceProviderTest extends ServiceProviderTest $serviceProvider->register(); } + + /** + * @covers \Engelsystem\Helpers\Translation\TranslationServiceProvider::getTranslator() + */ + public function testGetTranslator(): void + { + $app = $this->getApp(['get']); + $serviceProvider = new TranslationServiceProvider($app); + + $this->setExpects($app, 'get', ['path.lang'], __DIR__ . '/Assets'); + + // Get translator + $translator = $serviceProvider->getTranslator('fo_OO'); + $this->assertEquals('Foo Bar!', $translator->gettext('foo.bar')); + + // Retry from cache + $serviceProvider->getTranslator('fo_OO'); + } } diff --git a/tests/Unit/Helpers/Translation/TranslatorTest.php b/tests/Unit/Helpers/Translation/TranslatorTest.php index 7e9c534c..c173209a 100644 --- a/tests/Unit/Helpers/Translation/TranslatorTest.php +++ b/tests/Unit/Helpers/Translation/TranslatorTest.php @@ -2,6 +2,8 @@ namespace Engelsystem\Test\Unit\Helpers\Translation; +use Engelsystem\Helpers\Translation\GettextTranslator; +use Engelsystem\Helpers\Translation\TranslationNotFound; use Engelsystem\Helpers\Translation\Translator; use Engelsystem\Test\Unit\ServiceProviderTest; use PHPUnit\Framework\MockObject\MockObject; @@ -19,18 +21,18 @@ class TranslatorTest extends ServiceProviderTest */ public function testInit() { - $locales = ['te_ST.ER-01' => 'Tests', 'fo_OO' => 'SomeFOO']; - $locale = 'te_ST.ER-01'; + $locales = ['te_ST' => 'Tests', 'fo_OO' => 'SomeFOO']; + $locale = 'te_ST'; - /** @var callable|MockObject $callable */ - $callable = $this->getMockBuilder(stdClass::class) + /** @var callable|MockObject $localeChange */ + $localeChange = $this->getMockBuilder(stdClass::class) ->setMethods(['__invoke']) ->getMock(); - $callable->expects($this->exactly(2)) + $localeChange->expects($this->exactly(2)) ->method('__invoke') - ->withConsecutive(['te_ST.ER-01'], ['fo_OO']); + ->withConsecutive(['te_ST'], ['fo_OO']); - $translator = new Translator($locale, $locales, $callable); + $translator = new Translator($locale, 'fo_OO', function () { }, $locales, $localeChange); $this->assertEquals($locales, $translator->getLocales()); $this->assertEquals($locale, $translator->getLocale()); @@ -43,24 +45,23 @@ class TranslatorTest extends ServiceProviderTest $this->assertEquals($newLocales, $translator->getLocales()); $this->assertTrue($translator->hasLocale('ip_SU-M')); - $this->assertFalse($translator->hasLocale('te_ST.ER-01')); + $this->assertFalse($translator->hasLocale('te_ST')); } /** - * @covers \Engelsystem\Helpers\Translation\Translator::replaceText * @covers \Engelsystem\Helpers\Translation\Translator::translate */ public function testTranslate() { /** @var Translator|MockObject $translator */ $translator = $this->getMockBuilder(Translator::class) - ->setConstructorArgs(['de_DE.UTF-8', ['de_DE.UTF-8' => 'Deutsch']]) - ->setMethods(['translateGettext']) + ->setConstructorArgs(['de_DE', 'en_US', function () { }, ['de_DE' => 'Deutsch']]) + ->setMethods(['translateText']) ->getMock(); $translator->expects($this->exactly(2)) - ->method('translateGettext') - ->withConsecutive(['Hello!'], ['My favourite number is %u!']) - ->willReturnOnConsecutiveCalls('Hallo!', 'Meine Lieblingszahl ist die %u!'); + ->method('translateText') + ->withConsecutive(['gettext', ['Hello!'], []], ['gettext', ['My favourite number is %u!'], [3]]) + ->willReturnOnConsecutiveCalls('Hallo!', 'Meine Lieblingszahl ist die 3!'); $return = $translator->translate('Hello!'); $this->assertEquals('Hallo!', $return); @@ -76,15 +77,58 @@ class TranslatorTest extends ServiceProviderTest { /** @var Translator|MockObject $translator */ $translator = $this->getMockBuilder(Translator::class) - ->setConstructorArgs(['de_DE.UTF-8', ['de_DE.UTF-8' => 'Deutsch']]) - ->setMethods(['translateGettextPlural']) + ->setConstructorArgs(['de_DE', 'en_US', function () { }, ['de_DE' => 'Deutsch']]) + ->setMethods(['translateText']) ->getMock(); $translator->expects($this->once()) - ->method('translateGettextPlural') - ->with('%s apple', '%s apples', 2) + ->method('translateText') + ->with('ngettext', ['%s apple', '%s apples', 2], [2]) ->willReturn('2 Äpfel'); $return = $translator->translatePlural('%s apple', '%s apples', 2, [2]); $this->assertEquals('2 Äpfel', $return); } + + /** + * @covers \Engelsystem\Helpers\Translation\Translator::translatePlural + * @covers \Engelsystem\Helpers\Translation\Translator::translateText + * @covers \Engelsystem\Helpers\Translation\Translator::replaceText + */ + public function testReplaceText() + { + /** @var GettextTranslator|MockObject $gtt */ + $gtt = $this->createMock(GettextTranslator::class); + /** @var callable|MockObject $getTranslator */ + $getTranslator = $this->getMockBuilder(stdClass::class) + ->setMethods(['__invoke']) + ->getMock(); + $getTranslator->expects($this->exactly(5)) + ->method('__invoke') + ->withConsecutive(['te_ST'], ['fo_OO'], ['te_ST'], ['fo_OO'], ['te_ST']) + ->willReturn($gtt); + + $i = 0; + $gtt->expects($this->exactly(4)) + ->method('gettext') + ->willReturnCallback(function () use (&$i) { + $i++; + if ($i != 4) { + throw new TranslationNotFound(); + } + + return 'Lorem %s???'; + }); + $this->setExpects($gtt, 'ngettext', ['foo.barf'], 'Lorem %s!'); + + $translator = new Translator('te_ST', 'fo_OO', $getTranslator, ['te_ST' => 'Test', 'fo_OO' => 'Foo']); + + // No translation + $this->assertEquals('foo.bar', $translator->translate('foo.bar')); + + // Fallback translation + $this->assertEquals('Lorem test2???', $translator->translate('foo.batz', ['test2'])); + + // Successful translation + $this->assertEquals('Lorem test3!', $translator->translatePlural('foo.barf', 'foo.bar2', 3, ['test3'])); + } } -- cgit v1.2.3 From 7414f9b23dbcc66e5f0efda3d0cbfd79372ec780 Mon Sep 17 00:00:00 2001 From: Igor Scheller Date: Tue, 9 Jul 2019 21:43:18 +0200 Subject: Implemented Validation for controllers --- config/app.php | 1 + src/Controllers/BaseController.php | 4 + src/Http/Exceptions/ValidationException.php | 37 +++ src/Http/Validation/Validates.php | 154 +++++++++++ src/Http/Validation/ValidatesRequest.php | 37 +++ src/Http/Validation/ValidationServiceProvider.php | 28 ++ src/Http/Validation/Validator.php | 76 +++++ src/Middleware/ErrorHandler.php | 30 ++ tests/Unit/Controllers/BaseControllerTest.php | 2 + .../Http/Exceptions/ValidationExceptionTest.php | 25 ++ .../Stub/ValidatesRequestImplementation.php | 27 ++ .../Unit/Http/Validation/ValidatesRequestTest.php | 46 +++ tests/Unit/Http/Validation/ValidatesTest.php | 308 +++++++++++++++++++++ .../Validation/ValidationServiceProviderTest.php | 34 +++ tests/Unit/Http/Validation/ValidatorTest.php | 50 ++++ tests/Unit/Middleware/ErrorHandlerTest.php | 70 ++++- 16 files changed, 927 insertions(+), 2 deletions(-) create mode 100644 src/Http/Exceptions/ValidationException.php create mode 100644 src/Http/Validation/Validates.php create mode 100644 src/Http/Validation/ValidatesRequest.php create mode 100644 src/Http/Validation/ValidationServiceProvider.php create mode 100644 src/Http/Validation/Validator.php create mode 100644 tests/Unit/Http/Exceptions/ValidationExceptionTest.php create mode 100644 tests/Unit/Http/Validation/Stub/ValidatesRequestImplementation.php create mode 100644 tests/Unit/Http/Validation/ValidatesRequestTest.php create mode 100644 tests/Unit/Http/Validation/ValidatesTest.php create mode 100644 tests/Unit/Http/Validation/ValidationServiceProviderTest.php create mode 100644 tests/Unit/Http/Validation/ValidatorTest.php diff --git a/config/app.php b/config/app.php index 5fda67dd..c4503086 100644 --- a/config/app.php +++ b/config/app.php @@ -25,6 +25,7 @@ return [ \Engelsystem\Middleware\RouteDispatcherServiceProvider::class, \Engelsystem\Middleware\RequestHandlerServiceProvider::class, \Engelsystem\Middleware\SessionHandlerServiceProvider::class, + \Engelsystem\Http\Validation\ValidationServiceProvider::class, // Additional services \Engelsystem\Mail\MailerServiceProvider::class, diff --git a/src/Controllers/BaseController.php b/src/Controllers/BaseController.php index cbc00931..655ed759 100644 --- a/src/Controllers/BaseController.php +++ b/src/Controllers/BaseController.php @@ -2,8 +2,12 @@ namespace Engelsystem\Controllers; +use Engelsystem\Http\Validation\ValidatesRequest; + abstract class BaseController { + use ValidatesRequest; + /** @var string[]|string[][] A list of Permissions required to access the controller or certain pages */ protected $permissions = []; diff --git a/src/Http/Exceptions/ValidationException.php b/src/Http/Exceptions/ValidationException.php new file mode 100644 index 00000000..e48fb0c3 --- /dev/null +++ b/src/Http/Exceptions/ValidationException.php @@ -0,0 +1,37 @@ +validator = $validator; + parent::__construct($message, $code, $previous); + } + + /** + * @return Validator + */ + public function getValidator(): Validator + { + return $this->validator; + } +} diff --git a/src/Http/Validation/Validates.php b/src/Http/Validation/Validates.php new file mode 100644 index 00000000..2e3a1a73 --- /dev/null +++ b/src/Http/Validation/Validates.php @@ -0,0 +1,154 @@ +validateParameterCount(2, $parameters, __FUNCTION__); + $size = $this->getSize($value); + + return $size >= $parameters[0] && $size <= $parameters[1]; + } + + /** + * @param mixed $value + * @return bool + */ + public function bool($value): bool + { + return in_array($value, ['1', 1, true, '0', 0, false], true); + } + + /** + * @param mixed $value + * @param array $parameters ['1,2,3,56,7'] + * @return bool + */ + public function in($value, $parameters): bool + { + $this->validateParameterCount(1, $parameters, __FUNCTION__); + + return in_array($value, explode(',', $parameters[0])); + } + + /** + * @param mixed $value + * @return bool + */ + public function int($value): bool + { + return filter_var($value, FILTER_VALIDATE_INT) !== false; + } + + /** + * @param string $value + * @param array $parameters ['max'] + * @return bool + */ + public function max($value, $parameters): bool + { + $this->validateParameterCount(1, $parameters, __FUNCTION__); + $size = $this->getSize($value); + + return $size <= $parameters[0]; + } + + /** + * @param string $value + * @param array $parameters ['min'] + * @return bool + */ + public function min($value, $parameters) + { + $this->validateParameterCount(1, $parameters, __FUNCTION__); + $size = $this->getSize($value); + + return $size >= $parameters[0]; + } + + /** + * @param mixed $value + * @param array $parameters ['1,2,3,56,7'] + * @return bool + */ + public function notIn($value, $parameters): bool + { + $this->validateParameterCount(1, $parameters, __FUNCTION__); + + return !$this->in($value, $parameters); + } + + /** + * @param mixed $value + * @return bool + */ + public function numeric($value): bool + { + return is_numeric($value); + } + + /** + * @param mixed $value + * @return bool + */ + public function required($value): bool + { + if ( + is_null($value) + || (is_string($value) && trim($value) === '') + ) { + return false; + } + + return true; + } + + /** + * @param mixed $value + * @return int|float + */ + protected function getSize($value) + { + if (is_numeric($value)) { + return $value; + } + + return mb_strlen($value); + } + + /** + * @param int $count + * @param array $parameters + * @param string $rule + * + * @throws InvalidArgumentException + */ + protected function validateParameterCount(int $count, array $parameters, string $rule) + { + if (count($parameters) < $count) { + throw new InvalidArgumentException(sprintf( + 'The rule "%s" requires at least %d parameters', + $rule, + $count + )); + } + } +} diff --git a/src/Http/Validation/ValidatesRequest.php b/src/Http/Validation/ValidatesRequest.php new file mode 100644 index 00000000..33ff76af --- /dev/null +++ b/src/Http/Validation/ValidatesRequest.php @@ -0,0 +1,37 @@ +validator->validate( + (array)$request->getParsedBody(), + $rules + )) { + throw new ValidationException($this->validator); + } + + return $this->validator->getData(); + } + + /** + * @param Validator $validator + */ + public function setValidator(Validator $validator) + { + $this->validator = $validator; + } +} diff --git a/src/Http/Validation/ValidationServiceProvider.php b/src/Http/Validation/ValidationServiceProvider.php new file mode 100644 index 00000000..2f1c6359 --- /dev/null +++ b/src/Http/Validation/ValidationServiceProvider.php @@ -0,0 +1,28 @@ +app->make(Validates::class); + $this->app->instance(Validates::class, $validates); + + $validator = $this->app->make(Validator::class); + $this->app->instance(Validator::class, $validator); + $this->app->instance('validator', $validator); + + $this->app->afterResolving(function ($object, Application $app) { + if (!$object instanceof BaseController) { + return; + } + + $object->setValidator($app->get(Validator::class)); + }); + } +} diff --git a/src/Http/Validation/Validator.php b/src/Http/Validation/Validator.php new file mode 100644 index 00000000..a9235a5f --- /dev/null +++ b/src/Http/Validation/Validator.php @@ -0,0 +1,76 @@ +validate = $validate; + } + + /** + * @param array $data + * @param array $rules + * @return bool + */ + public function validate($data, $rules) + { + $this->errors = []; + $this->data = []; + + foreach ($rules as $key => $values) { + foreach (explode('|', $values) as $parameters) { + $parameters = explode(':', $parameters); + $rule = array_shift($parameters); + $rule = Str::camel($rule); + + if (!method_exists($this->validate, $rule)) { + throw new InvalidArgumentException('Unknown validation rule: ' . $rule); + } + + $value = isset($data[$key]) ? $data[$key] : null; + if (!$this->validate->{$rule}($value, $parameters, $data)) { + $this->errors[$key][] = implode('.', ['validation', $key, $rule]); + + continue; + } + + $this->data[$key] = $value; + } + } + + return empty($this->errors); + } + + /** + * @return array + */ + public function getData(): array + { + return $this->data; + } + + /** + * @return string[] + */ + public function getErrors(): array + { + return $this->errors; + } +} diff --git a/src/Middleware/ErrorHandler.php b/src/Middleware/ErrorHandler.php index 29b1fac1..c89edb1a 100644 --- a/src/Middleware/ErrorHandler.php +++ b/src/Middleware/ErrorHandler.php @@ -3,6 +3,8 @@ namespace Engelsystem\Middleware; use Engelsystem\Http\Exceptions\HttpException; +use Engelsystem\Http\Exceptions\ValidationException; +use Engelsystem\Http\Request; use Engelsystem\Http\Response; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -43,6 +45,21 @@ class ErrorHandler implements MiddlewareInterface $response = $handler->handle($request); } catch (HttpException $e) { $response = $this->createResponse($e->getMessage(), $e->getStatusCode(), $e->getHeaders()); + } catch (ValidationException $e) { + $response = $this->createResponse('', 302, ['Location' => $this->getPreviousUrl($request)]); + + if ($request instanceof Request) { + $session = $request->getSession(); + $session->set( + 'errors', + array_merge_recursive( + $session->get('errors', []), + ['validation' => $e->getValidator()->getErrors()] + ) + ); + + $session->set('form-data', $request->request->all()); + } } $statusCode = $response->getStatusCode(); @@ -106,4 +123,17 @@ class ErrorHandler implements MiddlewareInterface { return response($content, $status, $headers); } + + /** + * @param ServerRequestInterface $request + * @return string + */ + protected function getPreviousUrl(ServerRequestInterface $request) + { + if ($header = $request->getHeader('referer')) { + return array_pop($header); + } + + return '/'; + } } diff --git a/tests/Unit/Controllers/BaseControllerTest.php b/tests/Unit/Controllers/BaseControllerTest.php index 738b538f..2adc9dc7 100644 --- a/tests/Unit/Controllers/BaseControllerTest.php +++ b/tests/Unit/Controllers/BaseControllerTest.php @@ -21,5 +21,7 @@ class BaseControllerTest extends TestCase 'dolor', ], ], $controller->getPermissions()); + + $this->assertTrue(method_exists($controller, 'setValidator')); } } diff --git a/tests/Unit/Http/Exceptions/ValidationExceptionTest.php b/tests/Unit/Http/Exceptions/ValidationExceptionTest.php new file mode 100644 index 00000000..c5a38b5a --- /dev/null +++ b/tests/Unit/Http/Exceptions/ValidationExceptionTest.php @@ -0,0 +1,25 @@ +createMock(Validator::class); + + $exception = new ValidationException($validator); + + $this->assertEquals($validator, $exception->getValidator()); + } +} diff --git a/tests/Unit/Http/Validation/Stub/ValidatesRequestImplementation.php b/tests/Unit/Http/Validation/Stub/ValidatesRequestImplementation.php new file mode 100644 index 00000000..772b1dc9 --- /dev/null +++ b/tests/Unit/Http/Validation/Stub/ValidatesRequestImplementation.php @@ -0,0 +1,27 @@ +validate($request, $rules); + } + + /** + * @return bool + */ + public function hasValidator() + { + return !is_null($this->validator); + } +} diff --git a/tests/Unit/Http/Validation/ValidatesRequestTest.php b/tests/Unit/Http/Validation/ValidatesRequestTest.php new file mode 100644 index 00000000..8011bd03 --- /dev/null +++ b/tests/Unit/Http/Validation/ValidatesRequestTest.php @@ -0,0 +1,46 @@ +createMock(Validator::class); + $validator->expects($this->exactly(2)) + ->method('validate') + ->withConsecutive( + [['foo' => 'bar'], ['foo' => 'required']], + [[], ['foo' => 'required']] + ) + ->willReturnOnConsecutiveCalls( + true, + false + ); + $validator->expects($this->once()) + ->method('getData') + ->willReturn(['foo' => 'bar']); + + $implementation = new ValidatesRequestImplementation(); + $implementation->setValidator($validator); + + $return = $implementation->validateData(new Request([], ['foo' => 'bar']), ['foo' => 'required']); + + $this->assertEquals(['foo' => 'bar'], $return); + + $this->expectException(ValidationException::class); + $implementation->validateData(new Request([], []), ['foo' => 'required']); + } +} diff --git a/tests/Unit/Http/Validation/ValidatesTest.php b/tests/Unit/Http/Validation/ValidatesTest.php new file mode 100644 index 00000000..5cf0447a --- /dev/null +++ b/tests/Unit/Http/Validation/ValidatesTest.php @@ -0,0 +1,308 @@ +assertTrue($val->accepted($value) === $result); + } + + /** + * @return array + */ + public function provideBetween() + { + return [ + ['42', [10, 100]], + [42.5, [42, 43]], + [42, [42, 1000]], + [1337, [0, 99], false], + [-17, [32, 45], false], + ]; + } + + /** + * @covers \Engelsystem\Http\Validation\Validates::between + * @param mixed $value + * @param array $parameters + * @param bool $result + * @dataProvider provideBetween + */ + public function testBetween($value, array $parameters, bool $result = true) + { + $val = new Validates; + $this->assertTrue($val->between($value, $parameters) === $result); + } + + /** + * @return array + */ + public function provideBool() + { + return [ + ['1'], + [1], + [true], + ['0'], + [0], + [false], + ['true', false], + ['false', false], + ['yes', false], + ['no', false], + ['bool', false], + ]; + } + + /** + * @covers \Engelsystem\Http\Validation\Validates::bool + * @param mixed $value + * @param bool $result + * @dataProvider provideBool + */ + public function testBool($value, bool $result = true) + { + $val = new Validates; + $this->assertTrue($val->bool($value) === $result); + } + + /** + * @return array + */ + public function provideIn() + { + return [ + ['lorem', ['lorem,ipsum,dolor']], + [99, ['66,77,88,99,111']], + [4, ['1,3,5,7'], false], + ['toggle', ['on,off'], false], + ]; + } + + /** + * @covers \Engelsystem\Http\Validation\Validates::in + * @param mixed $value + * @param array $parameters + * @param bool $result + * @dataProvider provideIn + */ + public function testIn($value, array $parameters, bool $result = true) + { + $val = new Validates; + $this->assertTrue($val->in($value, $parameters) === $result); + } + + /** + * @return array + */ + public function provideInt() + { + return [ + ['1337'], + [42], + ['0'], + [false, false], + ['12asd1', false], + ['one', false], + ]; + } + + /** + * @covers \Engelsystem\Http\Validation\Validates::int + * @param mixed $value + * @param bool $result + * @dataProvider provideInt + */ + public function testInt($value, bool $result = true) + { + $val = new Validates; + $this->assertTrue($val->int($value) === $result); + } + + /** + * @return array + */ + public function provideMax() + { + return [ + ['99', [100]], + [-42, [1024]], + [99, [99]], + [100, [10], false], + ]; + } + + /** + * @covers \Engelsystem\Http\Validation\Validates::max + * @param mixed $value + * @param array $parameters + * @param bool $result + * @dataProvider provideMax + */ + public function testMax($value, array $parameters, bool $result = true) + { + $val = new Validates; + $this->assertTrue($val->max($value, $parameters) === $result); + } + + /** + * @return array + */ + public function provideMin() + { + return [ + [32, [0]], + [7, [7]], + ['99', [10]], + [3, [42], false], + ]; + } + + /** + * @covers \Engelsystem\Http\Validation\Validates::min + * @param mixed $value + * @param array $parameters + * @param bool $result + * @dataProvider provideMin + */ + public function testMin($value, array $parameters, bool $result = true) + { + $val = new Validates; + $this->assertTrue($val->min($value, $parameters) === $result); + } + + /** + * @return array + */ + public function provideNotIn() + { + return [ + [77, ['50,60,70']], + ['test', ['coding,deployment']], + ['PHP', ['Java,PHP,bash'], false], + ]; + } + + /** + * @covers \Engelsystem\Http\Validation\Validates::notIn + * @param mixed $value + * @param array $parameters + * @param bool $result + * @dataProvider provideNotIn + */ + public function testNotIn($value, array $parameters, bool $result = true) + { + $val = new Validates; + $this->assertTrue($val->notIn($value, $parameters) === $result); + } + + /** + * @return array + */ + public function provideNumeric() + { + return [ + [77], + ['42'], + ['1337e0'], + ['123f00', false], + [null, false], + ]; + } + + /** + * @covers \Engelsystem\Http\Validation\Validates::numeric + * @param mixed $value + * @param bool $result + * @dataProvider provideNumeric + */ + public function testNumeric($value, bool $result = true) + { + $val = new Validates; + $this->assertTrue($val->numeric($value) === $result); + } + + /** + * @return array + */ + public function provideRequired() + { + return [ + ['Lorem ipsum'], + ['1234'], + [1234], + ['0'], + [0], + ['', false], + [' ', false], + [null, false], + ]; + } + + /** + * @covers \Engelsystem\Http\Validation\Validates::required + * @param mixed $value + * @param bool $result + * @dataProvider provideRequired + */ + public function testRequired($value, bool $result = true) + { + $val = new Validates; + $this->assertTrue($val->required($value) === $result); + } + + /** + * @covers \Engelsystem\Http\Validation\Validates::getSize + */ + public function testGetSize() + { + $val = new Validates; + $this->assertTrue($val->max(42, [999])); + $this->assertTrue($val->max('99', [100])); + $this->assertFalse($val->max('101', [100])); + $this->assertTrue($val->max('lorem', [5])); + $this->assertFalse($val->max('Lorem Ipsum', [5])); + } + + /** + * @covers \Engelsystem\Http\Validation\Validates::validateParameterCount + */ + public function testValidateParameterCount() + { + $val = new Validates; + $this->assertTrue($val->between(42, [1, 100])); + + $this->expectException(InvalidArgumentException::class); + $val->between(42, [1]); + } +} diff --git a/tests/Unit/Http/Validation/ValidationServiceProviderTest.php b/tests/Unit/Http/Validation/ValidationServiceProviderTest.php new file mode 100644 index 00000000..969f4351 --- /dev/null +++ b/tests/Unit/Http/Validation/ValidationServiceProviderTest.php @@ -0,0 +1,34 @@ +register(); + + $this->assertTrue($app->has(Validator::class)); + $this->assertTrue($app->has('validator')); + + /** @var ValidatesRequestImplementation $validatesRequest */ + $validatesRequest = $app->make(ValidatesRequestImplementation::class); + $this->assertTrue($validatesRequest->hasValidator()); + + // Test afterResolving early return + $app->make(stdClass::class); + } +} diff --git a/tests/Unit/Http/Validation/ValidatorTest.php b/tests/Unit/Http/Validation/ValidatorTest.php new file mode 100644 index 00000000..799265ec --- /dev/null +++ b/tests/Unit/Http/Validation/ValidatorTest.php @@ -0,0 +1,50 @@ +assertTrue($val->validate( + ['foo' => 'bar', 'lorem' => 'on'], + ['foo' => 'required|not_in:lorem,ipsum,dolor', 'lorem' => 'accepted'] + )); + $this->assertEquals(['foo' => 'bar', 'lorem' => 'on'], $val->getData()); + + $this->assertFalse($val->validate( + [], + ['lorem' => 'required|min:3'] + )); + $this->assertEquals( + ['lorem' => ['validation.lorem.required', 'validation.lorem.min']], + $val->getErrors() + ); + } + + /** + * @covers \Engelsystem\Http\Validation\Validator::validate + */ + public function testValidateNotImplemented() + { + $val = new Validator(new Validates); + $this->expectException(InvalidArgumentException::class); + + $val->validate( + ['lorem' => 'bar'], + ['foo' => 'never_implemented'] + ); + } +} diff --git a/tests/Unit/Middleware/ErrorHandlerTest.php b/tests/Unit/Middleware/ErrorHandlerTest.php index 6c37b651..ea9cb216 100644 --- a/tests/Unit/Middleware/ErrorHandlerTest.php +++ b/tests/Unit/Middleware/ErrorHandlerTest.php @@ -2,14 +2,23 @@ namespace Engelsystem\Test\Unit\Middleware; +use Engelsystem\Application; use Engelsystem\Http\Exceptions\HttpException; +use Engelsystem\Http\Exceptions\ValidationException; +use Engelsystem\Http\Psr7ServiceProvider; +use Engelsystem\Http\Request; use Engelsystem\Http\Response; +use Engelsystem\Http\ResponseServiceProvider; +use Engelsystem\Http\Validation\Validator; use Engelsystem\Middleware\ErrorHandler; use Engelsystem\Test\Unit\Middleware\Stub\ReturnResponseMiddlewareHandler; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Server\RequestHandlerInterface; +use Symfony\Component\HttpFoundation\Session\Session; +use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage; use Twig_LoaderInterface as TwigLoader; class ErrorHandlerTest extends TestCase @@ -104,7 +113,7 @@ class ErrorHandlerTest extends TestCase /** * @covers \Engelsystem\Middleware\ErrorHandler::process */ - public function testProcessException() + public function testProcessHttpException() { /** @var ServerRequestInterface|MockObject $request */ $request = $this->createMock(ServerRequestInterface::class); @@ -144,6 +153,63 @@ class ErrorHandlerTest extends TestCase $this->assertEquals($psrResponse, $return); } + /** + * @covers \Engelsystem\Middleware\ErrorHandler::process + * @covers \Engelsystem\Middleware\ErrorHandler::getPreviousUrl + */ + public function testProcessValidationException() + { + /** @var TwigLoader|MockObject $twigLoader */ + $twigLoader = $this->createMock(TwigLoader::class); + $handler = $this->getMockForAbstractClass(RequestHandlerInterface::class); + $validator = $this->createMock(Validator::class); + + $handler->expects($this->exactly(2)) + ->method('handle') + ->willReturnCallback(function () use ($validator) { + throw new ValidationException($validator); + }); + + $validator->expects($this->exactly(2)) + ->method('getErrors') + ->willReturn(['foo' => ['validation.foo.numeric']]); + + $session = new Session(new MockArraySessionStorage()); + $session->set('errors', ['validation' => ['foo' => ['validation.foo.required']]]); + $request = Request::create('/foo/bar', 'POST', ['foo' => 'bar']); + $request->setSession($session); + + /** @var Application $app */ + $app = app(); + (new ResponseServiceProvider($app))->register(); + (new Psr7ServiceProvider($app))->register(); + + $errorHandler = new ErrorHandler($twigLoader); + + $return = $errorHandler->process($request, $handler); + + $this->assertEquals(302, $return->getStatusCode()); + $this->assertEquals('/', $return->getHeaderLine('location')); + $this->assertEquals([ + 'errors' => [ + 'validation' => [ + 'foo' => [ + 'validation.foo.required', + 'validation.foo.numeric', + ], + ], + ], + 'form-data' => [ + 'foo' => 'bar', + ], + ], $session->all()); + + $request = $request->withAddedHeader('referer', '/foo/batz'); + $return = $errorHandler->process($request, $handler); + + $this->assertEquals('/foo/batz', $return->getHeaderLine('location')); + } + /** * @covers \Engelsystem\Middleware\ErrorHandler::process */ @@ -153,7 +219,7 @@ class ErrorHandlerTest extends TestCase $request = $this->createMock(ServerRequestInterface::class); /** @var TwigLoader|MockObject $twigLoader */ $twigLoader = $this->createMock(TwigLoader::class); - $response = new Response('

Hi!

', 500); + $response = new Response('

Hi!

', 500); $returnResponseHandler = new ReturnResponseMiddlewareHandler($response); /** @var ErrorHandler|MockObject $errorHandler */ -- cgit v1.2.3 From 6d5ada252202bfb29eba884cf9567e969d798607 Mon Sep 17 00:00:00 2001 From: Igor Scheller Date: Tue, 9 Jul 2019 22:02:07 +0200 Subject: Added validation to AuthController --- resources/lang/de_DE/default.mo | Bin 46271 -> 46206 bytes resources/lang/de_DE/default.po | 18 +++++--- resources/lang/en_US/default.mo | Bin 745 -> 770 bytes resources/lang/en_US/default.po | 16 ++++--- src/Controllers/AuthController.php | 62 ++++++++++++-------------- tests/Unit/Controllers/AuthControllerTest.php | 61 +++++++++++++++---------- 6 files changed, 88 insertions(+), 69 deletions(-) diff --git a/resources/lang/de_DE/default.mo b/resources/lang/de_DE/default.mo index 35ad80b7..fb93d590 100644 Binary files a/resources/lang/de_DE/default.mo and b/resources/lang/de_DE/default.mo differ diff --git a/resources/lang/de_DE/default.po b/resources/lang/de_DE/default.po index cd696610..1f0372af 100644 --- a/resources/lang/de_DE/default.po +++ b/resources/lang/de_DE/default.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Engelsystem\n" "POT-Creation-Date: 2019-04-28 15:23+0200\n" -"PO-Revision-Date: 2019-06-12 16:07+0200\n" +"PO-Revision-Date: 2019-06-13 11:54+0200\n" "Last-Translator: msquare \n" "Language-Team: \n" "Language: de_DE\n" @@ -1529,9 +1529,8 @@ msgstr "Nachname" msgid "Entry required!" msgstr "Pflichtfeld!" -#: includes/pages/guest_login.php:414 -msgid "auth.no-password" -msgstr "Gib bitte ein Passwort ein." +#~ msgid "auth.no-password" +#~ msgstr "Gib bitte ein Passwort ein." #: includes/pages/guest_login.php:418 msgid "auth.not-found" @@ -1539,9 +1538,8 @@ msgstr "" "Es wurde kein Engel gefunden. Probiere es bitte noch einmal. Wenn das Problem " "weiterhin besteht, melde dich im Himmel." -#: includes/pages/guest_login.php:451 includes/view/User_view.php:130 -msgid "auth.no-nickname" -msgstr "Gib bitte einen Nick an." +#~ msgid "auth.no-nickname" +#~ msgstr "Gib bitte einen Nick an." #: includes/pages/guest_login.php:481 #: includes/view/User_view.php:122 @@ -2765,3 +2763,9 @@ msgid "" msgstr "" "Diese Seite existiert nicht oder Du hast keinen Zugriff. Melde Dich an um " "Zugriff zu erhalten!" + +msgid "validation.password.required" +msgstr "Bitte gib ein Passwort an." + +msgid "validation.login.required" +msgstr "Bitte gib einen Loginnamen an." diff --git a/resources/lang/en_US/default.mo b/resources/lang/en_US/default.mo index e95ae703..7ef9c3b2 100644 Binary files a/resources/lang/en_US/default.mo and b/resources/lang/en_US/default.mo differ diff --git a/resources/lang/en_US/default.po b/resources/lang/en_US/default.po index 22566e52..54847e61 100644 --- a/resources/lang/en_US/default.po +++ b/resources/lang/en_US/default.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Engelsystem 2.0\n" "POT-Creation-Date: 2017-12-29 19:01+0100\n" -"PO-Revision-Date: 2018-11-27 00:28+0100\n" +"PO-Revision-Date: 2019-06-04 23:41+0200\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -16,11 +16,17 @@ msgstr "" "Language: en_US\n" "X-Poedit-SearchPath-0: .\n" -msgid "auth.no-nickname" -msgstr "Please enter a nickname." +#~ msgid "auth.no-nickname" +#~ msgstr "Please enter a nickname." -msgid "auth.no-password" -msgstr "Please enter a password." +#~ msgid "auth.no-password" +#~ msgstr "Please enter a password." msgid "auth.not-found" msgstr "No user was found. Please try again. If you are still having problems, ask Heaven." + +msgid "validation.password.required" +msgstr "The password is required." + +msgid "validation.login.required" +msgstr "The login name is required." diff --git a/src/Controllers/AuthController.php b/src/Controllers/AuthController.php index e5fc40e3..a8cc1ace 100644 --- a/src/Controllers/AuthController.php +++ b/src/Controllers/AuthController.php @@ -8,6 +8,8 @@ use Engelsystem\Http\Request; use Engelsystem\Http\Response; use Engelsystem\Http\UrlGeneratorInterface; use Engelsystem\Models\User\User; +use Illuminate\Support\Arr; +use Illuminate\Support\Collection; use Symfony\Component\HttpFoundation\Session\SessionInterface; class AuthController extends BaseController @@ -53,7 +55,22 @@ class AuthController extends BaseController */ public function login() { - return $this->response->withView('pages/login'); + return $this->showLogin(); + } + + /** + * @param bool $showRecovery + * @return Response + */ + protected function showLogin($showRecovery = false) + { + $errors = Collection::make(Arr::flatten($this->session->get('errors', []))); + $this->session->remove('errors'); + + return $this->response->withView( + 'pages/login', + ['errors' => $errors, 'show_password_recovery' => $showRecovery] + ); } /** @@ -64,15 +81,18 @@ class AuthController extends BaseController */ public function postLogin(Request $request): Response { - $return = $this->authenticateUser($request->get('login', ''), $request->get('password', '')); - if (!$return instanceof User) { - return $this->response->withView( - 'pages/login', - ['errors' => [$return], 'show_password_recovery' => true] - ); - } + $data = $this->validate($request, [ + 'login' => 'required', + 'password' => 'required', + ]); + + $user = $this->auth->authenticate($data['login'], $data['password']); - $user = $return; + if (!$user instanceof User) { + $this->session->set('errors', $this->session->get('errors', []) + ['auth.not-found']); + + return $this->showLogin(true); + } $this->session->invalidate(); $this->session->set('user_id', $user->id); @@ -93,28 +113,4 @@ class AuthController extends BaseController return $this->response->redirectTo($this->url->to('/')); } - - /** - * Verify the user and password - * - * @param $login - * @param $password - * @return User|string - */ - protected function authenticateUser(string $login, string $password) - { - if (!$login) { - return 'auth.no-nickname'; - } - - if (!$password) { - return 'auth.no-password'; - } - - if (!$user = $this->auth->authenticate($login, $password)) { - return 'auth.not-found'; - } - - return $user; - } } diff --git a/tests/Unit/Controllers/AuthControllerTest.php b/tests/Unit/Controllers/AuthControllerTest.php index 0fad3b6d..d3dbfa4b 100644 --- a/tests/Unit/Controllers/AuthControllerTest.php +++ b/tests/Unit/Controllers/AuthControllerTest.php @@ -4,15 +4,21 @@ namespace Engelsystem\Test\Unit\Controllers; use Engelsystem\Controllers\AuthController; use Engelsystem\Helpers\Authenticator; +use Engelsystem\Http\Exceptions\ValidationException; use Engelsystem\Http\Request; use Engelsystem\Http\Response; use Engelsystem\Http\UrlGeneratorInterface; +use Engelsystem\Http\Validation\Validates; +use Engelsystem\Http\Validation\Validator; use Engelsystem\Models\User\Settings; use Engelsystem\Models\User\User; use Engelsystem\Test\Unit\HasDatabase; +use Illuminate\Support\Collection; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; +use Symfony\Component\HttpFoundation\Session\Session; use Symfony\Component\HttpFoundation\Session\SessionInterface; +use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage; class AuthControllerTest extends TestCase { @@ -21,6 +27,7 @@ class AuthControllerTest extends TestCase /** * @covers \Engelsystem\Controllers\AuthController::__construct * @covers \Engelsystem\Controllers\AuthController::login + * @covers \Engelsystem\Controllers\AuthController::showLogin */ public function testLogin() { @@ -31,6 +38,10 @@ class AuthControllerTest extends TestCase /** @var Authenticator|MockObject $auth */ list(, $session, $url, $auth) = $this->getMocks(); + $session->expects($this->once()) + ->method('get') + ->with('errors', []) + ->willReturn(['foo' => 'bar']); $response->expects($this->once()) ->method('withView') ->with('pages/login') @@ -42,7 +53,6 @@ class AuthControllerTest extends TestCase /** * @covers \Engelsystem\Controllers\AuthController::postLogin - * @covers \Engelsystem\Controllers\AuthController::authenticateUser */ public function testPostLogin() { @@ -51,10 +61,12 @@ class AuthControllerTest extends TestCase $request = new Request(); /** @var Response|MockObject $response */ $response = $this->createMock(Response::class); - /** @var SessionInterface|MockObject $session */ /** @var UrlGeneratorInterface|MockObject $url */ /** @var Authenticator|MockObject $auth */ - list(, $session, $url, $auth) = $this->getMocks(); + list(, , $url, $auth) = $this->getMocks(); + $session = new Session(new MockArraySessionStorage()); + /** @var Validator|MockObject $validator */ + $validator = new Validator(new Validates()); $user = new User([ 'name' => 'foo', @@ -63,7 +75,7 @@ class AuthControllerTest extends TestCase 'api_key' => '', 'last_login_at' => null, ]); - $user->forceFill(['id' => 42,]); + $user->forceFill(['id' => 42]); $user->save(); $settings = new Settings(['language' => 'de_DE', 'theme' => '']); @@ -76,41 +88,42 @@ class AuthControllerTest extends TestCase ->with('foo', 'bar') ->willReturnOnConsecutiveCalls(null, $user); - $response->expects($this->exactly(3)) + $response->expects($this->once()) ->method('withView') - ->withConsecutive( - ['pages/login', ['errors' => ['auth.no-nickname'], 'show_password_recovery' => true]], - ['pages/login', ['errors' => ['auth.no-password'], 'show_password_recovery' => true]], - ['pages/login', ['errors' => ['auth.not-found'], 'show_password_recovery' => true]]) + ->with('pages/login', ['errors' => Collection::make(['auth.not-found']), 'show_password_recovery' => true]) ->willReturn($response); $response->expects($this->once()) ->method('redirectTo') ->with('news') ->willReturn($response); - $session->expects($this->once()) - ->method('invalidate'); - - $session->expects($this->exactly(2)) - ->method('set') - ->withConsecutive( - ['user_id', 42], - ['locale', 'de_DE'] - ); - + // No credentials $controller = new AuthController($response, $session, $url, $auth); - $controller->postLogin($request); + $controller->setValidator($validator); + try { + $controller->postLogin($request); + $this->fail('Login without credentials possible'); + } catch (ValidationException $e) { + } + + // Missing password + $request = new Request([], ['login' => 'foo']); + try { + $controller->postLogin($request); + $this->fail('Login without password possible'); + } catch (ValidationException $e) { + } - $request = new Request(['login' => 'foo']); - $controller->postLogin($request); - - $request = new Request(['login' => 'foo', 'password' => 'bar']); // No user found + $request = new Request([], ['login' => 'foo', 'password' => 'bar']); $controller->postLogin($request); + $this->assertEquals([], $session->all()); + // Authenticated user $controller->postLogin($request); $this->assertNotNull($user->last_login_at); + $this->assertEquals(['user_id' => 42, 'locale' => 'de_DE'], $session->all()); } /** -- cgit v1.2.3 From 6743106d9a8c760580690aab704f908766731801 Mon Sep 17 00:00:00 2001 From: Igor Scheller Date: Wed, 10 Jul 2019 13:34:15 +0200 Subject: Replaced validation with `respect/validation` --- composer.json | 1 + src/Http/Validation/Rules/In.php | 21 ++ src/Http/Validation/Rules/NotIn.php | 15 ++ src/Http/Validation/Validates.php | 154 ----------- src/Http/Validation/ValidationServiceProvider.php | 3 - src/Http/Validation/Validator.php | 61 +++-- tests/Unit/Controllers/AuthControllerTest.php | 3 +- tests/Unit/Http/Validation/Rules/InTest.php | 19 ++ tests/Unit/Http/Validation/Rules/NotInTest.php | 20 ++ tests/Unit/Http/Validation/ValidatesTest.php | 308 ---------------------- tests/Unit/Http/Validation/ValidatorTest.php | 42 ++- 11 files changed, 155 insertions(+), 492 deletions(-) create mode 100644 src/Http/Validation/Rules/In.php create mode 100644 src/Http/Validation/Rules/NotIn.php delete mode 100644 src/Http/Validation/Validates.php create mode 100644 tests/Unit/Http/Validation/Rules/InTest.php create mode 100644 tests/Unit/Http/Validation/Rules/NotInTest.php delete mode 100644 tests/Unit/Http/Validation/ValidatesTest.php diff --git a/composer.json b/composer.json index b2b70789..a1f2101b 100644 --- a/composer.json +++ b/composer.json @@ -32,6 +32,7 @@ "psr/container": "^1.0", "psr/http-server-middleware": "^1.0", "psr/log": "^1.1", + "respect/validation": "^1.1", "swiftmailer/swiftmailer": "^6.2", "symfony/http-foundation": "^4.3", "symfony/psr-http-message-bridge": "^1.2", diff --git a/src/Http/Validation/Rules/In.php b/src/Http/Validation/Rules/In.php new file mode 100644 index 00000000..d585cc3d --- /dev/null +++ b/src/Http/Validation/Rules/In.php @@ -0,0 +1,21 @@ +validateParameterCount(2, $parameters, __FUNCTION__); - $size = $this->getSize($value); - - return $size >= $parameters[0] && $size <= $parameters[1]; - } - - /** - * @param mixed $value - * @return bool - */ - public function bool($value): bool - { - return in_array($value, ['1', 1, true, '0', 0, false], true); - } - - /** - * @param mixed $value - * @param array $parameters ['1,2,3,56,7'] - * @return bool - */ - public function in($value, $parameters): bool - { - $this->validateParameterCount(1, $parameters, __FUNCTION__); - - return in_array($value, explode(',', $parameters[0])); - } - - /** - * @param mixed $value - * @return bool - */ - public function int($value): bool - { - return filter_var($value, FILTER_VALIDATE_INT) !== false; - } - - /** - * @param string $value - * @param array $parameters ['max'] - * @return bool - */ - public function max($value, $parameters): bool - { - $this->validateParameterCount(1, $parameters, __FUNCTION__); - $size = $this->getSize($value); - - return $size <= $parameters[0]; - } - - /** - * @param string $value - * @param array $parameters ['min'] - * @return bool - */ - public function min($value, $parameters) - { - $this->validateParameterCount(1, $parameters, __FUNCTION__); - $size = $this->getSize($value); - - return $size >= $parameters[0]; - } - - /** - * @param mixed $value - * @param array $parameters ['1,2,3,56,7'] - * @return bool - */ - public function notIn($value, $parameters): bool - { - $this->validateParameterCount(1, $parameters, __FUNCTION__); - - return !$this->in($value, $parameters); - } - - /** - * @param mixed $value - * @return bool - */ - public function numeric($value): bool - { - return is_numeric($value); - } - - /** - * @param mixed $value - * @return bool - */ - public function required($value): bool - { - if ( - is_null($value) - || (is_string($value) && trim($value) === '') - ) { - return false; - } - - return true; - } - - /** - * @param mixed $value - * @return int|float - */ - protected function getSize($value) - { - if (is_numeric($value)) { - return $value; - } - - return mb_strlen($value); - } - - /** - * @param int $count - * @param array $parameters - * @param string $rule - * - * @throws InvalidArgumentException - */ - protected function validateParameterCount(int $count, array $parameters, string $rule) - { - if (count($parameters) < $count) { - throw new InvalidArgumentException(sprintf( - 'The rule "%s" requires at least %d parameters', - $rule, - $count - )); - } - } -} diff --git a/src/Http/Validation/ValidationServiceProvider.php b/src/Http/Validation/ValidationServiceProvider.php index 2f1c6359..14530ae6 100644 --- a/src/Http/Validation/ValidationServiceProvider.php +++ b/src/Http/Validation/ValidationServiceProvider.php @@ -10,9 +10,6 @@ class ValidationServiceProvider extends ServiceProvider { public function register() { - $validates = $this->app->make(Validates::class); - $this->app->instance(Validates::class, $validates); - $validator = $this->app->make(Validator::class); $this->app->instance(Validator::class, $validator); $this->app->instance('validator', $validator); diff --git a/src/Http/Validation/Validator.php b/src/Http/Validation/Validator.php index a9235a5f..0bd846bd 100644 --- a/src/Http/Validation/Validator.php +++ b/src/Http/Validation/Validator.php @@ -4,25 +4,23 @@ namespace Engelsystem\Http\Validation; use Illuminate\Support\Str; use InvalidArgumentException; +use Respect\Validation\Exceptions\ComponentException; +use Respect\Validation\Validator as RespectValidator; class Validator { - /** @var Validates */ - protected $validate; - /** @var string[] */ protected $errors = []; /** @var array */ protected $data = []; - /** - * @param Validates $validate - */ - public function __construct(Validates $validate) - { - $this->validate = $validate; - } + /** @var array */ + protected $mapping = [ + 'accepted' => 'TrueVal', + 'int' => 'IntVal', + 'required' => 'NotEmpty', + ]; /** * @param array $data @@ -35,29 +33,56 @@ class Validator $this->data = []; foreach ($rules as $key => $values) { + $v = new RespectValidator(); + $v->with('\\Engelsystem\\Http\\Validation\\Rules', true); + + $value = isset($data[$key]) ? $data[$key] : null; + foreach (explode('|', $values) as $parameters) { $parameters = explode(':', $parameters); $rule = array_shift($parameters); $rule = Str::camel($rule); + $rule = $this->map($rule); - if (!method_exists($this->validate, $rule)) { - throw new InvalidArgumentException('Unknown validation rule: ' . $rule); + try { + call_user_func_array([$v, $rule], $parameters); + } catch (ComponentException $e) { + throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); } - $value = isset($data[$key]) ? $data[$key] : null; - if (!$this->validate->{$rule}($value, $parameters, $data)) { - $this->errors[$key][] = implode('.', ['validation', $key, $rule]); - - continue; + if ($v->validate($value)) { + $this->data[$key] = $value; + } else { + $this->errors[$key][] = implode('.', ['validation', $key, $this->mapBack($rule)]); } - $this->data[$key] = $value; + $v->removeRules(); } } return empty($this->errors); } + /** + * @param string $rule + * @return string + */ + protected function map($rule) + { + return $this->mapping[$rule] ?? $rule; + } + + /** + * @param string $rule + * @return string + */ + protected function mapBack($rule) + { + $mapping = array_flip($this->mapping); + + return $mapping[$rule] ?? $rule; + } + /** * @return array */ diff --git a/tests/Unit/Controllers/AuthControllerTest.php b/tests/Unit/Controllers/AuthControllerTest.php index d3dbfa4b..c3d9659c 100644 --- a/tests/Unit/Controllers/AuthControllerTest.php +++ b/tests/Unit/Controllers/AuthControllerTest.php @@ -8,7 +8,6 @@ use Engelsystem\Http\Exceptions\ValidationException; use Engelsystem\Http\Request; use Engelsystem\Http\Response; use Engelsystem\Http\UrlGeneratorInterface; -use Engelsystem\Http\Validation\Validates; use Engelsystem\Http\Validation\Validator; use Engelsystem\Models\User\Settings; use Engelsystem\Models\User\User; @@ -66,7 +65,7 @@ class AuthControllerTest extends TestCase list(, , $url, $auth) = $this->getMocks(); $session = new Session(new MockArraySessionStorage()); /** @var Validator|MockObject $validator */ - $validator = new Validator(new Validates()); + $validator = new Validator(); $user = new User([ 'name' => 'foo', diff --git a/tests/Unit/Http/Validation/Rules/InTest.php b/tests/Unit/Http/Validation/Rules/InTest.php new file mode 100644 index 00000000..e5688d90 --- /dev/null +++ b/tests/Unit/Http/Validation/Rules/InTest.php @@ -0,0 +1,19 @@ +assertEquals(['foo', 'bar'], $rule->haystack); + } +} diff --git a/tests/Unit/Http/Validation/Rules/NotInTest.php b/tests/Unit/Http/Validation/Rules/NotInTest.php new file mode 100644 index 00000000..9be12336 --- /dev/null +++ b/tests/Unit/Http/Validation/Rules/NotInTest.php @@ -0,0 +1,20 @@ +assertTrue($rule->validate('lorem')); + $this->assertFalse($rule->validate('foo')); + } +} diff --git a/tests/Unit/Http/Validation/ValidatesTest.php b/tests/Unit/Http/Validation/ValidatesTest.php deleted file mode 100644 index 5cf0447a..00000000 --- a/tests/Unit/Http/Validation/ValidatesTest.php +++ /dev/null @@ -1,308 +0,0 @@ -assertTrue($val->accepted($value) === $result); - } - - /** - * @return array - */ - public function provideBetween() - { - return [ - ['42', [10, 100]], - [42.5, [42, 43]], - [42, [42, 1000]], - [1337, [0, 99], false], - [-17, [32, 45], false], - ]; - } - - /** - * @covers \Engelsystem\Http\Validation\Validates::between - * @param mixed $value - * @param array $parameters - * @param bool $result - * @dataProvider provideBetween - */ - public function testBetween($value, array $parameters, bool $result = true) - { - $val = new Validates; - $this->assertTrue($val->between($value, $parameters) === $result); - } - - /** - * @return array - */ - public function provideBool() - { - return [ - ['1'], - [1], - [true], - ['0'], - [0], - [false], - ['true', false], - ['false', false], - ['yes', false], - ['no', false], - ['bool', false], - ]; - } - - /** - * @covers \Engelsystem\Http\Validation\Validates::bool - * @param mixed $value - * @param bool $result - * @dataProvider provideBool - */ - public function testBool($value, bool $result = true) - { - $val = new Validates; - $this->assertTrue($val->bool($value) === $result); - } - - /** - * @return array - */ - public function provideIn() - { - return [ - ['lorem', ['lorem,ipsum,dolor']], - [99, ['66,77,88,99,111']], - [4, ['1,3,5,7'], false], - ['toggle', ['on,off'], false], - ]; - } - - /** - * @covers \Engelsystem\Http\Validation\Validates::in - * @param mixed $value - * @param array $parameters - * @param bool $result - * @dataProvider provideIn - */ - public function testIn($value, array $parameters, bool $result = true) - { - $val = new Validates; - $this->assertTrue($val->in($value, $parameters) === $result); - } - - /** - * @return array - */ - public function provideInt() - { - return [ - ['1337'], - [42], - ['0'], - [false, false], - ['12asd1', false], - ['one', false], - ]; - } - - /** - * @covers \Engelsystem\Http\Validation\Validates::int - * @param mixed $value - * @param bool $result - * @dataProvider provideInt - */ - public function testInt($value, bool $result = true) - { - $val = new Validates; - $this->assertTrue($val->int($value) === $result); - } - - /** - * @return array - */ - public function provideMax() - { - return [ - ['99', [100]], - [-42, [1024]], - [99, [99]], - [100, [10], false], - ]; - } - - /** - * @covers \Engelsystem\Http\Validation\Validates::max - * @param mixed $value - * @param array $parameters - * @param bool $result - * @dataProvider provideMax - */ - public function testMax($value, array $parameters, bool $result = true) - { - $val = new Validates; - $this->assertTrue($val->max($value, $parameters) === $result); - } - - /** - * @return array - */ - public function provideMin() - { - return [ - [32, [0]], - [7, [7]], - ['99', [10]], - [3, [42], false], - ]; - } - - /** - * @covers \Engelsystem\Http\Validation\Validates::min - * @param mixed $value - * @param array $parameters - * @param bool $result - * @dataProvider provideMin - */ - public function testMin($value, array $parameters, bool $result = true) - { - $val = new Validates; - $this->assertTrue($val->min($value, $parameters) === $result); - } - - /** - * @return array - */ - public function provideNotIn() - { - return [ - [77, ['50,60,70']], - ['test', ['coding,deployment']], - ['PHP', ['Java,PHP,bash'], false], - ]; - } - - /** - * @covers \Engelsystem\Http\Validation\Validates::notIn - * @param mixed $value - * @param array $parameters - * @param bool $result - * @dataProvider provideNotIn - */ - public function testNotIn($value, array $parameters, bool $result = true) - { - $val = new Validates; - $this->assertTrue($val->notIn($value, $parameters) === $result); - } - - /** - * @return array - */ - public function provideNumeric() - { - return [ - [77], - ['42'], - ['1337e0'], - ['123f00', false], - [null, false], - ]; - } - - /** - * @covers \Engelsystem\Http\Validation\Validates::numeric - * @param mixed $value - * @param bool $result - * @dataProvider provideNumeric - */ - public function testNumeric($value, bool $result = true) - { - $val = new Validates; - $this->assertTrue($val->numeric($value) === $result); - } - - /** - * @return array - */ - public function provideRequired() - { - return [ - ['Lorem ipsum'], - ['1234'], - [1234], - ['0'], - [0], - ['', false], - [' ', false], - [null, false], - ]; - } - - /** - * @covers \Engelsystem\Http\Validation\Validates::required - * @param mixed $value - * @param bool $result - * @dataProvider provideRequired - */ - public function testRequired($value, bool $result = true) - { - $val = new Validates; - $this->assertTrue($val->required($value) === $result); - } - - /** - * @covers \Engelsystem\Http\Validation\Validates::getSize - */ - public function testGetSize() - { - $val = new Validates; - $this->assertTrue($val->max(42, [999])); - $this->assertTrue($val->max('99', [100])); - $this->assertFalse($val->max('101', [100])); - $this->assertTrue($val->max('lorem', [5])); - $this->assertFalse($val->max('Lorem Ipsum', [5])); - } - - /** - * @covers \Engelsystem\Http\Validation\Validates::validateParameterCount - */ - public function testValidateParameterCount() - { - $val = new Validates; - $this->assertTrue($val->between(42, [1, 100])); - - $this->expectException(InvalidArgumentException::class); - $val->between(42, [1]); - } -} diff --git a/tests/Unit/Http/Validation/ValidatorTest.php b/tests/Unit/Http/Validation/ValidatorTest.php index 799265ec..0790b7a8 100644 --- a/tests/Unit/Http/Validation/ValidatorTest.php +++ b/tests/Unit/Http/Validation/ValidatorTest.php @@ -2,7 +2,6 @@ namespace Engelsystem\Test\Unit\Http\Validation; -use Engelsystem\Http\Validation\Validates; use Engelsystem\Http\Validation\Validator; use InvalidArgumentException; use PHPUnit\Framework\TestCase; @@ -10,19 +9,18 @@ use PHPUnit\Framework\TestCase; class ValidatorTest extends TestCase { /** - * @covers \Engelsystem\Http\Validation\Validator::__construct * @covers \Engelsystem\Http\Validation\Validator::validate * @covers \Engelsystem\Http\Validation\Validator::getData * @covers \Engelsystem\Http\Validation\Validator::getErrors */ public function testValidate() { - $val = new Validator(new Validates); + $val = new Validator(); $this->assertTrue($val->validate( - ['foo' => 'bar', 'lorem' => 'on'], - ['foo' => 'required|not_in:lorem,ipsum,dolor', 'lorem' => 'accepted'] + ['foo' => 'bar', 'lorem' => 'on', 'dolor' => 'bla'], + ['lorem' => 'accepted'] )); - $this->assertEquals(['foo' => 'bar', 'lorem' => 'on'], $val->getData()); + $this->assertEquals(['lorem' => 'on'], $val->getData()); $this->assertFalse($val->validate( [], @@ -39,7 +37,7 @@ class ValidatorTest extends TestCase */ public function testValidateNotImplemented() { - $val = new Validator(new Validates); + $val = new Validator(); $this->expectException(InvalidArgumentException::class); $val->validate( @@ -47,4 +45,34 @@ class ValidatorTest extends TestCase ['foo' => 'never_implemented'] ); } + + /** + * @covers \Engelsystem\Http\Validation\Validator::map + * @covers \Engelsystem\Http\Validation\Validator::mapBack + */ + public function testValidateMapping() + { + $val = new Validator(); + $this->assertTrue($val->validate( + ['foo' => 'bar'], + ['foo' => 'required'] + )); + $this->assertTrue($val->validate( + ['foo' => '0'], + ['foo' => 'int'] + )); + $this->assertTrue($val->validate( + ['foo' => 'on'], + ['foo' => 'accepted'] + )); + + $this->assertFalse($val->validate( + [], + ['lorem' => 'required'] + )); + $this->assertEquals( + ['lorem' => ['validation.lorem.required']], + $val->getErrors() + ); + } } -- cgit v1.2.3 From b25924e868cdf80944e56a76fa6eed4509d9af7b Mon Sep 17 00:00:00 2001 From: Igor Scheller Date: Tue, 16 Jul 2019 01:39:54 +0200 Subject: Allow nested rules (not and optional) --- src/Http/Validation/Validator.php | 27 ++++++++++-- tests/Unit/Http/Validation/ValidatorTest.php | 64 ++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 3 deletions(-) diff --git a/src/Http/Validation/Validator.php b/src/Http/Validation/Validator.php index 0bd846bd..976f5682 100644 --- a/src/Http/Validation/Validator.php +++ b/src/Http/Validation/Validator.php @@ -22,6 +22,9 @@ class Validator 'required' => 'NotEmpty', ]; + /** @var array */ + protected $nestedRules = ['optional', 'not']; + /** * @param array $data * @param array $rules @@ -37,20 +40,38 @@ class Validator $v->with('\\Engelsystem\\Http\\Validation\\Rules', true); $value = isset($data[$key]) ? $data[$key] : null; + $values = explode('|', $values); + + $packing = []; + foreach ($this->nestedRules as $rule) { + if (in_array($rule, $values)) { + $packing[] = $rule; + } + } - foreach (explode('|', $values) as $parameters) { + $values = array_diff($values, $this->nestedRules); + foreach ($values as $parameters) { $parameters = explode(':', $parameters); $rule = array_shift($parameters); $rule = Str::camel($rule); $rule = $this->map($rule); + // To allow rules nesting + $w = $v; try { - call_user_func_array([$v, $rule], $parameters); + foreach (array_reverse(array_merge($packing, [$rule])) as $rule) { + if (!in_array($rule, $this->nestedRules)) { + call_user_func_array([$w, $rule], $parameters); + continue; + } + + $w = call_user_func_array([new RespectValidator(), $rule], [$w]); + } } catch (ComponentException $e) { throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); } - if ($v->validate($value)) { + if ($w->validate($value)) { $this->data[$key] = $value; } else { $this->errors[$key][] = implode('.', ['validation', $key, $this->mapBack($rule)]); diff --git a/tests/Unit/Http/Validation/ValidatorTest.php b/tests/Unit/Http/Validation/ValidatorTest.php index 0790b7a8..450e5d4e 100644 --- a/tests/Unit/Http/Validation/ValidatorTest.php +++ b/tests/Unit/Http/Validation/ValidatorTest.php @@ -16,6 +16,7 @@ class ValidatorTest extends TestCase public function testValidate() { $val = new Validator(); + $this->assertTrue($val->validate( ['foo' => 'bar', 'lorem' => 'on', 'dolor' => 'bla'], ['lorem' => 'accepted'] @@ -32,12 +33,39 @@ class ValidatorTest extends TestCase ); } + /** + * @covers \Engelsystem\Http\Validation\Validator::validate + */ + public function testValidateChaining() + { + $val = new Validator(); + + $this->assertTrue($val->validate( + ['lorem' => 10], + ['lorem' => 'required|min:3|max:10'] + )); + $this->assertTrue($val->validate( + ['lorem' => 3], + ['lorem' => 'required|min:3|max:10'] + )); + + $this->assertFalse($val->validate( + ['lorem' => 2], + ['lorem' => 'required|min:3|max:10'] + )); + $this->assertFalse($val->validate( + ['lorem' => 42], + ['lorem' => 'required|min:3|max:10'] + )); + } + /** * @covers \Engelsystem\Http\Validation\Validator::validate */ public function testValidateNotImplemented() { $val = new Validator(); + $this->expectException(InvalidArgumentException::class); $val->validate( @@ -53,6 +81,7 @@ class ValidatorTest extends TestCase public function testValidateMapping() { $val = new Validator(); + $this->assertTrue($val->validate( ['foo' => 'bar'], ['foo' => 'required'] @@ -75,4 +104,39 @@ class ValidatorTest extends TestCase $val->getErrors() ); } + + /** + * @covers \Engelsystem\Http\Validation\Validator::validate + */ + public function testValidateNesting() + { + $val = new Validator(); + + $this->assertTrue($val->validate( + [], + ['foo' => 'not|required'] + )); + + $this->assertTrue($val->validate( + ['foo' => 'foo'], + ['foo' => 'not|int'] + )); + $this->assertFalse($val->validate( + ['foo' => 1], + ['foo' => 'not|int'] + )); + + $this->assertTrue($val->validate( + [], + ['foo' => 'optional|int'] + )); + $this->assertTrue($val->validate( + ['foo' => '33'], + ['foo' => 'optional|int'] + )); + $this->assertFalse($val->validate( + ['foo' => 'T'], + ['foo' => 'optional|int'] + )); + } } -- cgit v1.2.3 From c412f6b009e4cc125089806ca939d928c2efe0a2 Mon Sep 17 00:00:00 2001 From: msquare Date: Thu, 11 Jul 2019 20:09:49 +0200 Subject: add cccamp19 theme --- config/config.default.php | 1 + resources/assets/themes/theme8.less | 1066 +++++++++++++++++++++++++++++++++++ webpack.config.js | 2 +- 3 files changed, 1068 insertions(+), 1 deletion(-) create mode 100644 resources/assets/themes/theme8.less diff --git a/config/config.default.php b/config/config.default.php index 3fad18bc..8c5907f7 100644 --- a/config/config.default.php +++ b/config/config.default.php @@ -59,6 +59,7 @@ return [ // Available themes 'available_themes' => [ + '8' => 'Engelsystem cccamp19 dark (2019)', '7' => 'Engelsystem 35c3 dark (2018)', '6' => 'Engelsystem 34c3 dark (2017)', '5' => 'Engelsystem 34c3 light (2017)', diff --git a/resources/assets/themes/theme8.less b/resources/assets/themes/theme8.less new file mode 100644 index 00000000..22887dab --- /dev/null +++ b/resources/assets/themes/theme8.less @@ -0,0 +1,1066 @@ +@import "../../../node_modules/bootstrap/less/variables"; + +/* +The MIT License (MIT) + +Copyright (c) 2013 Thomas Park + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +// Cyborg 3.2.0 +// Variables +// -------------------------------------------------- + +//== Colors +// +//## Gray and brand colors for use across Bootstrap. + +@gray-darker: #222; // #222 +@gray-dark: #282828; // #333 +@gray: #555; // #555 +@gray-light: #888; // #999 +@gray-lighter: #ADAFAE; // #eee + +@brand-primary: #0076ba; +@brand-success: #99ba00; +@brand-info: #ffc600; +@brand-warning: #ffc600; +@brand-danger: #d9534f; + + +//== Scaffolding +// +//## Settings for some of the most global styles. + +//** Background color for ``. +@body-bg: #060606; +//** Global text color on ``. +@text-color: @gray-light; + +//** Global textual link color. +@link-color: @brand-primary; +//** Link hover color set via `darken()` function. +@link-hover-color: @link-color; + + +//== Typography +// +//## Font, line-height, and color for body text, headings, and more. + +@font-family-serif: Georgia, "Times New Roman", Times, serif; +//** Default monospace fonts for ``, ``, and `
`.
+@font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace;
+@font-family-base:        @font-family-sans-serif;
+
+@font-size-base:          14px;
+@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px
+@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px
+
+@font-size-h1:            34px;
+@font-size-h2:            24px;
+@font-size-h3:            20px;
+@font-size-h4:            20px;
+@font-size-h5:            20px;
+@font-size-h6:            16px;
+
+//** Unit-less `line-height` for use in components like buttons.
+@line-height-base:        1.428571429; // 20/14
+//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
+@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px
+
+//** By default, this inherits from the ``.
+@headings-font-family:    @font-family-base;
+@headings-font-weight:    500;
+@headings-line-height:    1.1;
+@headings-color:          #fff;
+
+
+//== Iconography
+//
+//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
+
+//** File name for all font files.
+@icon-font-name:          "glyphicons-halflings-regular";
+//** Element ID within SVG icon file.
+@icon-font-svg-id:        "glyphicons_halflingsregular";
+
+
+//== Components
+//
+//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
+
+@padding-base-vertical:     8px;
+@padding-base-horizontal:   12px;
+
+@padding-large-vertical:    14px;
+@padding-large-horizontal:  16px;
+
+@padding-small-vertical:    5px;
+@padding-small-horizontal:  10px;
+
+@padding-xs-vertical:       1px;
+@padding-xs-horizontal:     5px;
+
+@line-height-large:         1.33;
+@line-height-small:         1.5;
+
+@border-radius-base:        4px;
+@border-radius-large:       6px;
+@border-radius-small:       3px;
+
+//** Global color for active items (e.g., navs or dropdowns).
+@component-active-color:    #fff;
+//** Global background color for active items (e.g., navs or dropdowns).
+@component-active-bg:       @brand-primary;
+
+//** Width of the `border` for generating carets that indicator dropdowns.
+@caret-width-base:          4px;
+//** Carets increase slightly in size for larger components.
+@caret-width-large:         5px;
+
+
+//== Tables
+//
+//## Customizes the `.table` component with basic values, each used across all table variations.
+
+//** Padding for ``s and ``s.
+@table-cell-padding:            8px;
+//** Padding for cells in `.table-condensed`.
+@table-condensed-cell-padding:  5px;
+
+//** Default background color used for all tables.
+@table-bg:                      darken(@gray-darker, 4%);
+//** Background color used for `.table-striped`.
+@table-bg-accent:               darken(@table-bg, 6%);
+//** Background color used for `.table-hover`.
+@table-bg-hover:                @gray-dark;
+@table-bg-active:               @table-bg-hover;
+
+//** Border color for table and cell borders.
+@table-border-color:            @gray-dark;
+
+
+//== Buttons
+//
+//## For each of Bootstrap's buttons, define text, background and border color.
+
+@btn-font-weight:                normal;
+
+@btn-default-color:              #000;
+@btn-default-bg:                 @gray;
+
+@btn-default-border:             darken(@btn-default-bg, 10%);
+
+@btn-primary-color:              @btn-default-color;
+@btn-primary-bg:                 @brand-primary;
+@btn-primary-border:             darken(@btn-default-bg, 10%);
+
+@btn-success-color:              @btn-default-color;
+@btn-success-bg:                 @brand-success;
+@btn-success-border:             darken(@btn-default-bg, 10%);
+
+@btn-info-color:                 @btn-default-color;
+@btn-info-bg:                    @brand-info;
+@btn-info-border:                darken(@btn-default-bg, 10%);
+
+@btn-warning-color:              @btn-default-color;
+@btn-warning-bg:                 @brand-warning;
+@btn-warning-border:             darken(@btn-default-bg, 10%);
+
+@btn-danger-color:               @btn-default-color;
+@btn-danger-bg:                  @brand-danger;
+@btn-danger-border:              darken(@btn-default-bg, 10%);
+
+@btn-link-disabled-color:        @gray-light;
+
+
+//== Forms
+//
+//##
+
+//** `` background color
+@input-bg:                       @gray-darker;
+//** `` background color
+@input-bg-disabled:              @gray-dark;
+
+//** Text color for ``s
+@input-color:                    @text-color;
+//** `` border color
+@input-border:                   @gray-dark;
+//** `` border radius
+@input-border-radius:            @border-radius-base;
+//** Border color for inputs on focus
+@input-border-focus:             #66afe9;
+
+//** Placeholder text color
+@input-color-placeholder:        @gray-light;
+
+//** Default `.form-control` height
+@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);
+//** Large `.form-control` height
+@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);
+//** Small `.form-control` height
+@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);
+
+@legend-color:                   @text-color;
+@legend-border-color:            @gray-dark;
+
+//** Background color for textual input addons
+@input-group-addon-bg:           @gray-lighter;
+//** Border color for textual input addons
+@input-group-addon-border-color: @input-border;
+
+
+//== Dropdowns
+//
+//## Dropdown menu container and contents.
+
+//** Background for the dropdown menu.
+@dropdown-bg:                    @gray-darker;
+//** Dropdown menu `border-color`.
+@dropdown-border:                rgba(255,255,255,0.1);
+//** Dropdown menu `border-color` **for IE8**.
+@dropdown-fallback-border:       #444;
+//** Divider color for between dropdown items.
+@dropdown-divider-bg:            rgba(255,255,255,0.1);
+
+//** Dropdown link text color.
+@dropdown-link-color:            #fff;
+//** Hover color for dropdown links.
+@dropdown-link-hover-color:      #fff;
+//** Hover background for dropdown links.
+@dropdown-link-hover-bg:         @dropdown-link-active-bg;
+
+//** Active dropdown menu item text color.
+@dropdown-link-active-color:     #fff;
+//** Active dropdown menu item background color.
+@dropdown-link-active-bg:        @component-active-bg;
+
+//** Disabled dropdown menu item background color.
+@dropdown-link-disabled-color:   @text-muted;
+
+//** Text color for headers within dropdown menus.
+@dropdown-header-color:          @text-muted;
+
+//** Deprecated `@dropdown-caret-color` as of v3.1.0
+@dropdown-caret-color:           #000;
+
+
+//-- Z-index master list
+//
+// Warning: Avoid customizing these values. They're used for a bird's eye view
+// of components dependent on the z-axis and are designed to all work together.
+//
+// Note: These variables are not generated into the Customizer.
+
+@zindex-navbar:            1000;
+@zindex-dropdown:          1000;
+@zindex-popover:           1060;
+@zindex-tooltip:           1070;
+@zindex-navbar-fixed:      1030;
+@zindex-modal-background:  1040;
+@zindex-modal:             1050;
+
+
+//== Media queries breakpoints
+//
+//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
+
+// Extra small screen / phone
+//** Deprecated `@screen-xs` as of v3.0.1
+@screen-xs:                  480px;
+//** Deprecated `@screen-xs-min` as of v3.2.0
+@screen-xs-min:              @screen-xs;
+//** Deprecated `@screen-phone` as of v3.0.1
+@screen-phone:               @screen-xs-min;
+
+// Small screen / tablet
+//** Deprecated `@screen-sm` as of v3.0.1
+@screen-sm:                  768px;
+@screen-sm-min:              @screen-sm;
+//** Deprecated `@screen-tablet` as of v3.0.1
+@screen-tablet:              @screen-sm-min;
+
+// Medium screen / desktop
+//** Deprecated `@screen-md` as of v3.0.1
+@screen-md:                  992px;
+@screen-md-min:              @screen-md;
+//** Deprecated `@screen-desktop` as of v3.0.1
+@screen-desktop:             @screen-md-min;
+
+// Large screen / wide desktop
+//** Deprecated `@screen-lg` as of v3.0.1
+@screen-lg:                  1200px;
+@screen-lg-min:              @screen-lg;
+//** Deprecated `@screen-lg-desktop` as of v3.0.1
+@screen-lg-desktop:          @screen-lg-min;
+
+// So media queries don't overlap when required, provide a maximum
+@screen-xs-max:              (@screen-sm-min - 1);
+@screen-sm-max:              (@screen-md-min - 1);
+@screen-md-max:              (@screen-lg-min - 1);
+
+
+//== Grid system
+//
+//## Define your custom responsive grid.
+
+//** Number of columns in the grid.
+@grid-columns:              12;
+//** Padding between columns. Gets divided in half for the left and right.
+@grid-gutter-width:         30px;
+// Navbar collapse
+//** Point at which the navbar becomes uncollapsed.
+@grid-float-breakpoint:     @screen-sm-min;
+//** Point at which the navbar begins collapsing.
+@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);
+
+
+//== Container sizes
+//
+//## Define the maximum width of `.container` for different screen sizes.
+
+// Small screen / tablet
+@container-tablet:             ((720px + @grid-gutter-width));
+//** For `@screen-sm-min` and up.
+@container-sm:                 @container-tablet;
+
+// Medium screen / desktop
+@container-desktop:            ((940px + @grid-gutter-width));
+//** For `@screen-md-min` and up.
+@container-md:                 @container-desktop;
+
+// Large screen / wide desktop
+@container-large-desktop:      ((1140px + @grid-gutter-width));
+//** For `@screen-lg-min` and up.
+@container-lg:                 @container-large-desktop;
+
+
+//== Navbar
+//
+//##
+
+// Basics of a navbar
+@navbar-height:                    50px;
+@navbar-margin-bottom:             @line-height-computed;
+@navbar-border-radius:             @border-radius-base;
+@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));
+@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);
+@navbar-collapse-max-height:       340px;
+
+@navbar-default-color:             @text-color;
+@navbar-default-bg:                @body-bg;
+@navbar-default-border:            @gray-dark;
+
+// Navbar links
+@navbar-default-link-color:                @text-color;
+@navbar-default-link-hover-color:          #fff;
+@navbar-default-link-hover-bg:             transparent;
+@navbar-default-link-active-color:         #fff;
+@navbar-default-link-active-bg:            transparent;
+@navbar-default-link-disabled-color:       @gray-light;
+@navbar-default-link-disabled-bg:          transparent;
+
+// Navbar brand label
+@navbar-default-brand-color:               #fff;
+@navbar-default-brand-hover-color:         #fff;
+@navbar-default-brand-hover-bg:            transparent;
+
+// Navbar toggle
+@navbar-default-toggle-hover-bg:           @gray-dark;
+@navbar-default-toggle-icon-bar-bg:        #ccc;
+@navbar-default-toggle-border-color:       @gray-dark;
+
+
+// Inverted navbar
+// Reset inverted navbar basics
+@navbar-inverse-color:                      @gray-light;
+@navbar-inverse-bg:                         @gray-darker;
+@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);
+
+// Inverted navbar links
+@navbar-inverse-link-color:                 @gray-light;
+@navbar-inverse-link-hover-color:           #fff;
+@navbar-inverse-link-hover-bg:              transparent;
+@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;
+@navbar-inverse-link-active-bg:             transparent;
+@navbar-inverse-link-disabled-color:        #aaa;
+@navbar-inverse-link-disabled-bg:           transparent;
+
+// Inverted navbar brand label
+@navbar-inverse-brand-color:                #fff;
+@navbar-inverse-brand-hover-color:          #fff;
+@navbar-inverse-brand-hover-bg:             transparent;
+
+// Inverted navbar toggle
+@navbar-inverse-toggle-hover-bg:            #333;
+@navbar-inverse-toggle-icon-bar-bg:         #fff;
+@navbar-inverse-toggle-border-color:        #333;
+
+
+//== Navs
+//
+//##
+
+//=== Shared nav styles
+@nav-link-padding:                          10px 15px;
+@nav-link-hover-bg:                         @gray-darker;
+
+@nav-disabled-link-color:                   @gray-light;
+@nav-disabled-link-hover-color:             @gray-light;
+
+@nav-open-link-hover-color:                 @gray-darker;
+
+//== Tabs
+@nav-tabs-border-color:                     @gray-dark;
+
+@nav-tabs-link-hover-border-color:          transparent;
+
+@nav-tabs-active-link-hover-bg:             @brand-primary;
+@nav-tabs-active-link-hover-color:          #fff;
+@nav-tabs-active-link-hover-border-color:   @gray-dark;
+
+@nav-tabs-justified-link-border-color:            #ddd;
+@nav-tabs-justified-active-link-border-color:     @body-bg;
+
+//== Pills
+@nav-pills-border-radius:                   @border-radius-base;
+@nav-pills-active-link-hover-bg:            @component-active-bg;
+@nav-pills-active-link-hover-color:         @component-active-color;
+
+
+//== Pagination
+//
+//##
+
+@pagination-color:                     #fff;
+@pagination-bg:                        @gray-darker;
+@pagination-border:                    @gray-dark;
+
+@pagination-hover-color:               #fff;
+@pagination-hover-bg:                  @component-active-bg;
+@pagination-hover-border:              transparent;
+
+@pagination-active-color:              #fff;
+@pagination-active-bg:                 @brand-primary;
+@pagination-active-border:             transparent;
+
+@pagination-disabled-color:            @gray-light;
+@pagination-disabled-bg:               @gray-darker;
+@pagination-disabled-border:           @gray-dark;
+
+
+//== Pager
+//
+//##
+
+@pager-bg:                             @pagination-bg;
+@pager-border:                         @pagination-border;
+@pager-border-radius:                  15px;
+
+@pager-hover-bg:                       @pagination-hover-bg;
+
+@pager-active-bg:                      @pagination-active-bg;
+@pager-active-color:                   @pagination-active-color;
+
+@pager-disabled-color:                 @gray-light;
+
+
+//== Jumbotron
+//
+//##
+
+@jumbotron-padding:              30px;
+@jumbotron-color:                inherit;
+@jumbotron-bg:                   darken(@gray-darker, 5%);
+@jumbotron-heading-color:        inherit;
+@jumbotron-font-size:            ceil((@font-size-base * 1.5));
+
+
+//== Form states and alerts
+//
+//## Define colors for form feedback states and, by default, alerts.
+
+@state-success-text:             #000;
+@state-success-bg:               @brand-success;
+@state-success-border:           darken(@state-success-bg, 5%);
+
+@state-info-text:                #000;
+@state-info-bg:                  @brand-info;
+@state-info-border:              darken(@state-info-bg, 7%);
+
+@state-warning-text:             #000;
+@state-warning-bg:               @brand-warning;
+@state-warning-border:           darken(@state-warning-bg, 3%);
+
+@state-danger-text:              #000;
+@state-danger-bg:                @brand-danger;
+@state-danger-border:            darken(@state-danger-bg, 3%);
+
+
+//== Tooltips
+//
+//##
+
+//** Tooltip max width
+@tooltip-max-width:           200px;
+//** Tooltip text color
+@tooltip-color:               #fff;
+//** Tooltip background color
+@tooltip-bg:                  rgba(0,0,0,.9);
+@tooltip-opacity:             .9;
+
+//** Tooltip arrow width
+@tooltip-arrow-width:         5px;
+//** Tooltip arrow color
+@tooltip-arrow-color:         @tooltip-bg;
+
+
+//== Popovers
+//
+//##
+
+//** Popover body background color
+@popover-bg:                          lighten(@body-bg, 10%);
+//** Popover maximum width
+@popover-max-width:                   276px;
+//** Popover border color
+@popover-border-color:                rgba(0,0,0,.2);
+//** Popover fallback border color
+@popover-fallback-border-color:       #999;
+
+//** Popover title background color
+@popover-title-bg:                    darken(@popover-bg, 3%);
+
+//** Popover arrow width
+@popover-arrow-width:                 10px;
+//** Popover arrow color
+@popover-arrow-color:                 @popover-bg;
+
+//** Popover outer arrow width
+@popover-arrow-outer-width:           (@popover-arrow-width + 1);
+//** Popover outer arrow color
+@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);
+//** Popover outer arrow fallback color
+@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);
+
+
+//== Labels
+//
+//##
+
+//** Default label background color
+@label-default-bg:            @btn-default-bg;
+//** Primary label background color
+@label-primary-bg:            @brand-primary;
+//** Success label background color
+@label-success-bg:            @brand-success;
+//** Info label background color
+@label-info-bg:               @brand-info;
+//** Warning label background color
+@label-warning-bg:            @brand-warning;
+//** Danger label background color
+@label-danger-bg:             @brand-danger;
+
+//** Default label text color
+@label-color:                 #fff;
+//** Default text color of a linked label
+@label-link-hover-color:      #fff;
+
+
+//== Modals
+//
+//##
+
+//** Padding applied to the modal body
+@modal-inner-padding:         20px;
+
+//** Padding applied to the modal title
+@modal-title-padding:         15px;
+//** Modal title line-height
+@modal-title-line-height:     @line-height-base;
+
+//** Background color of modal content area
+@modal-content-bg:                             lighten(@body-bg, 10%);
+//** Modal content border color
+@modal-content-border-color:                   rgba(0,0,0,.2);
+//** Modal content border color **for IE8**
+@modal-content-fallback-border-color:          #999;
+
+//** Modal backdrop background color
+@modal-backdrop-bg:           #000;
+//** Modal backdrop opacity
+@modal-backdrop-opacity:      .5;
+//** Modal header border color
+@modal-header-border-color:   @gray-dark;
+//** Modal footer border color
+@modal-footer-border-color:   @modal-header-border-color;
+
+@modal-lg:                    900px;
+@modal-md:                    600px;
+@modal-sm:                    300px;
+
+
+//== Alerts
+//
+//## Define alert colors, border radius, and padding.
+
+@alert-padding:               15px;
+@alert-border-radius:         @border-radius-base;
+@alert-link-font-weight:      bold;
+
+@alert-success-bg:            @state-success-bg;
+@alert-success-text:          @state-success-text;
+@alert-success-border:        @state-success-border;
+
+@alert-info-bg:               @state-info-bg;
+@alert-info-text:             @state-info-text;
+@alert-info-border:           @state-info-border;
+
+@alert-warning-bg:            @state-warning-bg;
+@alert-warning-text:          @state-warning-text;
+@alert-warning-border:        @state-warning-border;
+
+@alert-danger-bg:             @state-danger-bg;
+@alert-danger-text:           @state-danger-text;
+@alert-danger-border:         @state-danger-border;
+
+
+//== Progress bars
+//
+//##
+
+//** Background color of the whole progress component
+@progress-bg:                 @gray-darker;
+//** Progress bar text color
+@progress-bar-color:          #fff;
+
+//** Default progress bar color
+@progress-bar-bg:             @brand-primary;
+//** Success progress bar color
+@progress-bar-success-bg:     @brand-success;
+//** Warning progress bar color
+@progress-bar-warning-bg:     @brand-warning;
+//** Danger progress bar color
+@progress-bar-danger-bg:      @brand-danger;
+//** Info progress bar color
+@progress-bar-info-bg:        @brand-info;
+
+
+//== List group
+//
+//##
+
+//** Background color on `.list-group-item`
+@list-group-bg:                 @gray-darker;
+//** `.list-group-item` border color
+@list-group-border:             @gray-dark;
+//** List group border radius
+@list-group-border-radius:      @border-radius-base;
+
+//** Background color of single list items on hover
+@list-group-hover-bg:           lighten(@list-group-bg, 15%);
+//** Text color of active list items
+@list-group-active-color:       @component-active-color;
+//** Background color of active list items
+@list-group-active-bg:          @component-active-bg;
+//** Border color of active list elements
+@list-group-active-border:      @list-group-active-bg;
+//** Text color for content within active list items
+@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);
+
+//** Text color of disabled list items
+@list-group-disabled-color:      @gray-light;
+//** Background color of disabled list items
+@list-group-disabled-bg:         @gray-lighter;
+//** Text color for content within disabled list items
+@list-group-disabled-text-color: @list-group-disabled-color;
+
+@list-group-link-color:         @text-color;
+@list-group-link-hover-color:   @list-group-link-color;
+@list-group-link-heading-color: #fff;
+
+
+//== Panels
+//
+//##
+
+@panel-bg:                    @gray-darker;
+@panel-body-padding:          15px;
+@panel-heading-padding:       10px 15px;
+@panel-footer-padding:        @panel-heading-padding;
+@panel-border-radius:         @border-radius-base;
+
+//** Border color for elements within panels
+@panel-inner-border:          @gray-dark;
+
+@panel-default-text:          @text-color;
+@panel-default-border:        @panel-inner-border;
+@panel-default-heading-bg:    lighten(@gray-darker, 10%);
+
+@panel-footer-bg:             @panel-default-heading-bg;
+
+@panel-primary-text:          #fff;
+@panel-primary-border:        @brand-primary;
+@panel-primary-heading-bg:    @brand-primary;
+
+@panel-success-text:          @state-success-text;
+@panel-success-border:        @state-success-border;
+@panel-success-heading-bg:    @state-success-bg;
+
+@panel-info-text:             @state-info-text;
+@panel-info-border:           @state-info-border;
+@panel-info-heading-bg:       @state-info-bg;
+
+@panel-warning-text:          @state-warning-text;
+@panel-warning-border:        @state-warning-border;
+@panel-warning-heading-bg:    @state-warning-bg;
+
+@panel-danger-text:           @state-danger-text;
+@panel-danger-border:         @state-danger-border;
+@panel-danger-heading-bg:     @state-danger-bg;
+
+
+//== Thumbnails
+//
+//##
+
+//** Padding around the thumbnail image
+@thumbnail-padding:           4px;
+//** Thumbnail background color
+@thumbnail-bg:                @gray-dark;
+//** Thumbnail border color
+@thumbnail-border:            @gray-dark;
+//** Thumbnail border radius
+@thumbnail-border-radius:     @border-radius-base;
+
+//** Custom text color for thumbnail captions
+@thumbnail-caption-color:     @text-color;
+//** Padding around the thumbnail caption
+@thumbnail-caption-padding:   9px;
+
+
+//== Wells
+//
+//##
+
+@well-bg:                     darken(@gray-darker, 5%);
+@well-border:                 darken(@well-bg, 7%);
+
+
+//== Badges
+//
+//##
+
+@badge-color:                 #fff;
+//** Linked badge text color on hover
+@badge-link-hover-color:      #fff;
+@badge-bg:                    @brand-primary;
+
+//** Badge text color in active nav link
+@badge-active-color:          @brand-primary;
+//** Badge background color in active nav link
+@badge-active-bg:             #fff;
+
+@badge-font-weight:           bold;
+@badge-line-height:           1;
+@badge-border-radius:         10px;
+
+
+//== Breadcrumbs
+//
+//##
+
+@breadcrumb-padding-vertical:   8px;
+@breadcrumb-padding-horizontal: 15px;
+//** Breadcrumb background color
+@breadcrumb-bg:                 @gray-darker;
+//** Breadcrumb text color
+@breadcrumb-color:              #fff;
+//** Text color of current page in the breadcrumb
+@breadcrumb-active-color:       @text-color;
+//** Textual separator for between breadcrumb elements
+@breadcrumb-separator:          "/";
+
+
+//== Carousel
+//
+//##
+
+@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);
+
+@carousel-control-color:                      #fff;
+@carousel-control-width:                      15%;
+@carousel-control-opacity:                    .5;
+@carousel-control-font-size:                  20px;
+
+@carousel-indicator-active-bg:                #fff;
+@carousel-indicator-border-color:             #fff;
+
+@carousel-caption-color:                      #fff;
+
+
+//== Close
+//
+//##
+
+@close-font-weight:           bold;
+@close-color:                 #000;
+@close-text-shadow:           0 1px 0 #fff;
+
+
+//== Code
+//
+//##
+
+@code-color:                  #c7254e;
+@code-bg:                     #f9f2f4;
+
+@kbd-color:                   #fff;
+@kbd-bg:                      #333;
+
+@pre-bg:                      #f5f5f5;
+@pre-color:                   @gray-dark;
+@pre-border-color:            #ccc;
+@pre-scrollable-max-height:   340px;
+
+
+//== Type
+//
+//##
+
+//** Horizontal offset for forms and lists.
+@component-offset-horizontal: 180px;
+//** Text muted color
+@text-muted:                  @gray-light;
+//** Abbreviations and acronyms border color
+@abbr-border-color:           @gray-light;
+//** Headings small color
+@headings-small-color:        @gray-light;
+//** Blockquote small color
+@blockquote-small-color:      @gray;
+//** Blockquote font size
+@blockquote-font-size:        (@font-size-base * 1.25);
+//** Blockquote border color
+@blockquote-border-color:     @gray-dark;
+//** Page header border color
+@page-header-border-color:    @gray-dark;
+//** Width of horizontal description list titles
+@dl-horizontal-offset:        @component-offset-horizontal;
+//** Horizontal line color.
+@hr-border:                   @gray-dark;
+
+@import "base";
+
+.messages .text-danger {
+  color: #fff;
+}
+
+.messages .text-info {
+  color: #fff;
+}
+
+.messages .caret {
+  color: #fff;
+}
+
+// Cyborg 3.2.0
+// Bootswatch
+// -----------------------------------------------------
+
+// Navbar =====================================================================
+
+// Buttons ====================================================================
+
+// Typography =================================================================
+
+.text-primary,
+.text-primary:hover {
+  color: @brand-primary;
+}
+
+.text-success,
+.text-success:hover {
+  color: @brand-success;
+}
+
+.text-danger,
+.text-danger:hover {
+  color: @brand-danger;
+}
+
+.text-warning,
+.text-warning:hover {
+  color: @brand-warning;
+}
+
+.text-info,
+.text-info:hover {
+  color: @brand-info;
+}
+
+// Tables =====================================================================
+
+table,
+.table {
+  color: #fff;
+
+  a:not(.btn) {
+    color: #fff;
+    text-decoration: underline;
+  }
+
+  .text-muted {
+    color: @text-muted;
+  }
+}
+
+.table-responsive > .table {
+  background-color: @table-bg;
+}
+
+// Forms ======================================================================
+
+.has-warning {
+  .help-block,
+  .control-label,
+  .form-control-feedback {
+    color: @brand-warning;
+  }
+
+  .form-control,
+  .form-control:focus,
+  .input-group-addon {
+    border-color: @brand-warning;
+  }
+}
+
+.has-error {
+  .help-block,
+  .control-label,
+  .form-control-feedback {
+    color: @brand-danger;
+  }
+
+  .form-control,
+  .form-control:focus,
+  .input-group-addon {
+    border-color: @brand-danger;
+  }
+}
+
+.has-success {
+  .help-block,
+  .control-label,
+  .form-control-feedback {
+    color: @brand-success;
+  }
+
+  .form-control,
+  .form-control:focus,
+  .input-group-addon {
+    border-color: @brand-success;
+  }
+}
+
+legend {
+  color: #fff;
+}
+
+.input-group-addon {
+  background-color: @btn-default-bg;
+}
+
+// Navs =======================================================================
+
+.nav-tabs,
+.nav-pills,
+.breadcrumb,
+.pager {
+
+  a {
+    color: #fff;
+  }
+}
+
+// Indicators =================================================================
+
+.alert {
+
+  .alert-link,
+  a {
+    color: @alert-warning-text;
+    text-decoration: underline;
+  }
+
+  .close {
+    text-decoration: none;
+  }
+}
+
+.close {
+  color: #fff;
+  text-decoration: none;
+  opacity: 0.4;
+
+  &:hover,
+  &:focus {
+    color: #fff;
+    opacity: 1;
+  }
+}
+
+// Progress bars ==============================================================
+
+// Containers =================================================================
+
+a.thumbnail:hover,
+a.thumbnail:focus,
+a.thumbnail.active {
+  border-color: @thumbnail-border;
+}
+
+.jumbotron {
+
+  h1, h2, h3, h4, h5, h6 {
+    color: #fff;
+  }
+}
+
+
+// Specials for cccamp19 design
+
+.navbar-brand {
+	.icon-icon_angel {
+	  background-color: @brand-primary;
+  }
+  
+  strong {
+    font-weight: lighter;
+    color: @brand-primary;
+    text-shadow: 0 0 10px @brand-primary;
+  }
+}
+
+h1 {
+  font-weight: lighter;
+  color: @brand-primary;
+  text-shadow: 0 0 10px @brand-primary;
+}
diff --git a/webpack.config.js b/webpack.config.js
index 403c885e..5542460d 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -23,7 +23,7 @@ const plugins = [
 
 
 const themeEntries = {};
-for (let i = 0; i < 8; i++) {
+for (let i = 0; i < 9; i++) {
   themeEntries[`theme${i}`] = `./resources/assets/themes/theme${i}.less`;
 }
 
-- 
cgit v1.2.3


From 9e9fee25f20e131d4c7d4fa70a0d215dcc37c6f8 Mon Sep 17 00:00:00 2001
From: msquare 
Date: Sun, 14 Jul 2019 13:09:08 +0200
Subject: all 3 color themes for camp and high contrast theme

---
 config/config.default.php            |    5 +-
 resources/assets/themes/theme1.less  |    4 -
 resources/assets/themes/theme10.less | 1076 ++++++++++++++++++++++++++++++++++
 resources/assets/themes/theme11.less | 1049 +++++++++++++++++++++++++++++++++
 resources/assets/themes/theme4.less  |    4 -
 resources/assets/themes/theme6.less  |    4 -
 resources/assets/themes/theme7.less  |    4 -
 resources/assets/themes/theme8.less  |   36 +-
 resources/assets/themes/theme9.less  | 1076 ++++++++++++++++++++++++++++++++++
 webpack.config.js                    |    2 +-
 10 files changed, 3229 insertions(+), 31 deletions(-)
 create mode 100644 resources/assets/themes/theme10.less
 create mode 100644 resources/assets/themes/theme11.less
 create mode 100644 resources/assets/themes/theme9.less

diff --git a/config/config.default.php b/config/config.default.php
index 8c5907f7..ba343cf4 100644
--- a/config/config.default.php
+++ b/config/config.default.php
@@ -59,13 +59,16 @@ return [
 
     // Available themes
     'available_themes'        => [
-        '8' => 'Engelsystem cccamp19 dark (2019)',
+        '10' => 'Engelsystem cccamp19 green (2019)',
+        '9' => 'Engelsystem cccamp19 yellow (2019)',
+        '8' => 'Engelsystem cccamp19 blue (2019)',
         '7' => 'Engelsystem 35c3 dark (2018)',
         '6' => 'Engelsystem 34c3 dark (2017)',
         '5' => 'Engelsystem 34c3 light (2017)',
         '4' => 'Engelsystem 33c3 (2016)',
         '3' => 'Engelsystem 32c3 (2015)',
         '2' => 'Engelsystem cccamp15',
+        '11' => 'Engelsystem high contrast',
         '0' => 'Engelsystem light',
         '1' => 'Engelsystem dark',
     ],
diff --git a/resources/assets/themes/theme1.less b/resources/assets/themes/theme1.less
index 20af646a..d67daab7 100644
--- a/resources/assets/themes/theme1.less
+++ b/resources/assets/themes/theme1.less
@@ -980,10 +980,6 @@ table,
   }
 }
 
-legend {
-  color: #fff;
-}
-
 .input-group-addon {
   background-color: @btn-default-bg;
 }
diff --git a/resources/assets/themes/theme10.less b/resources/assets/themes/theme10.less
new file mode 100644
index 00000000..7262bbad
--- /dev/null
+++ b/resources/assets/themes/theme10.less
@@ -0,0 +1,1076 @@
+@import "../../../node_modules/bootstrap/less/variables";
+
+/*
+The MIT License (MIT)
+
+Copyright (c) 2013 Thomas Park
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+// Cyborg 3.2.0
+// Variables
+// --------------------------------------------------
+
+//== Colors
+//
+//## Gray and brand colors for use across Bootstrap.
+
+@gray-darker:            #222; // #222
+@gray-dark:              #282828;   // #333
+@gray:                   #555; // #555
+@gray-light:             #888;   // #999
+@gray-lighter:           #ADAFAE; // #eee
+
+@brand-primary:         #99ba00;
+@brand-success:         #99ba00;
+@brand-info:            #0076ba;
+@brand-warning:         #ffc600;
+@brand-danger:          #d9534f;
+
+
+//== Scaffolding
+//
+//## Settings for some of the most global styles.
+
+//** Background color for ``.
+@body-bg:               #060606;
+//** Global text color on ``.
+@text-color:            @gray-light;
+
+//** Global textual link color.
+@link-color:            @brand-primary;
+//** Link hover color set via `darken()` function.
+@link-hover-color:      @link-color;
+
+
+//== Typography
+//
+//## Font, line-height, and color for body text, headings, and more.
+
+@font-family-serif:       Georgia, "Times New Roman", Times, serif;
+//** Default monospace fonts for ``, ``, and `
`.
+@font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace;
+@font-family-base:        @font-family-sans-serif;
+
+@font-size-base:          14px;
+@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px
+@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px
+
+@font-size-h1:            34px;
+@font-size-h2:            24px;
+@font-size-h3:            20px;
+@font-size-h4:            20px;
+@font-size-h5:            20px;
+@font-size-h6:            16px;
+
+//** Unit-less `line-height` for use in components like buttons.
+@line-height-base:        1.428571429; // 20/14
+//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
+@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px
+
+//** By default, this inherits from the ``.
+@headings-font-family:    @font-family-base;
+@headings-font-weight:    500;
+@headings-line-height:    1.1;
+@headings-color:          #fff;
+
+
+//== Iconography
+//
+//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
+
+//** File name for all font files.
+@icon-font-name:          "glyphicons-halflings-regular";
+//** Element ID within SVG icon file.
+@icon-font-svg-id:        "glyphicons_halflingsregular";
+
+
+//== Components
+//
+//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
+
+@padding-base-vertical:     8px;
+@padding-base-horizontal:   12px;
+
+@padding-large-vertical:    14px;
+@padding-large-horizontal:  16px;
+
+@padding-small-vertical:    5px;
+@padding-small-horizontal:  10px;
+
+@padding-xs-vertical:       1px;
+@padding-xs-horizontal:     5px;
+
+@line-height-large:         1.33;
+@line-height-small:         1.5;
+
+@border-radius-base:        4px;
+@border-radius-large:       6px;
+@border-radius-small:       3px;
+
+//** Global color for active items (e.g., navs or dropdowns).
+@component-active-color:    #fff;
+//** Global background color for active items (e.g., navs or dropdowns).
+@component-active-bg:       @brand-primary;
+
+//** Width of the `border` for generating carets that indicator dropdowns.
+@caret-width-base:          4px;
+//** Carets increase slightly in size for larger components.
+@caret-width-large:         5px;
+
+
+//== Tables
+//
+//## Customizes the `.table` component with basic values, each used across all table variations.
+
+//** Padding for ``s and ``s.
+@table-cell-padding:            8px;
+//** Padding for cells in `.table-condensed`.
+@table-condensed-cell-padding:  5px;
+
+//** Default background color used for all tables.
+@table-bg:                      darken(@gray-darker, 4%);
+//** Background color used for `.table-striped`.
+@table-bg-accent:               darken(@table-bg, 6%);
+//** Background color used for `.table-hover`.
+@table-bg-hover:                @gray-dark;
+@table-bg-active:               @table-bg-hover;
+
+//** Border color for table and cell borders.
+@table-border-color:            @gray-dark;
+
+
+//== Buttons
+//
+//## For each of Bootstrap's buttons, define text, background and border color.
+
+@btn-font-weight:                normal;
+
+@btn-default-color:              #000;
+@btn-default-bg:                 @gray-light;
+
+@btn-default-border:             darken(@btn-default-bg, 10%);
+
+@btn-primary-color:              @btn-default-color;
+@btn-primary-bg:                 @brand-primary;
+@btn-primary-border:             darken(@btn-default-bg, 10%);
+
+@btn-success-color:              @btn-default-color;
+@btn-success-bg:                 @brand-success;
+@btn-success-border:             darken(@btn-default-bg, 10%);
+
+@btn-info-color:                 @btn-default-color;
+@btn-info-bg:                    @brand-info;
+@btn-info-border:                darken(@btn-default-bg, 10%);
+
+@btn-warning-color:              @btn-default-color;
+@btn-warning-bg:                 @brand-warning;
+@btn-warning-border:             darken(@btn-default-bg, 10%);
+
+@btn-danger-color:               @btn-default-color;
+@btn-danger-bg:                  @brand-danger;
+@btn-danger-border:              darken(@btn-default-bg, 10%);
+
+@btn-link-disabled-color:        @gray-light;
+
+
+//== Forms
+//
+//##
+
+//** `` background color
+@input-bg:                       @gray-darker;
+//** `` background color
+@input-bg-disabled:              @gray-dark;
+
+//** Text color for ``s
+@input-color:                    @text-color;
+//** `` border color
+@input-border:                   @gray-dark;
+//** `` border radius
+@input-border-radius:            @border-radius-base;
+//** Border color for inputs on focus
+@input-border-focus:             #66afe9;
+
+//** Placeholder text color
+@input-color-placeholder:        @gray-light;
+
+//** Default `.form-control` height
+@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);
+//** Large `.form-control` height
+@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);
+//** Small `.form-control` height
+@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);
+
+@legend-color:                   @text-color;
+@legend-border-color:            @gray-dark;
+
+//** Background color for textual input addons
+@input-group-addon-bg:           @gray-lighter;
+//** Border color for textual input addons
+@input-group-addon-border-color: @input-border;
+
+
+//== Dropdowns
+//
+//## Dropdown menu container and contents.
+
+//** Background for the dropdown menu.
+@dropdown-bg:                    @gray-darker;
+//** Dropdown menu `border-color`.
+@dropdown-border:                rgba(255,255,255,0.1);
+//** Dropdown menu `border-color` **for IE8**.
+@dropdown-fallback-border:       #444;
+//** Divider color for between dropdown items.
+@dropdown-divider-bg:            rgba(255,255,255,0.1);
+
+//** Dropdown link text color.
+@dropdown-link-color:            #fff;
+//** Hover color for dropdown links.
+@dropdown-link-hover-color:      #fff;
+//** Hover background for dropdown links.
+@dropdown-link-hover-bg:         @dropdown-link-active-bg;
+
+//** Active dropdown menu item text color.
+@dropdown-link-active-color:     #fff;
+//** Active dropdown menu item background color.
+@dropdown-link-active-bg:        @component-active-bg;
+
+//** Disabled dropdown menu item background color.
+@dropdown-link-disabled-color:   @text-muted;
+
+//** Text color for headers within dropdown menus.
+@dropdown-header-color:          @text-muted;
+
+//** Deprecated `@dropdown-caret-color` as of v3.1.0
+@dropdown-caret-color:           #000;
+
+
+//-- Z-index master list
+//
+// Warning: Avoid customizing these values. They're used for a bird's eye view
+// of components dependent on the z-axis and are designed to all work together.
+//
+// Note: These variables are not generated into the Customizer.
+
+@zindex-navbar:            1000;
+@zindex-dropdown:          1000;
+@zindex-popover:           1060;
+@zindex-tooltip:           1070;
+@zindex-navbar-fixed:      1030;
+@zindex-modal-background:  1040;
+@zindex-modal:             1050;
+
+
+//== Media queries breakpoints
+//
+//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
+
+// Extra small screen / phone
+//** Deprecated `@screen-xs` as of v3.0.1
+@screen-xs:                  480px;
+//** Deprecated `@screen-xs-min` as of v3.2.0
+@screen-xs-min:              @screen-xs;
+//** Deprecated `@screen-phone` as of v3.0.1
+@screen-phone:               @screen-xs-min;
+
+// Small screen / tablet
+//** Deprecated `@screen-sm` as of v3.0.1
+@screen-sm:                  768px;
+@screen-sm-min:              @screen-sm;
+//** Deprecated `@screen-tablet` as of v3.0.1
+@screen-tablet:              @screen-sm-min;
+
+// Medium screen / desktop
+//** Deprecated `@screen-md` as of v3.0.1
+@screen-md:                  992px;
+@screen-md-min:              @screen-md;
+//** Deprecated `@screen-desktop` as of v3.0.1
+@screen-desktop:             @screen-md-min;
+
+// Large screen / wide desktop
+//** Deprecated `@screen-lg` as of v3.0.1
+@screen-lg:                  1200px;
+@screen-lg-min:              @screen-lg;
+//** Deprecated `@screen-lg-desktop` as of v3.0.1
+@screen-lg-desktop:          @screen-lg-min;
+
+// So media queries don't overlap when required, provide a maximum
+@screen-xs-max:              (@screen-sm-min - 1);
+@screen-sm-max:              (@screen-md-min - 1);
+@screen-md-max:              (@screen-lg-min - 1);
+
+
+//== Grid system
+//
+//## Define your custom responsive grid.
+
+//** Number of columns in the grid.
+@grid-columns:              12;
+//** Padding between columns. Gets divided in half for the left and right.
+@grid-gutter-width:         30px;
+// Navbar collapse
+//** Point at which the navbar becomes uncollapsed.
+@grid-float-breakpoint:     @screen-sm-min;
+//** Point at which the navbar begins collapsing.
+@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);
+
+
+//== Container sizes
+//
+//## Define the maximum width of `.container` for different screen sizes.
+
+// Small screen / tablet
+@container-tablet:             ((720px + @grid-gutter-width));
+//** For `@screen-sm-min` and up.
+@container-sm:                 @container-tablet;
+
+// Medium screen / desktop
+@container-desktop:            ((940px + @grid-gutter-width));
+//** For `@screen-md-min` and up.
+@container-md:                 @container-desktop;
+
+// Large screen / wide desktop
+@container-large-desktop:      ((1140px + @grid-gutter-width));
+//** For `@screen-lg-min` and up.
+@container-lg:                 @container-large-desktop;
+
+
+//== Navbar
+//
+//##
+
+// Basics of a navbar
+@navbar-height:                    50px;
+@navbar-margin-bottom:             @line-height-computed;
+@navbar-border-radius:             @border-radius-base;
+@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));
+@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);
+@navbar-collapse-max-height:       340px;
+
+@navbar-default-color:             @text-color;
+@navbar-default-bg:                @body-bg;
+@navbar-default-border:            @gray-dark;
+
+// Navbar links
+@navbar-default-link-color:                @text-color;
+@navbar-default-link-hover-color:          #fff;
+@navbar-default-link-hover-bg:             transparent;
+@navbar-default-link-active-color:         #fff;
+@navbar-default-link-active-bg:            transparent;
+@navbar-default-link-disabled-color:       @gray-light;
+@navbar-default-link-disabled-bg:          transparent;
+
+// Navbar brand label
+@navbar-default-brand-color:               #fff;
+@navbar-default-brand-hover-color:         #fff;
+@navbar-default-brand-hover-bg:            transparent;
+
+// Navbar toggle
+@navbar-default-toggle-hover-bg:           @gray-dark;
+@navbar-default-toggle-icon-bar-bg:        #ccc;
+@navbar-default-toggle-border-color:       @gray-dark;
+
+
+// Inverted navbar
+// Reset inverted navbar basics
+@navbar-inverse-color:                      @gray-light;
+@navbar-inverse-bg:                         @gray-darker;
+@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);
+
+// Inverted navbar links
+@navbar-inverse-link-color:                 @gray-light;
+@navbar-inverse-link-hover-color:           #fff;
+@navbar-inverse-link-hover-bg:              transparent;
+@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;
+@navbar-inverse-link-active-bg:             transparent;
+@navbar-inverse-link-disabled-color:        #aaa;
+@navbar-inverse-link-disabled-bg:           transparent;
+
+// Inverted navbar brand label
+@navbar-inverse-brand-color:                #fff;
+@navbar-inverse-brand-hover-color:          #fff;
+@navbar-inverse-brand-hover-bg:             transparent;
+
+// Inverted navbar toggle
+@navbar-inverse-toggle-hover-bg:            #333;
+@navbar-inverse-toggle-icon-bar-bg:         #fff;
+@navbar-inverse-toggle-border-color:        #333;
+
+
+//== Navs
+//
+//##
+
+//=== Shared nav styles
+@nav-link-padding:                          10px 15px;
+@nav-link-hover-bg:                         @gray-darker;
+
+@nav-disabled-link-color:                   @gray-light;
+@nav-disabled-link-hover-color:             @gray-light;
+
+@nav-open-link-hover-color:                 @gray-darker;
+
+//== Tabs
+@nav-tabs-border-color:                     @gray-dark;
+
+@nav-tabs-link-hover-border-color:          transparent;
+
+@nav-tabs-active-link-hover-bg:             @brand-primary;
+@nav-tabs-active-link-hover-color:          #fff;
+@nav-tabs-active-link-hover-border-color:   @gray-dark;
+
+@nav-tabs-justified-link-border-color:            #ddd;
+@nav-tabs-justified-active-link-border-color:     @body-bg;
+
+//== Pills
+@nav-pills-border-radius:                   @border-radius-base;
+@nav-pills-active-link-hover-bg:            @component-active-bg;
+@nav-pills-active-link-hover-color:         @component-active-color;
+
+
+//== Pagination
+//
+//##
+
+@pagination-color:                     #fff;
+@pagination-bg:                        @gray-darker;
+@pagination-border:                    @gray-dark;
+
+@pagination-hover-color:               #000;
+@pagination-hover-bg:                  @component-active-bg;
+@pagination-hover-border:              transparent;
+
+@pagination-active-color:              #000;
+@pagination-active-bg:                 @brand-primary;
+@pagination-active-border:             transparent;
+
+@pagination-disabled-color:            @gray-light;
+@pagination-disabled-bg:               @gray-darker;
+@pagination-disabled-border:           @gray-dark;
+
+
+//== Pager
+//
+//##
+
+@pager-bg:                             @pagination-bg;
+@pager-border:                         @pagination-border;
+@pager-border-radius:                  15px;
+
+@pager-hover-bg:                       @pagination-hover-bg;
+
+@pager-active-bg:                      @pagination-active-bg;
+@pager-active-color:                   @pagination-active-color;
+
+@pager-disabled-color:                 @gray-light;
+
+
+//== Jumbotron
+//
+//##
+
+@jumbotron-padding:              30px;
+@jumbotron-color:                inherit;
+@jumbotron-bg:                   darken(@gray-darker, 5%);
+@jumbotron-heading-color:        inherit;
+@jumbotron-font-size:            ceil((@font-size-base * 1.5));
+
+
+//== Form states and alerts
+//
+//## Define colors for form feedback states and, by default, alerts.
+
+@state-success-text:             #000;
+@state-success-bg:               @brand-success;
+@state-success-border:           darken(@state-success-bg, 5%);
+
+@state-info-text:                #000;
+@state-info-bg:                  @brand-info;
+@state-info-border:              darken(@state-info-bg, 7%);
+
+@state-warning-text:             #000;
+@state-warning-bg:               @brand-warning;
+@state-warning-border:           darken(@state-warning-bg, 3%);
+
+@state-danger-text:              #000;
+@state-danger-bg:                @brand-danger;
+@state-danger-border:            darken(@state-danger-bg, 3%);
+
+
+//== Tooltips
+//
+//##
+
+//** Tooltip max width
+@tooltip-max-width:           200px;
+//** Tooltip text color
+@tooltip-color:               #fff;
+//** Tooltip background color
+@tooltip-bg:                  rgba(0,0,0,.9);
+@tooltip-opacity:             .9;
+
+//** Tooltip arrow width
+@tooltip-arrow-width:         5px;
+//** Tooltip arrow color
+@tooltip-arrow-color:         @tooltip-bg;
+
+
+//== Popovers
+//
+//##
+
+//** Popover body background color
+@popover-bg:                          lighten(@body-bg, 10%);
+//** Popover maximum width
+@popover-max-width:                   276px;
+//** Popover border color
+@popover-border-color:                rgba(0,0,0,.2);
+//** Popover fallback border color
+@popover-fallback-border-color:       #999;
+
+//** Popover title background color
+@popover-title-bg:                    darken(@popover-bg, 3%);
+
+//** Popover arrow width
+@popover-arrow-width:                 10px;
+//** Popover arrow color
+@popover-arrow-color:                 @popover-bg;
+
+//** Popover outer arrow width
+@popover-arrow-outer-width:           (@popover-arrow-width + 1);
+//** Popover outer arrow color
+@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);
+//** Popover outer arrow fallback color
+@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);
+
+
+//== Labels
+//
+//##
+
+//** Default label background color
+@label-default-bg:            @btn-default-bg;
+//** Primary label background color
+@label-primary-bg:            @brand-primary;
+//** Success label background color
+@label-success-bg:            @brand-success;
+//** Info label background color
+@label-info-bg:               @brand-info;
+//** Warning label background color
+@label-warning-bg:            @brand-warning;
+//** Danger label background color
+@label-danger-bg:             @brand-danger;
+
+//** Default label text color
+@label-color:                 #fff;
+//** Default text color of a linked label
+@label-link-hover-color:      #fff;
+
+
+//== Modals
+//
+//##
+
+//** Padding applied to the modal body
+@modal-inner-padding:         20px;
+
+//** Padding applied to the modal title
+@modal-title-padding:         15px;
+//** Modal title line-height
+@modal-title-line-height:     @line-height-base;
+
+//** Background color of modal content area
+@modal-content-bg:                             lighten(@body-bg, 10%);
+//** Modal content border color
+@modal-content-border-color:                   rgba(0,0,0,.2);
+//** Modal content border color **for IE8**
+@modal-content-fallback-border-color:          #999;
+
+//** Modal backdrop background color
+@modal-backdrop-bg:           #000;
+//** Modal backdrop opacity
+@modal-backdrop-opacity:      .5;
+//** Modal header border color
+@modal-header-border-color:   @gray-dark;
+//** Modal footer border color
+@modal-footer-border-color:   @modal-header-border-color;
+
+@modal-lg:                    900px;
+@modal-md:                    600px;
+@modal-sm:                    300px;
+
+
+//== Alerts
+//
+//## Define alert colors, border radius, and padding.
+
+@alert-padding:               15px;
+@alert-border-radius:         @border-radius-base;
+@alert-link-font-weight:      bold;
+
+@alert-success-bg:            @state-success-bg;
+@alert-success-text:          @state-success-text;
+@alert-success-border:        @state-success-border;
+
+@alert-info-bg:               @state-info-bg;
+@alert-info-text:             @state-info-text;
+@alert-info-border:           @state-info-border;
+
+@alert-warning-bg:            @state-warning-bg;
+@alert-warning-text:          @state-warning-text;
+@alert-warning-border:        @state-warning-border;
+
+@alert-danger-bg:             @state-danger-bg;
+@alert-danger-text:           @state-danger-text;
+@alert-danger-border:         @state-danger-border;
+
+
+//== Progress bars
+//
+//##
+
+//** Background color of the whole progress component
+@progress-bg:                 @gray-darker;
+//** Progress bar text color
+@progress-bar-color:          #fff;
+
+//** Default progress bar color
+@progress-bar-bg:             @brand-primary;
+//** Success progress bar color
+@progress-bar-success-bg:     @brand-success;
+//** Warning progress bar color
+@progress-bar-warning-bg:     @brand-warning;
+//** Danger progress bar color
+@progress-bar-danger-bg:      @brand-danger;
+//** Info progress bar color
+@progress-bar-info-bg:        @brand-info;
+
+
+//== List group
+//
+//##
+
+//** Background color on `.list-group-item`
+@list-group-bg:                 @gray-darker;
+//** `.list-group-item` border color
+@list-group-border:             @gray-dark;
+//** List group border radius
+@list-group-border-radius:      @border-radius-base;
+
+//** Background color of single list items on hover
+@list-group-hover-bg:           lighten(@list-group-bg, 15%);
+//** Text color of active list items
+@list-group-active-color:       @component-active-color;
+//** Background color of active list items
+@list-group-active-bg:          @component-active-bg;
+//** Border color of active list elements
+@list-group-active-border:      @list-group-active-bg;
+//** Text color for content within active list items
+@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);
+
+//** Text color of disabled list items
+@list-group-disabled-color:      @gray-light;
+//** Background color of disabled list items
+@list-group-disabled-bg:         @gray-lighter;
+//** Text color for content within disabled list items
+@list-group-disabled-text-color: @list-group-disabled-color;
+
+@list-group-link-color:         @text-color;
+@list-group-link-hover-color:   @list-group-link-color;
+@list-group-link-heading-color: #fff;
+
+
+//== Panels
+//
+//##
+
+@panel-bg:                    @gray-darker;
+@panel-body-padding:          15px;
+@panel-heading-padding:       10px 15px;
+@panel-footer-padding:        @panel-heading-padding;
+@panel-border-radius:         @border-radius-base;
+
+//** Border color for elements within panels
+@panel-inner-border:          @gray-dark;
+
+@panel-default-text:          @text-color;
+@panel-default-border:        @panel-inner-border;
+@panel-default-heading-bg:    lighten(@gray-darker, 10%);
+
+@panel-footer-bg:             @panel-default-heading-bg;
+
+@panel-primary-text:          #fff;
+@panel-primary-border:        @brand-primary;
+@panel-primary-heading-bg:    @brand-primary;
+
+@panel-success-text:          @state-success-text;
+@panel-success-border:        @state-success-border;
+@panel-success-heading-bg:    @state-success-bg;
+
+@panel-info-text:             @state-info-text;
+@panel-info-border:           @state-info-border;
+@panel-info-heading-bg:       @state-info-bg;
+
+@panel-warning-text:          @state-warning-text;
+@panel-warning-border:        @state-warning-border;
+@panel-warning-heading-bg:    @state-warning-bg;
+
+@panel-danger-text:           @state-danger-text;
+@panel-danger-border:         @state-danger-border;
+@panel-danger-heading-bg:     @state-danger-bg;
+
+
+//== Thumbnails
+//
+//##
+
+//** Padding around the thumbnail image
+@thumbnail-padding:           4px;
+//** Thumbnail background color
+@thumbnail-bg:                @gray-dark;
+//** Thumbnail border color
+@thumbnail-border:            @gray-dark;
+//** Thumbnail border radius
+@thumbnail-border-radius:     @border-radius-base;
+
+//** Custom text color for thumbnail captions
+@thumbnail-caption-color:     @text-color;
+//** Padding around the thumbnail caption
+@thumbnail-caption-padding:   9px;
+
+
+//== Wells
+//
+//##
+
+@well-bg:                     darken(@gray-darker, 5%);
+@well-border:                 darken(@well-bg, 7%);
+
+
+//== Badges
+//
+//##
+
+@badge-color:                 #000;
+//** Linked badge text color on hover
+@badge-link-hover-color:      #000;
+@badge-bg:                    @brand-primary;
+
+//** Badge text color in active nav link
+@badge-active-color:          @brand-primary;
+//** Badge background color in active nav link
+@badge-active-bg:             #fff;
+
+@badge-font-weight:           bold;
+@badge-line-height:           1;
+@badge-border-radius:         10px;
+
+
+//== Breadcrumbs
+//
+//##
+
+@breadcrumb-padding-vertical:   8px;
+@breadcrumb-padding-horizontal: 15px;
+//** Breadcrumb background color
+@breadcrumb-bg:                 @gray-darker;
+//** Breadcrumb text color
+@breadcrumb-color:              #fff;
+//** Text color of current page in the breadcrumb
+@breadcrumb-active-color:       @text-color;
+//** Textual separator for between breadcrumb elements
+@breadcrumb-separator:          "/";
+
+
+//== Carousel
+//
+//##
+
+@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);
+
+@carousel-control-color:                      #fff;
+@carousel-control-width:                      15%;
+@carousel-control-opacity:                    .5;
+@carousel-control-font-size:                  20px;
+
+@carousel-indicator-active-bg:                #fff;
+@carousel-indicator-border-color:             #fff;
+
+@carousel-caption-color:                      #fff;
+
+
+//== Close
+//
+//##
+
+@close-font-weight:           bold;
+@close-color:                 #000;
+@close-text-shadow:           0 1px 0 #fff;
+
+
+//== Code
+//
+//##
+
+@code-color:                  #c7254e;
+@code-bg:                     #f9f2f4;
+
+@kbd-color:                   #fff;
+@kbd-bg:                      #333;
+
+@pre-bg:                      #f5f5f5;
+@pre-color:                   @gray-dark;
+@pre-border-color:            #ccc;
+@pre-scrollable-max-height:   340px;
+
+
+//== Type
+//
+//##
+
+//** Horizontal offset for forms and lists.
+@component-offset-horizontal: 180px;
+//** Text muted color
+@text-muted:                  @gray-light;
+//** Abbreviations and acronyms border color
+@abbr-border-color:           @gray-light;
+//** Headings small color
+@headings-small-color:        @brand-primary;
+//** Blockquote small color
+@blockquote-small-color:      @gray;
+//** Blockquote font size
+@blockquote-font-size:        (@font-size-base * 1.25);
+//** Blockquote border color
+@blockquote-border-color:     @gray-dark;
+//** Page header border color
+@page-header-border-color:    @gray-dark;
+//** Width of horizontal description list titles
+@dl-horizontal-offset:        @component-offset-horizontal;
+//** Horizontal line color.
+@hr-border:                   @gray-dark;
+
+@import "base";
+
+.messages .text-danger {
+  color: #fff;
+}
+
+.messages .text-info {
+  color: #fff;
+}
+
+.messages .caret {
+  color: #fff;
+}
+
+// Cyborg 3.2.0
+// Bootswatch
+// -----------------------------------------------------
+
+// Navbar =====================================================================
+
+// Buttons ====================================================================
+
+// Typography =================================================================
+
+.text-primary,
+.text-primary:hover {
+  color: @brand-primary;
+}
+
+.text-success,
+.text-success:hover {
+  color: @brand-success;
+}
+
+.text-danger,
+.text-danger:hover {
+  color: @brand-danger;
+}
+
+.text-warning,
+.text-warning:hover {
+  color: @brand-warning;
+}
+
+.text-info,
+.text-info:hover {
+  color: @brand-info;
+}
+
+// Tables =====================================================================
+
+table,
+.table {
+  color: #fff;
+
+  a:not(.btn) {
+    color: #fff;
+    text-decoration: underline;
+  }
+
+  .text-muted {
+    color: @text-muted;
+  }
+}
+
+.table-responsive > .table {
+  background-color: @table-bg;
+}
+
+// Forms ======================================================================
+
+.has-warning {
+  .help-block,
+  .control-label,
+  .form-control-feedback {
+    color: @brand-warning;
+  }
+
+  .form-control,
+  .form-control:focus,
+  .input-group-addon {
+    border-color: @brand-warning;
+  }
+}
+
+.has-error {
+  .help-block,
+  .control-label,
+  .form-control-feedback {
+    color: @brand-danger;
+  }
+
+  .form-control,
+  .form-control:focus,
+  .input-group-addon {
+    border-color: @brand-danger;
+  }
+}
+
+.has-success {
+  .help-block,
+  .control-label,
+  .form-control-feedback {
+    color: @brand-success;
+  }
+
+  .form-control,
+  .form-control:focus,
+  .input-group-addon {
+    border-color: @brand-success;
+  }
+}
+
+.input-group-addon {
+  background-color: @btn-default-bg;
+}
+
+// Navs =======================================================================
+
+.nav-tabs,
+.nav-pills,
+.breadcrumb,
+.pager {
+
+  a {
+    color: #fff;
+  }
+}
+
+// Indicators =================================================================
+
+.alert {
+
+  .alert-link,
+  a {
+    color: @alert-warning-text;
+    text-decoration: underline;
+  }
+
+  .close {
+    text-decoration: none;
+  }
+}
+
+.close {
+  color: #fff;
+  text-decoration: none;
+  opacity: 0.4;
+
+  &:hover,
+  &:focus {
+    color: #fff;
+    opacity: 1;
+  }
+}
+
+// Progress bars ==============================================================
+
+// Containers =================================================================
+
+a.thumbnail:hover,
+a.thumbnail:focus,
+a.thumbnail.active {
+  border-color: @thumbnail-border;
+}
+
+.jumbotron {
+
+  h1, h2, h3, h4, h5, h6 {
+    color: #fff;
+  }
+}
+
+
+// Specials for cccamp19 design
+
+.navbar-brand {
+	.icon-icon_angel {
+	  background-color: @brand-primary;
+  }
+  
+  strong {
+    font-weight: lighter;
+    color: @brand-primary;    
+    text-shadow:
+      0 0 10px @brand-primary,
+      0 0 20px @brand-primary,
+      0 0 30px @brand-primary,
+      0 0 40px @brand-primary,
+      0 0 70px @brand-primary,
+      0 0 80px @brand-primary;
+  }
+}
+
+h1 {
+  font-weight: lighter;
+  color: @brand-primary;
+  text-shadow: 0 0 10px @brand-primary;
+  
+  .icon-icon_angel {
+    background-color: @brand-primary;
+  }
+}
+
+.panel-title {
+  color: #fff;
+}
diff --git a/resources/assets/themes/theme11.less b/resources/assets/themes/theme11.less
new file mode 100644
index 00000000..279f3e13
--- /dev/null
+++ b/resources/assets/themes/theme11.less
@@ -0,0 +1,1049 @@
+@import "../../../node_modules/bootstrap/less/variables";
+
+/*
+The MIT License (MIT)
+
+Copyright (c) 2013 Thomas Park
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+// Cyborg 3.2.0
+// Variables
+// --------------------------------------------------
+
+//== Colors
+//
+//## Gray and brand colors for use across Bootstrap.
+
+@gray-darker:            #222; // #222
+@gray-dark:              #282828;   // #333
+@gray:                   #555; // #555
+@gray-light:             #888;   // #999
+@gray-lighter:           #ADAFAE; // #eee
+
+@brand-primary:         #72abfa;
+@brand-success:         #5cb85c;
+@brand-info:            #5bc0de;
+@brand-warning:         #f0ad4e;
+@brand-danger:          #d9534f;
+
+
+//== Scaffolding
+//
+//## Settings for some of the most global styles.
+
+//** Background color for ``.
+@body-bg:               #000;
+//** Global text color on ``.
+@text-color:            #fff;
+
+//** Global textual link color.
+@link-color:            @brand-primary;
+//** Link hover color set via `darken()` function.
+@link-hover-color:      @link-color;
+
+
+//== Typography
+//
+//## Font, line-height, and color for body text, headings, and more.
+
+@font-family-serif:       Georgia, "Times New Roman", Times, serif;
+//** Default monospace fonts for ``, ``, and `
`.
+@font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace;
+@font-family-base:        @font-family-sans-serif;
+
+@font-size-base:          14px;
+@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px
+@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px
+
+@font-size-h1:            34px;
+@font-size-h2:            24px;
+@font-size-h3:            20px;
+@font-size-h4:            20px;
+@font-size-h5:            20px;
+@font-size-h6:            16px;
+
+//** Unit-less `line-height` for use in components like buttons.
+@line-height-base:        1.428571429; // 20/14
+//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
+@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px
+
+//** By default, this inherits from the ``.
+@headings-font-family:    @font-family-base;
+@headings-font-weight:    500;
+@headings-line-height:    1.1;
+@headings-color:          #fff;
+
+
+//== Iconography
+//
+//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
+
+//** File name for all font files.
+@icon-font-name:          "glyphicons-halflings-regular";
+//** Element ID within SVG icon file.
+@icon-font-svg-id:        "glyphicons_halflingsregular";
+
+
+//== Components
+//
+//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
+
+@padding-base-vertical:     8px;
+@padding-base-horizontal:   12px;
+
+@padding-large-vertical:    14px;
+@padding-large-horizontal:  16px;
+
+@padding-small-vertical:    5px;
+@padding-small-horizontal:  10px;
+
+@padding-xs-vertical:       1px;
+@padding-xs-horizontal:     5px;
+
+@line-height-large:         1.33;
+@line-height-small:         1.5;
+
+@border-radius-base:        4px;
+@border-radius-large:       6px;
+@border-radius-small:       3px;
+
+//** Global color for active items (e.g., navs or dropdowns).
+@component-active-color:    #fff;
+//** Global background color for active items (e.g., navs or dropdowns).
+@component-active-bg:       @brand-primary;
+
+//** Width of the `border` for generating carets that indicator dropdowns.
+@caret-width-base:          4px;
+//** Carets increase slightly in size for larger components.
+@caret-width-large:         5px;
+
+
+//== Tables
+//
+//## Customizes the `.table` component with basic values, each used across all table variations.
+
+//** Padding for ``s and ``s.
+@table-cell-padding:            8px;
+//** Padding for cells in `.table-condensed`.
+@table-condensed-cell-padding:  5px;
+
+//** Default background color used for all tables.
+@table-bg:                      darken(@gray-darker, 4%);
+//** Background color used for `.table-striped`.
+@table-bg-accent:               darken(@table-bg, 6%);
+//** Background color used for `.table-hover`.
+@table-bg-hover:                @gray-dark;
+@table-bg-active:               @table-bg-hover;
+
+//** Border color for table and cell borders.
+@table-border-color:            @gray-dark;
+
+
+//== Buttons
+//
+//## For each of Bootstrap's buttons, define text, background and border color.
+
+@btn-font-weight:                normal;
+
+@btn-default-color:              #fff;
+@btn-default-bg:                 lighten(@gray-dark, 10%);
+
+@btn-default-border:             darken(@btn-default-bg, 10%);
+
+@btn-primary-color:              #000;
+@btn-primary-bg:                 @brand-primary;
+@btn-primary-border:             darken(@btn-default-bg, 10%);
+
+@btn-success-color:              #000;
+@btn-success-bg:                 @brand-success;
+@btn-success-border:             darken(@btn-default-bg, 10%);
+
+@btn-info-color:                 #000;
+@btn-info-bg:                    @brand-info;
+@btn-info-border:                darken(@btn-default-bg, 10%);
+
+@btn-warning-color:              #000;
+@btn-warning-bg:                 @brand-warning;
+@btn-warning-border:             darken(@btn-default-bg, 10%);
+
+@btn-danger-color:               #000;
+@btn-danger-bg:                  @brand-danger;
+@btn-danger-border:              darken(@btn-default-bg, 10%);
+
+@btn-link-disabled-color:        @gray-light;
+
+
+//== Forms
+//
+//##
+
+//** `` background color
+@input-bg:                       @gray-darker;
+//** `` background color
+@input-bg-disabled:              @gray-lighter;
+
+//** Text color for ``s
+@input-color:                    @text-color;
+//** `` border color
+@input-border:                   @gray-dark;
+//** `` border radius
+@input-border-radius:            @border-radius-base;
+//** Border color for inputs on focus
+@input-border-focus:             #66afe9;
+
+//** Placeholder text color
+@input-color-placeholder:        @gray-light;
+
+//** Default `.form-control` height
+@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);
+//** Large `.form-control` height
+@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);
+//** Small `.form-control` height
+@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);
+
+@legend-color:                   @text-color;
+@legend-border-color:            @gray-dark;
+
+//** Background color for textual input addons
+@input-group-addon-bg:           @gray-lighter;
+//** Border color for textual input addons
+@input-group-addon-border-color: @input-border;
+
+
+//== Dropdowns
+//
+//## Dropdown menu container and contents.
+
+//** Background for the dropdown menu.
+@dropdown-bg:                    @gray-darker;
+//** Dropdown menu `border-color`.
+@dropdown-border:                rgba(255,255,255,0.1);
+//** Dropdown menu `border-color` **for IE8**.
+@dropdown-fallback-border:       #444;
+//** Divider color for between dropdown items.
+@dropdown-divider-bg:            rgba(255,255,255,0.1);
+
+//** Dropdown link text color.
+@dropdown-link-color:            #fff;
+//** Hover color for dropdown links.
+@dropdown-link-hover-color:      #fff;
+//** Hover background for dropdown links.
+@dropdown-link-hover-bg:         @dropdown-link-active-bg;
+
+//** Active dropdown menu item text color.
+@dropdown-link-active-color:     #fff;
+//** Active dropdown menu item background color.
+@dropdown-link-active-bg:        @component-active-bg;
+
+//** Disabled dropdown menu item background color.
+@dropdown-link-disabled-color:   @text-muted;
+
+//** Text color for headers within dropdown menus.
+@dropdown-header-color:          @text-muted;
+
+//** Deprecated `@dropdown-caret-color` as of v3.1.0
+@dropdown-caret-color:           #000;
+
+
+//-- Z-index master list
+//
+// Warning: Avoid customizing these values. They're used for a bird's eye view
+// of components dependent on the z-axis and are designed to all work together.
+//
+// Note: These variables are not generated into the Customizer.
+
+@zindex-navbar:            1000;
+@zindex-dropdown:          1000;
+@zindex-popover:           1060;
+@zindex-tooltip:           1070;
+@zindex-navbar-fixed:      1030;
+@zindex-modal-background:  1040;
+@zindex-modal:             1050;
+
+
+//== Media queries breakpoints
+//
+//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
+
+// Extra small screen / phone
+//** Deprecated `@screen-xs` as of v3.0.1
+@screen-xs:                  480px;
+//** Deprecated `@screen-xs-min` as of v3.2.0
+@screen-xs-min:              @screen-xs;
+//** Deprecated `@screen-phone` as of v3.0.1
+@screen-phone:               @screen-xs-min;
+
+// Small screen / tablet
+//** Deprecated `@screen-sm` as of v3.0.1
+@screen-sm:                  768px;
+@screen-sm-min:              @screen-sm;
+//** Deprecated `@screen-tablet` as of v3.0.1
+@screen-tablet:              @screen-sm-min;
+
+// Medium screen / desktop
+//** Deprecated `@screen-md` as of v3.0.1
+@screen-md:                  992px;
+@screen-md-min:              @screen-md;
+//** Deprecated `@screen-desktop` as of v3.0.1
+@screen-desktop:             @screen-md-min;
+
+// Large screen / wide desktop
+//** Deprecated `@screen-lg` as of v3.0.1
+@screen-lg:                  1200px;
+@screen-lg-min:              @screen-lg;
+//** Deprecated `@screen-lg-desktop` as of v3.0.1
+@screen-lg-desktop:          @screen-lg-min;
+
+// So media queries don't overlap when required, provide a maximum
+@screen-xs-max:              (@screen-sm-min - 1);
+@screen-sm-max:              (@screen-md-min - 1);
+@screen-md-max:              (@screen-lg-min - 1);
+
+
+//== Grid system
+//
+//## Define your custom responsive grid.
+
+//** Number of columns in the grid.
+@grid-columns:              12;
+//** Padding between columns. Gets divided in half for the left and right.
+@grid-gutter-width:         30px;
+// Navbar collapse
+//** Point at which the navbar becomes uncollapsed.
+@grid-float-breakpoint:     @screen-sm-min;
+//** Point at which the navbar begins collapsing.
+@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);
+
+
+//== Container sizes
+//
+//## Define the maximum width of `.container` for different screen sizes.
+
+// Small screen / tablet
+@container-tablet:             ((720px + @grid-gutter-width));
+//** For `@screen-sm-min` and up.
+@container-sm:                 @container-tablet;
+
+// Medium screen / desktop
+@container-desktop:            ((940px + @grid-gutter-width));
+//** For `@screen-md-min` and up.
+@container-md:                 @container-desktop;
+
+// Large screen / wide desktop
+@container-large-desktop:      ((1140px + @grid-gutter-width));
+//** For `@screen-lg-min` and up.
+@container-lg:                 @container-large-desktop;
+
+
+//== Navbar
+//
+//##
+
+// Basics of a navbar
+@navbar-height:                    50px;
+@navbar-margin-bottom:             @line-height-computed;
+@navbar-border-radius:             @border-radius-base;
+@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));
+@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);
+@navbar-collapse-max-height:       340px;
+
+@navbar-default-color:             @text-color;
+@navbar-default-bg:                @body-bg;
+@navbar-default-border:            @gray-dark;
+
+// Navbar links
+@navbar-default-link-color:                @text-color;
+@navbar-default-link-hover-color:          #fff;
+@navbar-default-link-hover-bg:             transparent;
+@navbar-default-link-active-color:         #fff;
+@navbar-default-link-active-bg:            transparent;
+@navbar-default-link-disabled-color:       @gray-light;
+@navbar-default-link-disabled-bg:          transparent;
+
+// Navbar brand label
+@navbar-default-brand-color:               #fff;
+@navbar-default-brand-hover-color:         #fff;
+@navbar-default-brand-hover-bg:            transparent;
+
+// Navbar toggle
+@navbar-default-toggle-hover-bg:           @gray-dark;
+@navbar-default-toggle-icon-bar-bg:        #ccc;
+@navbar-default-toggle-border-color:       @gray-dark;
+
+
+// Inverted navbar
+// Reset inverted navbar basics
+@navbar-inverse-color:                      @gray-light;
+@navbar-inverse-bg:                         @gray-darker;
+@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);
+
+// Inverted navbar links
+@navbar-inverse-link-color:                 @gray-light;
+@navbar-inverse-link-hover-color:           #fff;
+@navbar-inverse-link-hover-bg:              transparent;
+@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;
+@navbar-inverse-link-active-bg:             transparent;
+@navbar-inverse-link-disabled-color:        #aaa;
+@navbar-inverse-link-disabled-bg:           transparent;
+
+// Inverted navbar brand label
+@navbar-inverse-brand-color:                #fff;
+@navbar-inverse-brand-hover-color:          #fff;
+@navbar-inverse-brand-hover-bg:             transparent;
+
+// Inverted navbar toggle
+@navbar-inverse-toggle-hover-bg:            #333;
+@navbar-inverse-toggle-icon-bar-bg:         #fff;
+@navbar-inverse-toggle-border-color:        #333;
+
+
+//== Navs
+//
+//##
+
+//=== Shared nav styles
+@nav-link-padding:                          10px 15px;
+@nav-link-hover-bg:                         @gray-darker;
+
+@nav-disabled-link-color:                   @gray-light;
+@nav-disabled-link-hover-color:             @gray-light;
+
+@nav-open-link-hover-color:                 @gray-darker;
+
+//== Tabs
+@nav-tabs-border-color:                     @gray-dark;
+
+@nav-tabs-link-hover-border-color:          transparent;
+
+@nav-tabs-active-link-hover-bg:             @brand-primary;
+@nav-tabs-active-link-hover-color:          #fff;
+@nav-tabs-active-link-hover-border-color:   @gray-dark;
+
+@nav-tabs-justified-link-border-color:            #ddd;
+@nav-tabs-justified-active-link-border-color:     @body-bg;
+
+//== Pills
+@nav-pills-border-radius:                   @border-radius-base;
+@nav-pills-active-link-hover-bg:            @component-active-bg;
+@nav-pills-active-link-hover-color:         @component-active-color;
+
+
+//== Pagination
+//
+//##
+
+@pagination-color:                     #fff;
+@pagination-bg:                        @gray-darker;
+@pagination-border:                    @gray-dark;
+
+@pagination-hover-color:               #fff;
+@pagination-hover-bg:                  @component-active-bg;
+@pagination-hover-border:              transparent;
+
+@pagination-active-color:              #000;
+@pagination-active-bg:                 @brand-primary;
+@pagination-active-border:             transparent;
+
+@pagination-disabled-color:            @gray-light;
+@pagination-disabled-bg:               @gray-darker;
+@pagination-disabled-border:           @gray-dark;
+
+
+//== Pager
+//
+//##
+
+@pager-bg:                             @pagination-bg;
+@pager-border:                         @pagination-border;
+@pager-border-radius:                  15px;
+
+@pager-hover-bg:                       @pagination-hover-bg;
+
+@pager-active-bg:                      @pagination-active-bg;
+@pager-active-color:                   @pagination-active-color;
+
+@pager-disabled-color:                 @gray-light;
+
+
+//== Jumbotron
+//
+//##
+
+@jumbotron-padding:              30px;
+@jumbotron-color:                inherit;
+@jumbotron-bg:                   darken(@gray-darker, 5%);
+@jumbotron-heading-color:        inherit;
+@jumbotron-font-size:            ceil((@font-size-base * 1.5));
+
+
+//== Form states and alerts
+//
+//## Define colors for form feedback states and, by default, alerts.
+
+@state-success-text:             #000;
+@state-success-bg:               @brand-success;
+@state-success-border:           darken(@state-success-bg, 5%);
+
+@state-info-text:                #000;
+@state-info-bg:                  @brand-info;
+@state-info-border:              darken(@state-info-bg, 7%);
+
+@state-warning-text:             #000;
+@state-warning-bg:               @brand-warning;
+@state-warning-border:           darken(@state-warning-bg, 3%);
+
+@state-danger-text:              #000;
+@state-danger-bg:                @brand-danger;
+@state-danger-border:            darken(@state-danger-bg, 3%);
+
+
+//== Tooltips
+//
+//##
+
+//** Tooltip max width
+@tooltip-max-width:           200px;
+//** Tooltip text color
+@tooltip-color:               #fff;
+//** Tooltip background color
+@tooltip-bg:                  rgba(0,0,0,.9);
+@tooltip-opacity:             .9;
+
+//** Tooltip arrow width
+@tooltip-arrow-width:         5px;
+//** Tooltip arrow color
+@tooltip-arrow-color:         @tooltip-bg;
+
+
+//== Popovers
+//
+//##
+
+//** Popover body background color
+@popover-bg:                          lighten(@body-bg, 10%);
+//** Popover maximum width
+@popover-max-width:                   276px;
+//** Popover border color
+@popover-border-color:                rgba(0,0,0,.2);
+//** Popover fallback border color
+@popover-fallback-border-color:       #999;
+
+//** Popover title background color
+@popover-title-bg:                    darken(@popover-bg, 3%);
+
+//** Popover arrow width
+@popover-arrow-width:                 10px;
+//** Popover arrow color
+@popover-arrow-color:                 @popover-bg;
+
+//** Popover outer arrow width
+@popover-arrow-outer-width:           (@popover-arrow-width + 1);
+//** Popover outer arrow color
+@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);
+//** Popover outer arrow fallback color
+@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);
+
+
+//== Labels
+//
+//##
+
+//** Default label background color
+@label-default-bg:            lighten(@btn-default-bg, 20%);
+//** Primary label background color
+@label-primary-bg:            @brand-primary;
+//** Success label background color
+@label-success-bg:            @brand-success;
+//** Info label background color
+@label-info-bg:               @brand-info;
+//** Warning label background color
+@label-warning-bg:            @brand-warning;
+//** Danger label background color
+@label-danger-bg:             @brand-danger;
+
+//** Default label text color
+@label-color:                 #000;
+//** Default text color of a linked label
+@label-link-hover-color:      #000;
+
+
+//== Modals
+//
+//##
+
+//** Padding applied to the modal body
+@modal-inner-padding:         20px;
+
+//** Padding applied to the modal title
+@modal-title-padding:         15px;
+//** Modal title line-height
+@modal-title-line-height:     @line-height-base;
+
+//** Background color of modal content area
+@modal-content-bg:                             lighten(@body-bg, 10%);
+//** Modal content border color
+@modal-content-border-color:                   rgba(0,0,0,.2);
+//** Modal content border color **for IE8**
+@modal-content-fallback-border-color:          #999;
+
+//** Modal backdrop background color
+@modal-backdrop-bg:           #000;
+//** Modal backdrop opacity
+@modal-backdrop-opacity:      .5;
+//** Modal header border color
+@modal-header-border-color:   @gray-dark;
+//** Modal footer border color
+@modal-footer-border-color:   @modal-header-border-color;
+
+@modal-lg:                    900px;
+@modal-md:                    600px;
+@modal-sm:                    300px;
+
+
+//== Alerts
+//
+//## Define alert colors, border radius, and padding.
+
+@alert-padding:               15px;
+@alert-border-radius:         @border-radius-base;
+@alert-link-font-weight:      bold;
+
+@alert-success-bg:            @state-success-bg;
+@alert-success-text:          @state-success-text;
+@alert-success-border:        @state-success-border;
+
+@alert-info-bg:               @state-info-bg;
+@alert-info-text:             @state-info-text;
+@alert-info-border:           @state-info-border;
+
+@alert-warning-bg:            @state-warning-bg;
+@alert-warning-text:          @state-warning-text;
+@alert-warning-border:        @state-warning-border;
+
+@alert-danger-bg:             @state-danger-bg;
+@alert-danger-text:           @state-danger-text;
+@alert-danger-border:         @state-danger-border;
+
+
+//== Progress bars
+//
+//##
+
+//** Background color of the whole progress component
+@progress-bg:                 @gray-darker;
+//** Progress bar text color
+@progress-bar-color:          #fff;
+
+//** Default progress bar color
+@progress-bar-bg:             @brand-primary;
+//** Success progress bar color
+@progress-bar-success-bg:     @brand-success;
+//** Warning progress bar color
+@progress-bar-warning-bg:     @brand-warning;
+//** Danger progress bar color
+@progress-bar-danger-bg:      @brand-danger;
+//** Info progress bar color
+@progress-bar-info-bg:        @brand-info;
+
+
+//== List group
+//
+//##
+
+//** Background color on `.list-group-item`
+@list-group-bg:                 @gray-darker;
+//** `.list-group-item` border color
+@list-group-border:             @gray-dark;
+//** List group border radius
+@list-group-border-radius:      @border-radius-base;
+
+//** Background color of single list items on hover
+@list-group-hover-bg:           lighten(@list-group-bg, 15%);
+//** Text color of active list items
+@list-group-active-color:       @component-active-color;
+//** Background color of active list items
+@list-group-active-bg:          @component-active-bg;
+//** Border color of active list elements
+@list-group-active-border:      @list-group-active-bg;
+//** Text color for content within active list items
+@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);
+
+//** Text color of disabled list items
+@list-group-disabled-color:      @gray-light;
+//** Background color of disabled list items
+@list-group-disabled-bg:         @gray-lighter;
+//** Text color for content within disabled list items
+@list-group-disabled-text-color: @list-group-disabled-color;
+
+@list-group-link-color:         @text-color;
+@list-group-link-hover-color:   @list-group-link-color;
+@list-group-link-heading-color: #fff;
+
+
+//== Panels
+//
+//##
+
+@panel-bg:                    @gray-darker;
+@panel-body-padding:          15px;
+@panel-heading-padding:       10px 15px;
+@panel-footer-padding:        @panel-heading-padding;
+@panel-border-radius:         @border-radius-base;
+
+//** Border color for elements within panels
+@panel-inner-border:          @gray-dark;
+
+@panel-default-text:          @text-color;
+@panel-default-border:        @panel-inner-border;
+@panel-default-heading-bg:    lighten(@gray-darker, 10%);
+
+@panel-footer-bg:             @panel-default-heading-bg;
+
+@panel-primary-text:          #fff;
+@panel-primary-border:        @brand-primary;
+@panel-primary-heading-bg:    @brand-primary;
+
+@panel-success-text:          @state-success-text;
+@panel-success-border:        @state-success-border;
+@panel-success-heading-bg:    @state-success-bg;
+
+@panel-info-text:             @state-info-text;
+@panel-info-border:           @state-info-border;
+@panel-info-heading-bg:       @state-info-bg;
+
+@panel-warning-text:          @state-warning-text;
+@panel-warning-border:        @state-warning-border;
+@panel-warning-heading-bg:    @state-warning-bg;
+
+@panel-danger-text:           @state-danger-text;
+@panel-danger-border:         @state-danger-border;
+@panel-danger-heading-bg:     @state-danger-bg;
+
+
+//== Thumbnails
+//
+//##
+
+//** Padding around the thumbnail image
+@thumbnail-padding:           4px;
+//** Thumbnail background color
+@thumbnail-bg:                @gray-dark;
+//** Thumbnail border color
+@thumbnail-border:            @gray-dark;
+//** Thumbnail border radius
+@thumbnail-border-radius:     @border-radius-base;
+
+//** Custom text color for thumbnail captions
+@thumbnail-caption-color:     @text-color;
+//** Padding around the thumbnail caption
+@thumbnail-caption-padding:   9px;
+
+
+//== Wells
+//
+//##
+
+@well-bg:                     darken(@gray-darker, 5%);
+@well-border:                 darken(@well-bg, 7%);
+
+
+//== Badges
+//
+//##
+
+@badge-color:                 #000;
+//** Linked badge text color on hover
+@badge-link-hover-color:      #fff;
+@badge-bg:                    @brand-primary;
+
+//** Badge text color in active nav link
+@badge-active-color:          @brand-primary;
+//** Badge background color in active nav link
+@badge-active-bg:             #fff;
+
+@badge-font-weight:           bold;
+@badge-line-height:           1;
+@badge-border-radius:         10px;
+
+
+//== Breadcrumbs
+//
+//##
+
+@breadcrumb-padding-vertical:   8px;
+@breadcrumb-padding-horizontal: 15px;
+//** Breadcrumb background color
+@breadcrumb-bg:                 @gray-darker;
+//** Breadcrumb text color
+@breadcrumb-color:              #fff;
+//** Text color of current page in the breadcrumb
+@breadcrumb-active-color:       @text-color;
+//** Textual separator for between breadcrumb elements
+@breadcrumb-separator:          "/";
+
+
+//== Carousel
+//
+//##
+
+@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);
+
+@carousel-control-color:                      #fff;
+@carousel-control-width:                      15%;
+@carousel-control-opacity:                    .5;
+@carousel-control-font-size:                  20px;
+
+@carousel-indicator-active-bg:                #fff;
+@carousel-indicator-border-color:             #fff;
+
+@carousel-caption-color:                      #fff;
+
+
+//== Close
+//
+//##
+
+@close-font-weight:           bold;
+@close-color:                 #000;
+@close-text-shadow:           0 1px 0 #fff;
+
+
+//== Code
+//
+//##
+
+@code-color:                  #c7254e;
+@code-bg:                     #f9f2f4;
+
+@kbd-color:                   #fff;
+@kbd-bg:                      #333;
+
+@pre-bg:                      #f5f5f5;
+@pre-color:                   @gray-dark;
+@pre-border-color:            #ccc;
+@pre-scrollable-max-height:   340px;
+
+
+//== Type
+//
+//##
+
+//** Horizontal offset for forms and lists.
+@component-offset-horizontal: 180px;
+//** Text muted color
+@text-muted:                  @gray-lighter;
+//** Abbreviations and acronyms border color
+@abbr-border-color:           @gray-lighter;
+//** Headings small color
+@headings-small-color:        @gray-lighter;
+//** Blockquote small color
+@blockquote-small-color:      @gray;
+//** Blockquote font size
+@blockquote-font-size:        (@font-size-base * 1.25);
+//** Blockquote border color
+@blockquote-border-color:     @gray-dark;
+//** Page header border color
+@page-header-border-color:    @gray-dark;
+//** Width of horizontal description list titles
+@dl-horizontal-offset:        @component-offset-horizontal;
+//** Horizontal line color.
+@hr-border:                   @gray-dark;
+
+@import "base";
+
+.messages .text-danger {
+  color: #fff;
+}
+
+.messages .text-info {
+  color: #fff;
+}
+
+.messages .caret {
+  color: #fff;
+}
+
+// Cyborg 3.2.0
+// Bootswatch
+// -----------------------------------------------------
+
+// Navbar =====================================================================
+
+// Buttons ====================================================================
+
+// Typography =================================================================
+
+.text-primary,
+.text-primary:hover {
+  color: @brand-primary;
+}
+
+.text-success,
+.text-success:hover {
+  color: @brand-success;
+}
+
+.text-danger,
+.text-danger:hover {
+  color: lighten(@brand-danger, 10%);
+}
+
+.text-warning,
+.text-warning:hover {
+  color: @brand-warning;
+}
+
+.text-info,
+.text-info:hover {
+  color: @brand-info;
+}
+
+// Tables =====================================================================
+
+table,
+.table {
+  color: #fff;
+
+  a:not(.btn) {
+    color: #fff;
+    text-decoration: underline;
+  }
+
+  .text-muted {
+    color: @text-muted;
+  }
+}
+
+.table-responsive > .table {
+  background-color: @table-bg;
+}
+
+// Forms ======================================================================
+
+.has-warning {
+  .help-block,
+  .control-label,
+  .form-control-feedback {
+    color: @brand-warning;
+  }
+
+  .form-control,
+  .form-control:focus,
+  .input-group-addon {
+    border-color: @brand-warning;
+  }
+}
+
+.has-error {
+  .help-block,
+  .control-label,
+  .form-control-feedback {
+    color: @brand-danger;
+  }
+
+  .form-control,
+  .form-control:focus,
+  .input-group-addon {
+    border-color: @brand-danger;
+  }
+}
+
+.has-success {
+  .help-block,
+  .control-label,
+  .form-control-feedback {
+    color: @brand-success;
+  }
+
+  .form-control,
+  .form-control:focus,
+  .input-group-addon {
+    border-color: @brand-success;
+  }
+}
+
+.legend {
+  margin-top: 20px;
+}
+
+.input-group-addon {
+  background-color: @btn-default-bg;
+}
+
+// Navs =======================================================================
+
+.nav-tabs,
+.nav-pills,
+.breadcrumb,
+.pager {
+
+  a {
+    color: #fff;
+  }
+}
+
+// Indicators =================================================================
+
+.alert {
+
+  .alert-link,
+  a {
+    color: @alert-warning-text;
+    text-decoration: underline;
+  }
+
+  .close {
+    text-decoration: none;
+  }
+}
+
+.close {
+  color: #fff;
+  text-decoration: none;
+  opacity: 0.4;
+
+  &:hover,
+  &:focus {
+    color: #fff;
+    opacity: 1;
+  }
+}
+
+// Progress bars ==============================================================
+
+// Containers =================================================================
+
+a.thumbnail:hover,
+a.thumbnail:focus,
+a.thumbnail.active {
+  border-color: @thumbnail-border;
+}
+
+.jumbotron {
+
+  h1, h2, h3, h4, h5, h6 {
+    color: #fff;
+  }
+}
+
+.panel-info .panel-title {
+	color: #000;
+}
diff --git a/resources/assets/themes/theme4.less b/resources/assets/themes/theme4.less
index d0a5f948..d8e0276f 100644
--- a/resources/assets/themes/theme4.less
+++ b/resources/assets/themes/theme4.less
@@ -980,10 +980,6 @@ table,
   }
 }
 
-legend {
-  color: #fff;
-}
-
 .input-group-addon {
   background-color: @btn-default-bg;
 }
diff --git a/resources/assets/themes/theme6.less b/resources/assets/themes/theme6.less
index 71dcbfd8..ed35c12b 100644
--- a/resources/assets/themes/theme6.less
+++ b/resources/assets/themes/theme6.less
@@ -993,10 +993,6 @@ table,
   }
 }
 
-legend {
-  color: #fff;
-}
-
 .input-group-addon {
   background-color: @btn-default-bg;
 }
diff --git a/resources/assets/themes/theme7.less b/resources/assets/themes/theme7.less
index 26afeb8c..fa01a856 100644
--- a/resources/assets/themes/theme7.less
+++ b/resources/assets/themes/theme7.less
@@ -993,10 +993,6 @@ table,
   }
 }
 
-legend {
-  color: @gray-darker;
-}
-
 .input-group-addon {
   background-color: @btn-default-bg;
 }
diff --git a/resources/assets/themes/theme8.less b/resources/assets/themes/theme8.less
index 22887dab..b6d2d5c3 100644
--- a/resources/assets/themes/theme8.less
+++ b/resources/assets/themes/theme8.less
@@ -40,7 +40,7 @@ THE SOFTWARE.
 
 @brand-primary:         #0076ba;
 @brand-success:         #99ba00;
-@brand-info:            #ffc600;
+@brand-info:            #0076ba;
 @brand-warning:         #ffc600;
 @brand-danger:          #d9534f;
 
@@ -164,7 +164,7 @@ THE SOFTWARE.
 @btn-font-weight:                normal;
 
 @btn-default-color:              #000;
-@btn-default-bg:                 @gray;
+@btn-default-bg:                 @gray-light;
 
 @btn-default-border:             darken(@btn-default-bg, 10%);
 
@@ -454,11 +454,11 @@ THE SOFTWARE.
 @pagination-bg:                        @gray-darker;
 @pagination-border:                    @gray-dark;
 
-@pagination-hover-color:               #fff;
+@pagination-hover-color:               #000;
 @pagination-hover-bg:                  @component-active-bg;
 @pagination-hover-border:              transparent;
 
-@pagination-active-color:              #fff;
+@pagination-active-color:              #000;
 @pagination-active-bg:                 @brand-primary;
 @pagination-active-border:             transparent;
 
@@ -769,9 +769,9 @@ THE SOFTWARE.
 //
 //##
 
-@badge-color:                 #fff;
+@badge-color:                 #000;
 //** Linked badge text color on hover
-@badge-link-hover-color:      #fff;
+@badge-link-hover-color:      #000;
 @badge-bg:                    @brand-primary;
 
 //** Badge text color in active nav link
@@ -853,7 +853,7 @@ THE SOFTWARE.
 //** Abbreviations and acronyms border color
 @abbr-border-color:           @gray-light;
 //** Headings small color
-@headings-small-color:        @gray-light;
+@headings-small-color:        @brand-primary;
 //** Blockquote small color
 @blockquote-small-color:      @gray;
 //** Blockquote font size
@@ -980,10 +980,6 @@ table,
   }
 }
 
-legend {
-  color: #fff;
-}
-
 .input-group-addon {
   background-color: @btn-default-bg;
 }
@@ -1054,8 +1050,14 @@ a.thumbnail.active {
   
   strong {
     font-weight: lighter;
-    color: @brand-primary;
-    text-shadow: 0 0 10px @brand-primary;
+    color: @brand-primary;  
+    text-shadow:
+      0 0 10px @brand-primary,
+      0 0 20px @brand-primary,
+      0 0 30px @brand-primary,
+      0 0 40px @brand-primary,
+      0 0 70px @brand-primary,
+      0 0 80px @brand-primary;
   }
 }
 
@@ -1063,4 +1065,12 @@ h1 {
   font-weight: lighter;
   color: @brand-primary;
   text-shadow: 0 0 10px @brand-primary;
+  
+  .icon-icon_angel {
+    background-color: @brand-primary;
+  }
+}
+
+.panel-title {
+	color: #fff;
 }
diff --git a/resources/assets/themes/theme9.less b/resources/assets/themes/theme9.less
new file mode 100644
index 00000000..da2713fb
--- /dev/null
+++ b/resources/assets/themes/theme9.less
@@ -0,0 +1,1076 @@
+@import "../../../node_modules/bootstrap/less/variables";
+
+/*
+The MIT License (MIT)
+
+Copyright (c) 2013 Thomas Park
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+// Cyborg 3.2.0
+// Variables
+// --------------------------------------------------
+
+//== Colors
+//
+//## Gray and brand colors for use across Bootstrap.
+
+@gray-darker:            #222; // #222
+@gray-dark:              #282828;   // #333
+@gray:                   #555; // #555
+@gray-light:             #888;   // #999
+@gray-lighter:           #ADAFAE; // #eee
+
+@brand-primary:         #ffc600;
+@brand-success:         #99ba00;
+@brand-info:            #0076ba;
+@brand-warning:         #ffc600;
+@brand-danger:          #d9534f;
+
+
+//== Scaffolding
+//
+//## Settings for some of the most global styles.
+
+//** Background color for ``.
+@body-bg:               #060606;
+//** Global text color on ``.
+@text-color:            @gray-light;
+
+//** Global textual link color.
+@link-color:            @brand-primary;
+//** Link hover color set via `darken()` function.
+@link-hover-color:      @link-color;
+
+
+//== Typography
+//
+//## Font, line-height, and color for body text, headings, and more.
+
+@font-family-serif:       Georgia, "Times New Roman", Times, serif;
+//** Default monospace fonts for ``, ``, and `
`.
+@font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace;
+@font-family-base:        @font-family-sans-serif;
+
+@font-size-base:          14px;
+@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px
+@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px
+
+@font-size-h1:            34px;
+@font-size-h2:            24px;
+@font-size-h3:            20px;
+@font-size-h4:            20px;
+@font-size-h5:            20px;
+@font-size-h6:            16px;
+
+//** Unit-less `line-height` for use in components like buttons.
+@line-height-base:        1.428571429; // 20/14
+//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
+@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px
+
+//** By default, this inherits from the ``.
+@headings-font-family:    @font-family-base;
+@headings-font-weight:    500;
+@headings-line-height:    1.1;
+@headings-color:          #fff;
+
+
+//== Iconography
+//
+//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
+
+//** File name for all font files.
+@icon-font-name:          "glyphicons-halflings-regular";
+//** Element ID within SVG icon file.
+@icon-font-svg-id:        "glyphicons_halflingsregular";
+
+
+//== Components
+//
+//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
+
+@padding-base-vertical:     8px;
+@padding-base-horizontal:   12px;
+
+@padding-large-vertical:    14px;
+@padding-large-horizontal:  16px;
+
+@padding-small-vertical:    5px;
+@padding-small-horizontal:  10px;
+
+@padding-xs-vertical:       1px;
+@padding-xs-horizontal:     5px;
+
+@line-height-large:         1.33;
+@line-height-small:         1.5;
+
+@border-radius-base:        4px;
+@border-radius-large:       6px;
+@border-radius-small:       3px;
+
+//** Global color for active items (e.g., navs or dropdowns).
+@component-active-color:    #fff;
+//** Global background color for active items (e.g., navs or dropdowns).
+@component-active-bg:       @brand-primary;
+
+//** Width of the `border` for generating carets that indicator dropdowns.
+@caret-width-base:          4px;
+//** Carets increase slightly in size for larger components.
+@caret-width-large:         5px;
+
+
+//== Tables
+//
+//## Customizes the `.table` component with basic values, each used across all table variations.
+
+//** Padding for ``s and ``s.
+@table-cell-padding:            8px;
+//** Padding for cells in `.table-condensed`.
+@table-condensed-cell-padding:  5px;
+
+//** Default background color used for all tables.
+@table-bg:                      darken(@gray-darker, 4%);
+//** Background color used for `.table-striped`.
+@table-bg-accent:               darken(@table-bg, 6%);
+//** Background color used for `.table-hover`.
+@table-bg-hover:                @gray-dark;
+@table-bg-active:               @table-bg-hover;
+
+//** Border color for table and cell borders.
+@table-border-color:            @gray-dark;
+
+
+//== Buttons
+//
+//## For each of Bootstrap's buttons, define text, background and border color.
+
+@btn-font-weight:                normal;
+
+@btn-default-color:              #000;
+@btn-default-bg:                 @gray-light;
+
+@btn-default-border:             darken(@btn-default-bg, 10%);
+
+@btn-primary-color:              @btn-default-color;
+@btn-primary-bg:                 @brand-primary;
+@btn-primary-border:             darken(@btn-default-bg, 10%);
+
+@btn-success-color:              @btn-default-color;
+@btn-success-bg:                 @brand-success;
+@btn-success-border:             darken(@btn-default-bg, 10%);
+
+@btn-info-color:                 @btn-default-color;
+@btn-info-bg:                    @brand-info;
+@btn-info-border:                darken(@btn-default-bg, 10%);
+
+@btn-warning-color:              @btn-default-color;
+@btn-warning-bg:                 @brand-warning;
+@btn-warning-border:             darken(@btn-default-bg, 10%);
+
+@btn-danger-color:               @btn-default-color;
+@btn-danger-bg:                  @brand-danger;
+@btn-danger-border:              darken(@btn-default-bg, 10%);
+
+@btn-link-disabled-color:        @gray-light;
+
+
+//== Forms
+//
+//##
+
+//** `` background color
+@input-bg:                       @gray-darker;
+//** `` background color
+@input-bg-disabled:              @gray-dark;
+
+//** Text color for ``s
+@input-color:                    @text-color;
+//** `` border color
+@input-border:                   @gray-dark;
+//** `` border radius
+@input-border-radius:            @border-radius-base;
+//** Border color for inputs on focus
+@input-border-focus:             #66afe9;
+
+//** Placeholder text color
+@input-color-placeholder:        @gray-light;
+
+//** Default `.form-control` height
+@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);
+//** Large `.form-control` height
+@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);
+//** Small `.form-control` height
+@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);
+
+@legend-color:                   @text-color;
+@legend-border-color:            @gray-dark;
+
+//** Background color for textual input addons
+@input-group-addon-bg:           @gray-lighter;
+//** Border color for textual input addons
+@input-group-addon-border-color: @input-border;
+
+
+//== Dropdowns
+//
+//## Dropdown menu container and contents.
+
+//** Background for the dropdown menu.
+@dropdown-bg:                    @gray-darker;
+//** Dropdown menu `border-color`.
+@dropdown-border:                rgba(255,255,255,0.1);
+//** Dropdown menu `border-color` **for IE8**.
+@dropdown-fallback-border:       #444;
+//** Divider color for between dropdown items.
+@dropdown-divider-bg:            rgba(255,255,255,0.1);
+
+//** Dropdown link text color.
+@dropdown-link-color:            #fff;
+//** Hover color for dropdown links.
+@dropdown-link-hover-color:      #fff;
+//** Hover background for dropdown links.
+@dropdown-link-hover-bg:         @dropdown-link-active-bg;
+
+//** Active dropdown menu item text color.
+@dropdown-link-active-color:     #fff;
+//** Active dropdown menu item background color.
+@dropdown-link-active-bg:        @component-active-bg;
+
+//** Disabled dropdown menu item background color.
+@dropdown-link-disabled-color:   @text-muted;
+
+//** Text color for headers within dropdown menus.
+@dropdown-header-color:          @text-muted;
+
+//** Deprecated `@dropdown-caret-color` as of v3.1.0
+@dropdown-caret-color:           #000;
+
+
+//-- Z-index master list
+//
+// Warning: Avoid customizing these values. They're used for a bird's eye view
+// of components dependent on the z-axis and are designed to all work together.
+//
+// Note: These variables are not generated into the Customizer.
+
+@zindex-navbar:            1000;
+@zindex-dropdown:          1000;
+@zindex-popover:           1060;
+@zindex-tooltip:           1070;
+@zindex-navbar-fixed:      1030;
+@zindex-modal-background:  1040;
+@zindex-modal:             1050;
+
+
+//== Media queries breakpoints
+//
+//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
+
+// Extra small screen / phone
+//** Deprecated `@screen-xs` as of v3.0.1
+@screen-xs:                  480px;
+//** Deprecated `@screen-xs-min` as of v3.2.0
+@screen-xs-min:              @screen-xs;
+//** Deprecated `@screen-phone` as of v3.0.1
+@screen-phone:               @screen-xs-min;
+
+// Small screen / tablet
+//** Deprecated `@screen-sm` as of v3.0.1
+@screen-sm:                  768px;
+@screen-sm-min:              @screen-sm;
+//** Deprecated `@screen-tablet` as of v3.0.1
+@screen-tablet:              @screen-sm-min;
+
+// Medium screen / desktop
+//** Deprecated `@screen-md` as of v3.0.1
+@screen-md:                  992px;
+@screen-md-min:              @screen-md;
+//** Deprecated `@screen-desktop` as of v3.0.1
+@screen-desktop:             @screen-md-min;
+
+// Large screen / wide desktop
+//** Deprecated `@screen-lg` as of v3.0.1
+@screen-lg:                  1200px;
+@screen-lg-min:              @screen-lg;
+//** Deprecated `@screen-lg-desktop` as of v3.0.1
+@screen-lg-desktop:          @screen-lg-min;
+
+// So media queries don't overlap when required, provide a maximum
+@screen-xs-max:              (@screen-sm-min - 1);
+@screen-sm-max:              (@screen-md-min - 1);
+@screen-md-max:              (@screen-lg-min - 1);
+
+
+//== Grid system
+//
+//## Define your custom responsive grid.
+
+//** Number of columns in the grid.
+@grid-columns:              12;
+//** Padding between columns. Gets divided in half for the left and right.
+@grid-gutter-width:         30px;
+// Navbar collapse
+//** Point at which the navbar becomes uncollapsed.
+@grid-float-breakpoint:     @screen-sm-min;
+//** Point at which the navbar begins collapsing.
+@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);
+
+
+//== Container sizes
+//
+//## Define the maximum width of `.container` for different screen sizes.
+
+// Small screen / tablet
+@container-tablet:             ((720px + @grid-gutter-width));
+//** For `@screen-sm-min` and up.
+@container-sm:                 @container-tablet;
+
+// Medium screen / desktop
+@container-desktop:            ((940px + @grid-gutter-width));
+//** For `@screen-md-min` and up.
+@container-md:                 @container-desktop;
+
+// Large screen / wide desktop
+@container-large-desktop:      ((1140px + @grid-gutter-width));
+//** For `@screen-lg-min` and up.
+@container-lg:                 @container-large-desktop;
+
+
+//== Navbar
+//
+//##
+
+// Basics of a navbar
+@navbar-height:                    50px;
+@navbar-margin-bottom:             @line-height-computed;
+@navbar-border-radius:             @border-radius-base;
+@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));
+@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);
+@navbar-collapse-max-height:       340px;
+
+@navbar-default-color:             @text-color;
+@navbar-default-bg:                @body-bg;
+@navbar-default-border:            @gray-dark;
+
+// Navbar links
+@navbar-default-link-color:                @text-color;
+@navbar-default-link-hover-color:          #fff;
+@navbar-default-link-hover-bg:             transparent;
+@navbar-default-link-active-color:         #fff;
+@navbar-default-link-active-bg:            transparent;
+@navbar-default-link-disabled-color:       @gray-light;
+@navbar-default-link-disabled-bg:          transparent;
+
+// Navbar brand label
+@navbar-default-brand-color:               #fff;
+@navbar-default-brand-hover-color:         #fff;
+@navbar-default-brand-hover-bg:            transparent;
+
+// Navbar toggle
+@navbar-default-toggle-hover-bg:           @gray-dark;
+@navbar-default-toggle-icon-bar-bg:        #ccc;
+@navbar-default-toggle-border-color:       @gray-dark;
+
+
+// Inverted navbar
+// Reset inverted navbar basics
+@navbar-inverse-color:                      @gray-light;
+@navbar-inverse-bg:                         @gray-darker;
+@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);
+
+// Inverted navbar links
+@navbar-inverse-link-color:                 @gray-light;
+@navbar-inverse-link-hover-color:           #fff;
+@navbar-inverse-link-hover-bg:              transparent;
+@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;
+@navbar-inverse-link-active-bg:             transparent;
+@navbar-inverse-link-disabled-color:        #aaa;
+@navbar-inverse-link-disabled-bg:           transparent;
+
+// Inverted navbar brand label
+@navbar-inverse-brand-color:                #fff;
+@navbar-inverse-brand-hover-color:          #fff;
+@navbar-inverse-brand-hover-bg:             transparent;
+
+// Inverted navbar toggle
+@navbar-inverse-toggle-hover-bg:            #333;
+@navbar-inverse-toggle-icon-bar-bg:         #fff;
+@navbar-inverse-toggle-border-color:        #333;
+
+
+//== Navs
+//
+//##
+
+//=== Shared nav styles
+@nav-link-padding:                          10px 15px;
+@nav-link-hover-bg:                         @gray-darker;
+
+@nav-disabled-link-color:                   @gray-light;
+@nav-disabled-link-hover-color:             @gray-light;
+
+@nav-open-link-hover-color:                 @gray-darker;
+
+//== Tabs
+@nav-tabs-border-color:                     @gray-dark;
+
+@nav-tabs-link-hover-border-color:          transparent;
+
+@nav-tabs-active-link-hover-bg:             @brand-primary;
+@nav-tabs-active-link-hover-color:          #fff;
+@nav-tabs-active-link-hover-border-color:   @gray-dark;
+
+@nav-tabs-justified-link-border-color:            #ddd;
+@nav-tabs-justified-active-link-border-color:     @body-bg;
+
+//== Pills
+@nav-pills-border-radius:                   @border-radius-base;
+@nav-pills-active-link-hover-bg:            @component-active-bg;
+@nav-pills-active-link-hover-color:         @component-active-color;
+
+
+//== Pagination
+//
+//##
+
+@pagination-color:                     #fff;
+@pagination-bg:                        @gray-darker;
+@pagination-border:                    @gray-dark;
+
+@pagination-hover-color:               #000;
+@pagination-hover-bg:                  @component-active-bg;
+@pagination-hover-border:              transparent;
+
+@pagination-active-color:              #000;
+@pagination-active-bg:                 @brand-primary;
+@pagination-active-border:             transparent;
+
+@pagination-disabled-color:            @gray-light;
+@pagination-disabled-bg:               @gray-darker;
+@pagination-disabled-border:           @gray-dark;
+
+
+//== Pager
+//
+//##
+
+@pager-bg:                             @pagination-bg;
+@pager-border:                         @pagination-border;
+@pager-border-radius:                  15px;
+
+@pager-hover-bg:                       @pagination-hover-bg;
+
+@pager-active-bg:                      @pagination-active-bg;
+@pager-active-color:                   @pagination-active-color;
+
+@pager-disabled-color:                 @gray-light;
+
+
+//== Jumbotron
+//
+//##
+
+@jumbotron-padding:              30px;
+@jumbotron-color:                inherit;
+@jumbotron-bg:                   darken(@gray-darker, 5%);
+@jumbotron-heading-color:        inherit;
+@jumbotron-font-size:            ceil((@font-size-base * 1.5));
+
+
+//== Form states and alerts
+//
+//## Define colors for form feedback states and, by default, alerts.
+
+@state-success-text:             #000;
+@state-success-bg:               @brand-success;
+@state-success-border:           darken(@state-success-bg, 5%);
+
+@state-info-text:                #000;
+@state-info-bg:                  @brand-info;
+@state-info-border:              darken(@state-info-bg, 7%);
+
+@state-warning-text:             #000;
+@state-warning-bg:               @brand-warning;
+@state-warning-border:           darken(@state-warning-bg, 3%);
+
+@state-danger-text:              #000;
+@state-danger-bg:                @brand-danger;
+@state-danger-border:            darken(@state-danger-bg, 3%);
+
+
+//== Tooltips
+//
+//##
+
+//** Tooltip max width
+@tooltip-max-width:           200px;
+//** Tooltip text color
+@tooltip-color:               #fff;
+//** Tooltip background color
+@tooltip-bg:                  rgba(0,0,0,.9);
+@tooltip-opacity:             .9;
+
+//** Tooltip arrow width
+@tooltip-arrow-width:         5px;
+//** Tooltip arrow color
+@tooltip-arrow-color:         @tooltip-bg;
+
+
+//== Popovers
+//
+//##
+
+//** Popover body background color
+@popover-bg:                          lighten(@body-bg, 10%);
+//** Popover maximum width
+@popover-max-width:                   276px;
+//** Popover border color
+@popover-border-color:                rgba(0,0,0,.2);
+//** Popover fallback border color
+@popover-fallback-border-color:       #999;
+
+//** Popover title background color
+@popover-title-bg:                    darken(@popover-bg, 3%);
+
+//** Popover arrow width
+@popover-arrow-width:                 10px;
+//** Popover arrow color
+@popover-arrow-color:                 @popover-bg;
+
+//** Popover outer arrow width
+@popover-arrow-outer-width:           (@popover-arrow-width + 1);
+//** Popover outer arrow color
+@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);
+//** Popover outer arrow fallback color
+@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);
+
+
+//== Labels
+//
+//##
+
+//** Default label background color
+@label-default-bg:            @btn-default-bg;
+//** Primary label background color
+@label-primary-bg:            @brand-primary;
+//** Success label background color
+@label-success-bg:            @brand-success;
+//** Info label background color
+@label-info-bg:               @brand-info;
+//** Warning label background color
+@label-warning-bg:            @brand-warning;
+//** Danger label background color
+@label-danger-bg:             @brand-danger;
+
+//** Default label text color
+@label-color:                 #fff;
+//** Default text color of a linked label
+@label-link-hover-color:      #fff;
+
+
+//== Modals
+//
+//##
+
+//** Padding applied to the modal body
+@modal-inner-padding:         20px;
+
+//** Padding applied to the modal title
+@modal-title-padding:         15px;
+//** Modal title line-height
+@modal-title-line-height:     @line-height-base;
+
+//** Background color of modal content area
+@modal-content-bg:                             lighten(@body-bg, 10%);
+//** Modal content border color
+@modal-content-border-color:                   rgba(0,0,0,.2);
+//** Modal content border color **for IE8**
+@modal-content-fallback-border-color:          #999;
+
+//** Modal backdrop background color
+@modal-backdrop-bg:           #000;
+//** Modal backdrop opacity
+@modal-backdrop-opacity:      .5;
+//** Modal header border color
+@modal-header-border-color:   @gray-dark;
+//** Modal footer border color
+@modal-footer-border-color:   @modal-header-border-color;
+
+@modal-lg:                    900px;
+@modal-md:                    600px;
+@modal-sm:                    300px;
+
+
+//== Alerts
+//
+//## Define alert colors, border radius, and padding.
+
+@alert-padding:               15px;
+@alert-border-radius:         @border-radius-base;
+@alert-link-font-weight:      bold;
+
+@alert-success-bg:            @state-success-bg;
+@alert-success-text:          @state-success-text;
+@alert-success-border:        @state-success-border;
+
+@alert-info-bg:               @state-info-bg;
+@alert-info-text:             @state-info-text;
+@alert-info-border:           @state-info-border;
+
+@alert-warning-bg:            @state-warning-bg;
+@alert-warning-text:          @state-warning-text;
+@alert-warning-border:        @state-warning-border;
+
+@alert-danger-bg:             @state-danger-bg;
+@alert-danger-text:           @state-danger-text;
+@alert-danger-border:         @state-danger-border;
+
+
+//== Progress bars
+//
+//##
+
+//** Background color of the whole progress component
+@progress-bg:                 @gray-darker;
+//** Progress bar text color
+@progress-bar-color:          #fff;
+
+//** Default progress bar color
+@progress-bar-bg:             @brand-primary;
+//** Success progress bar color
+@progress-bar-success-bg:     @brand-success;
+//** Warning progress bar color
+@progress-bar-warning-bg:     @brand-warning;
+//** Danger progress bar color
+@progress-bar-danger-bg:      @brand-danger;
+//** Info progress bar color
+@progress-bar-info-bg:        @brand-info;
+
+
+//== List group
+//
+//##
+
+//** Background color on `.list-group-item`
+@list-group-bg:                 @gray-darker;
+//** `.list-group-item` border color
+@list-group-border:             @gray-dark;
+//** List group border radius
+@list-group-border-radius:      @border-radius-base;
+
+//** Background color of single list items on hover
+@list-group-hover-bg:           lighten(@list-group-bg, 15%);
+//** Text color of active list items
+@list-group-active-color:       @component-active-color;
+//** Background color of active list items
+@list-group-active-bg:          @component-active-bg;
+//** Border color of active list elements
+@list-group-active-border:      @list-group-active-bg;
+//** Text color for content within active list items
+@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);
+
+//** Text color of disabled list items
+@list-group-disabled-color:      @gray-light;
+//** Background color of disabled list items
+@list-group-disabled-bg:         @gray-lighter;
+//** Text color for content within disabled list items
+@list-group-disabled-text-color: @list-group-disabled-color;
+
+@list-group-link-color:         @text-color;
+@list-group-link-hover-color:   @list-group-link-color;
+@list-group-link-heading-color: #fff;
+
+
+//== Panels
+//
+//##
+
+@panel-bg:                    @gray-darker;
+@panel-body-padding:          15px;
+@panel-heading-padding:       10px 15px;
+@panel-footer-padding:        @panel-heading-padding;
+@panel-border-radius:         @border-radius-base;
+
+//** Border color for elements within panels
+@panel-inner-border:          @gray-dark;
+
+@panel-default-text:          @text-color;
+@panel-default-border:        @panel-inner-border;
+@panel-default-heading-bg:    lighten(@gray-darker, 10%);
+
+@panel-footer-bg:             @panel-default-heading-bg;
+
+@panel-primary-text:          #fff;
+@panel-primary-border:        @brand-primary;
+@panel-primary-heading-bg:    @brand-primary;
+
+@panel-success-text:          @state-success-text;
+@panel-success-border:        @state-success-border;
+@panel-success-heading-bg:    @state-success-bg;
+
+@panel-info-text:             @state-info-text;
+@panel-info-border:           @state-info-border;
+@panel-info-heading-bg:       @state-info-bg;
+
+@panel-warning-text:          @state-warning-text;
+@panel-warning-border:        @state-warning-border;
+@panel-warning-heading-bg:    @state-warning-bg;
+
+@panel-danger-text:           @state-danger-text;
+@panel-danger-border:         @state-danger-border;
+@panel-danger-heading-bg:     @state-danger-bg;
+
+
+//== Thumbnails
+//
+//##
+
+//** Padding around the thumbnail image
+@thumbnail-padding:           4px;
+//** Thumbnail background color
+@thumbnail-bg:                @gray-dark;
+//** Thumbnail border color
+@thumbnail-border:            @gray-dark;
+//** Thumbnail border radius
+@thumbnail-border-radius:     @border-radius-base;
+
+//** Custom text color for thumbnail captions
+@thumbnail-caption-color:     @text-color;
+//** Padding around the thumbnail caption
+@thumbnail-caption-padding:   9px;
+
+
+//== Wells
+//
+//##
+
+@well-bg:                     darken(@gray-darker, 5%);
+@well-border:                 darken(@well-bg, 7%);
+
+
+//== Badges
+//
+//##
+
+@badge-color:                 #000;
+//** Linked badge text color on hover
+@badge-link-hover-color:      #000;
+@badge-bg:                    @brand-primary;
+
+//** Badge text color in active nav link
+@badge-active-color:          @brand-primary;
+//** Badge background color in active nav link
+@badge-active-bg:             #fff;
+
+@badge-font-weight:           bold;
+@badge-line-height:           1;
+@badge-border-radius:         10px;
+
+
+//== Breadcrumbs
+//
+//##
+
+@breadcrumb-padding-vertical:   8px;
+@breadcrumb-padding-horizontal: 15px;
+//** Breadcrumb background color
+@breadcrumb-bg:                 @gray-darker;
+//** Breadcrumb text color
+@breadcrumb-color:              #fff;
+//** Text color of current page in the breadcrumb
+@breadcrumb-active-color:       @text-color;
+//** Textual separator for between breadcrumb elements
+@breadcrumb-separator:          "/";
+
+
+//== Carousel
+//
+//##
+
+@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);
+
+@carousel-control-color:                      #fff;
+@carousel-control-width:                      15%;
+@carousel-control-opacity:                    .5;
+@carousel-control-font-size:                  20px;
+
+@carousel-indicator-active-bg:                #fff;
+@carousel-indicator-border-color:             #fff;
+
+@carousel-caption-color:                      #fff;
+
+
+//== Close
+//
+//##
+
+@close-font-weight:           bold;
+@close-color:                 #000;
+@close-text-shadow:           0 1px 0 #fff;
+
+
+//== Code
+//
+//##
+
+@code-color:                  #c7254e;
+@code-bg:                     #f9f2f4;
+
+@kbd-color:                   #fff;
+@kbd-bg:                      #333;
+
+@pre-bg:                      #f5f5f5;
+@pre-color:                   @gray-dark;
+@pre-border-color:            #ccc;
+@pre-scrollable-max-height:   340px;
+
+
+//== Type
+//
+//##
+
+//** Horizontal offset for forms and lists.
+@component-offset-horizontal: 180px;
+//** Text muted color
+@text-muted:                  @gray-light;
+//** Abbreviations and acronyms border color
+@abbr-border-color:           @gray-light;
+//** Headings small color
+@headings-small-color:        @brand-primary;
+//** Blockquote small color
+@blockquote-small-color:      @gray;
+//** Blockquote font size
+@blockquote-font-size:        (@font-size-base * 1.25);
+//** Blockquote border color
+@blockquote-border-color:     @gray-dark;
+//** Page header border color
+@page-header-border-color:    @gray-dark;
+//** Width of horizontal description list titles
+@dl-horizontal-offset:        @component-offset-horizontal;
+//** Horizontal line color.
+@hr-border:                   @gray-dark;
+
+@import "base";
+
+.messages .text-danger {
+  color: #fff;
+}
+
+.messages .text-info {
+  color: #fff;
+}
+
+.messages .caret {
+  color: #fff;
+}
+
+// Cyborg 3.2.0
+// Bootswatch
+// -----------------------------------------------------
+
+// Navbar =====================================================================
+
+// Buttons ====================================================================
+
+// Typography =================================================================
+
+.text-primary,
+.text-primary:hover {
+  color: @brand-primary;
+}
+
+.text-success,
+.text-success:hover {
+  color: @brand-success;
+}
+
+.text-danger,
+.text-danger:hover {
+  color: @brand-danger;
+}
+
+.text-warning,
+.text-warning:hover {
+  color: @brand-warning;
+}
+
+.text-info,
+.text-info:hover {
+  color: @brand-info;
+}
+
+// Tables =====================================================================
+
+table,
+.table {
+  color: #fff;
+
+  a:not(.btn) {
+    color: #fff;
+    text-decoration: underline;
+  }
+
+  .text-muted {
+    color: @text-muted;
+  }
+}
+
+.table-responsive > .table {
+  background-color: @table-bg;
+}
+
+// Forms ======================================================================
+
+.has-warning {
+  .help-block,
+  .control-label,
+  .form-control-feedback {
+    color: @brand-warning;
+  }
+
+  .form-control,
+  .form-control:focus,
+  .input-group-addon {
+    border-color: @brand-warning;
+  }
+}
+
+.has-error {
+  .help-block,
+  .control-label,
+  .form-control-feedback {
+    color: @brand-danger;
+  }
+
+  .form-control,
+  .form-control:focus,
+  .input-group-addon {
+    border-color: @brand-danger;
+  }
+}
+
+.has-success {
+  .help-block,
+  .control-label,
+  .form-control-feedback {
+    color: @brand-success;
+  }
+
+  .form-control,
+  .form-control:focus,
+  .input-group-addon {
+    border-color: @brand-success;
+  }
+}
+
+.input-group-addon {
+  background-color: @btn-default-bg;
+}
+
+// Navs =======================================================================
+
+.nav-tabs,
+.nav-pills,
+.breadcrumb,
+.pager {
+
+  a {
+    color: #fff;
+  }
+}
+
+// Indicators =================================================================
+
+.alert {
+
+  .alert-link,
+  a {
+    color: @alert-warning-text;
+    text-decoration: underline;
+  }
+
+  .close {
+    text-decoration: none;
+  }
+}
+
+.close {
+  color: #fff;
+  text-decoration: none;
+  opacity: 0.4;
+
+  &:hover,
+  &:focus {
+    color: #fff;
+    opacity: 1;
+  }
+}
+
+// Progress bars ==============================================================
+
+// Containers =================================================================
+
+a.thumbnail:hover,
+a.thumbnail:focus,
+a.thumbnail.active {
+  border-color: @thumbnail-border;
+}
+
+.jumbotron {
+
+  h1, h2, h3, h4, h5, h6 {
+    color: #fff;
+  }
+}
+
+
+// Specials for cccamp19 design
+
+.navbar-brand {
+	.icon-icon_angel {
+	  background-color: @brand-primary;
+  }
+  
+  strong {
+    font-weight: lighter;
+    color: @brand-primary;  
+    text-shadow:
+      0 0 10px @brand-primary,
+      0 0 20px @brand-primary,
+      0 0 30px @brand-primary,
+      0 0 40px @brand-primary,
+      0 0 70px @brand-primary,
+      0 0 80px @brand-primary;
+  }
+}
+
+h1 {
+  font-weight: lighter;
+  color: @brand-primary;
+  text-shadow: 0 0 10px @brand-primary;
+  
+  .icon-icon_angel {
+    background-color: @brand-primary;
+  }
+}
+
+.panel-title {
+  color: #fff;
+}
diff --git a/webpack.config.js b/webpack.config.js
index 5542460d..f25a37ea 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -23,7 +23,7 @@ const plugins = [
 
 
 const themeEntries = {};
-for (let i = 0; i < 9; i++) {
+for (let i = 0; i < 12; i++) {
   themeEntries[`theme${i}`] = `./resources/assets/themes/theme${i}.less`;
 }
 
-- 
cgit v1.2.3


From fece50ca0993d2b52e09be8543cb796594681c9a Mon Sep 17 00:00:00 2001
From: Igor Scheller 
Date: Tue, 16 Jul 2019 02:59:33 +0200
Subject: Basic coverage tests of logger classes for 100% unit tests coverage

---
 tests/Unit/HasDatabase.php                  |  1 +
 tests/Unit/Logger/EngelsystemLoggerTest.php | 72 +++++++++++++++++++++++++++++
 tests/Unit/Models/LogEntryTest.php          | 43 +++++++++++++++++
 3 files changed, 116 insertions(+)
 create mode 100644 tests/Unit/Logger/EngelsystemLoggerTest.php
 create mode 100644 tests/Unit/Models/LogEntryTest.php

diff --git a/tests/Unit/HasDatabase.php b/tests/Unit/HasDatabase.php
index 175c244b..7a58bb2b 100644
--- a/tests/Unit/HasDatabase.php
+++ b/tests/Unit/HasDatabase.php
@@ -44,6 +44,7 @@ trait HasDatabase
                 ['migration' => '2018_01_01_000003_fix_old_tables'],
                 ['migration' => '2018_01_01_000004_cleanup_group_privileges'],
                 ['migration' => '2018_01_01_000005_add_angel_supporter_permissions'],
+                ['migration' => '2018_12_27_000000_fix_missing_arrival_dates'],
             ]);
 
         $migration->run(__DIR__ . '/../../db/migrations');
diff --git a/tests/Unit/Logger/EngelsystemLoggerTest.php b/tests/Unit/Logger/EngelsystemLoggerTest.php
new file mode 100644
index 00000000..0f4c8c32
--- /dev/null
+++ b/tests/Unit/Logger/EngelsystemLoggerTest.php
@@ -0,0 +1,72 @@
+createMock(LogEntry::class);
+        $logEntry->expects($this->once())
+            ->method('create')
+            ->with(['level' => LogLevel::INFO, 'message' => 'I\'m an information!']);
+
+        $logger = new EngelsystemLogger($logEntry);
+
+        $logger->log(LogLevel::INFO, 'I\'m an information!');
+    }
+
+    /**
+     * @covers \Engelsystem\Logger\EngelsystemLogger::log
+     * @covers \Engelsystem\Logger\EngelsystemLogger::checkLevel
+     */
+    public function testCheckLevel()
+    {
+        /** @var LogEntry|MockObject $logEntry */
+        $logEntry = $this->createMock(LogEntry::class);
+        $logger = new EngelsystemLogger($logEntry);
+
+        $this->expectException(InvalidArgumentException::class);
+        $logger->log('FooBar', 'Random Stuff');
+    }
+
+    /**
+     * @covers \Engelsystem\Logger\EngelsystemLogger::interpolate
+     */
+    public function testInterpolate()
+    {
+        /** @var LogEntry|MockObject $logEntry */
+        $logEntry = $this->createMock(LogEntry::class);
+        $logEntry->expects($this->exactly(3))
+            ->method('create')
+            ->withConsecutive(
+                [['level' => LogLevel::DEBUG, 'message' => 'User: Foo']],
+                [['level' => LogLevel::NOTICE, 'message' => 'User: {user}']],
+                [['level' => LogLevel::NOTICE, 'message' => 'User: Bar']]
+            );
+
+        $logger = new EngelsystemLogger($logEntry);
+
+        $logger->log(LogLevel::DEBUG, 'User: {user}', ['user' => 'Foo']);
+        $logger->log(LogLevel::NOTICE, 'User: {user}', ['user' => ['name' => 'Lorem']]);
+        $logger->log(LogLevel::NOTICE, 'User: {user}', [
+            'user' =>
+                new class
+                {
+                    public function __toString() { return 'Bar'; }
+                }
+        ]);
+    }
+}
diff --git a/tests/Unit/Models/LogEntryTest.php b/tests/Unit/Models/LogEntryTest.php
new file mode 100644
index 00000000..0a0efa3c
--- /dev/null
+++ b/tests/Unit/Models/LogEntryTest.php
@@ -0,0 +1,43 @@
+ LogLevel::INFO,
+                     '*Insert explosion here*' => LogLevel::EMERGENCY,
+                     'Tracing along'           => LogLevel::DEBUG,
+                     'Oops'                    => LogLevel::ERROR,
+                     'It\'s happening'         => LogLevel::INFO,
+                     'Something is wrong'      => LogLevel::ERROR,
+                     'Ohi'                     => LogLevel::INFO,
+                 ] as $message => $level) {
+            (new LogEntry(['level' => $level, 'message' => $message]))->save();
+        }
+
+        $this->assertCount(7, LogEntry::filter());
+        $this->assertCount(3, LogEntry::filter(LogLevel::INFO));
+        $this->assertCount(1, LogEntry::filter('Oops'));
+    }
+
+    /**
+     * Prepare test
+     */
+    protected function setUp(): void
+    {
+        $this->initDatabase();
+    }
+}
-- 
cgit v1.2.3


From 4582f808f05205e7a32ecd6ae42dee00295872f1 Mon Sep 17 00:00:00 2001
From: Igor Scheller 
Date: Sun, 21 Jul 2019 02:34:52 +0200
Subject: Added version to credits and metrics page

---
 .gitlab-ci.yml                                    |  4 ++-
 config/app.php                                    |  1 +
 contrib/Dockerfile                                |  3 ++
 resources/views/pages/credits.twig                |  1 +
 src/Application.php                               |  1 +
 src/Controllers/CreditsController.php             | 13 +++++--
 src/Controllers/Metrics/Controller.php            | 21 +++++++++++-
 src/Helpers/Version.php                           | 42 +++++++++++++++++++++++
 src/Helpers/VersionServiceProvider.php            | 15 ++++++++
 storage/app/.gitignore                            |  2 ++
 tests/Unit/Controllers/CreditsControllerTest.php  | 16 ++++++---
 tests/Unit/Controllers/Metrics/ControllerTest.php | 22 ++++++++----
 tests/Unit/Helpers/Stub/files/VERSION             |  1 +
 tests/Unit/Helpers/VersionServiceProviderTest.php | 25 ++++++++++++++
 tests/Unit/Helpers/VersionTest.php                | 28 +++++++++++++++
 15 files changed, 179 insertions(+), 16 deletions(-)
 create mode 100644 src/Helpers/Version.php
 create mode 100644 src/Helpers/VersionServiceProvider.php
 create mode 100644 storage/app/.gitignore
 create mode 100644 tests/Unit/Helpers/Stub/files/VERSION
 create mode 100644 tests/Unit/Helpers/VersionServiceProviderTest.php
 create mode 100644 tests/Unit/Helpers/VersionTest.php

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index db26ce4c..b9bb8654 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -38,7 +38,9 @@ build-image:
   <<: *docker_definition
   stage: build
   script:
-    - docker build --pull --build-arg NGINX_IMAGE="${TEST_IMAGE}-nginx" -t "${TEST_IMAGE}" -f contrib/Dockerfile .
+    - apk -q add git
+    - VERSION="$(git describe --abbrev=0 --tags)-${CI_COMMIT_REF_NAME}+${CI_PIPELINE_ID}.${CI_COMMIT_SHORT_SHA}"
+    - docker build --pull --build-arg NGINX_IMAGE="${TEST_IMAGE}-nginx" --build-arg VERSION="${VERSION}" -t "${TEST_IMAGE}" -f contrib/Dockerfile .
     - docker push "${TEST_IMAGE}"
 
 test:
diff --git a/config/app.php b/config/app.php
index 17fdee11..8850f74e 100644
--- a/config/app.php
+++ b/config/app.php
@@ -27,6 +27,7 @@ return [
         \Engelsystem\Middleware\SessionHandlerServiceProvider::class,
 
         // Additional services
+        \Engelsystem\Helpers\VersionServiceProvider::class,
         \Engelsystem\Mail\MailerServiceProvider::class,
     ],
 
diff --git a/contrib/Dockerfile b/contrib/Dockerfile
index dd3bd308..f04fff11 100644
--- a/contrib/Dockerfile
+++ b/contrib/Dockerfile
@@ -32,6 +32,9 @@ COPY --from=composer /app/composer.lock /app/
 RUN find /app/storage/ -type f -not -name .gitignore -exec rm {} \;
 RUN rm -f /app/import/* /app/config/config.php
 
+ARG VERSION
+RUN if [[ ! -f /app/storage/app/VERSION ]] && [[ ! -z "${VERSION}" ]]; then echo -n "${VERSION}" > /app/storage/app/VERSION; fi
+
 # Build the PHP container
 FROM php:7-fpm-alpine
 WORKDIR /var/www
diff --git a/resources/views/pages/credits.twig b/resources/views/pages/credits.twig
index eb98c7e7..3bb04895 100644
--- a/resources/views/pages/credits.twig
+++ b/resources/views/pages/credits.twig
@@ -15,6 +15,7 @@
 
             

Source code

+

Version: {{ version }}

The original engelsystem was written by cookie. diff --git a/src/Application.php b/src/Application.php index ac69c20a..99c68231 100644 --- a/src/Application.php +++ b/src/Application.php @@ -111,6 +111,7 @@ class Application extends Container $this->instance('path.lang', $this->get('path.resources') . DIRECTORY_SEPARATOR . 'lang'); $this->instance('path.views', $this->get('path.resources') . DIRECTORY_SEPARATOR . 'views'); $this->instance('path.storage', $appPath . DIRECTORY_SEPARATOR . 'storage'); + $this->instance('path.storage.app', $this->get('path.storage') . DIRECTORY_SEPARATOR . 'app'); $this->instance('path.cache', $this->get('path.storage') . DIRECTORY_SEPARATOR . 'cache'); $this->instance('path.cache.routes', $this->get('path.cache') . DIRECTORY_SEPARATOR . 'routes.cache.php'); $this->instance('path.cache.views', $this->get('path.cache') . DIRECTORY_SEPARATOR . 'views'); diff --git a/src/Controllers/CreditsController.php b/src/Controllers/CreditsController.php index b2805b84..ade97649 100644 --- a/src/Controllers/CreditsController.php +++ b/src/Controllers/CreditsController.php @@ -3,6 +3,7 @@ namespace Engelsystem\Controllers; use Engelsystem\Config\Config; +use Engelsystem\Helpers\Version; use Engelsystem\Http\Response; class CreditsController extends BaseController @@ -13,14 +14,19 @@ class CreditsController extends BaseController /** @var Response */ protected $response; + /** @var Version */ + protected $version; + /** * @param Response $response * @param Config $config + * @param Version $version */ - public function __construct(Response $response, Config $config) + public function __construct(Response $response, Config $config, Version $version) { $this->config = $config; $this->response = $response; + $this->version = $version; } /** @@ -30,7 +36,10 @@ class CreditsController extends BaseController { return $this->response->withView( 'pages/credits.twig', - ['credits' => $this->config->get('credits')] + [ + 'credits' => $this->config->get('credits'), + 'version' => $this->version->getVersion(), + ] ); } } diff --git a/src/Controllers/Metrics/Controller.php b/src/Controllers/Metrics/Controller.php index f6ea3967..ffb2a41b 100644 --- a/src/Controllers/Metrics/Controller.php +++ b/src/Controllers/Metrics/Controller.php @@ -4,6 +4,7 @@ namespace Engelsystem\Controllers\Metrics; use Engelsystem\Config\Config; use Engelsystem\Controllers\BaseController; +use Engelsystem\Helpers\Version; use Engelsystem\Http\Exceptions\HttpForbidden; use Engelsystem\Http\Request; use Engelsystem\Http\Response; @@ -26,25 +27,31 @@ class Controller extends BaseController /** @var Stats */ protected $stats; + /** @var Version */ + protected $version; + /** * @param Response $response * @param MetricsEngine $engine * @param Config $config * @param Request $request * @param Stats $stats + * @param Version $version */ public function __construct( Response $response, MetricsEngine $engine, Config $config, Request $request, - Stats $stats + Stats $stats, + Version $version ) { $this->config = $config; $this->engine = $engine; $this->request = $request; $this->response = $response; $this->stats = $stats; + $this->version = $version; } /** @@ -68,6 +75,18 @@ class Controller extends BaseController $data = [ $this->config->get('app_name') . ' stats', + 'info' => [ + 'type' => 'gauge', + 'help' => 'About the environment', + [ + 'labels' => [ + 'os' => PHP_OS_FAMILY, + 'php' => implode('.', [PHP_MAJOR_VERSION, PHP_MINOR_VERSION]), + 'version' => $this->version->getVersion(), + ], + 'value' => 1, + ], + ], 'users' => [ 'type' => 'gauge', ['labels' => ['state' => 'incoming'], 'value' => $this->stats->newUsers()], diff --git a/src/Helpers/Version.php b/src/Helpers/Version.php new file mode 100644 index 00000000..97fe6ef3 --- /dev/null +++ b/src/Helpers/Version.php @@ -0,0 +1,42 @@ +storage = $storage; + $this->config = $config; + } + + /** + * @return string + */ + public function getVersion() + { + $file = $this->storage . DIRECTORY_SEPARATOR . $this->versionFile; + + $version = 'n/a'; + if (file_exists($file)) { + $version = trim(file_get_contents($file)); + } + + return $this->config->get('version', $version); + } +} diff --git a/src/Helpers/VersionServiceProvider.php b/src/Helpers/VersionServiceProvider.php new file mode 100644 index 00000000..41e10158 --- /dev/null +++ b/src/Helpers/VersionServiceProvider.php @@ -0,0 +1,15 @@ +app->when(Version::class) + ->needs('$storage') + ->give($this->app->get('path.storage.app')); + } +} diff --git a/storage/app/.gitignore b/storage/app/.gitignore new file mode 100644 index 00000000..78d91016 --- /dev/null +++ b/storage/app/.gitignore @@ -0,0 +1,2 @@ +/* +!.gitignore diff --git a/tests/Unit/Controllers/CreditsControllerTest.php b/tests/Unit/Controllers/CreditsControllerTest.php index 42ea4ea1..303bf60e 100644 --- a/tests/Unit/Controllers/CreditsControllerTest.php +++ b/tests/Unit/Controllers/CreditsControllerTest.php @@ -4,9 +4,10 @@ namespace Engelsystem\Test\Unit\Controllers; use Engelsystem\Config\Config; use Engelsystem\Controllers\CreditsController; +use Engelsystem\Helpers\Version; use Engelsystem\Http\Response; +use Engelsystem\Test\Unit\TestCase; use PHPUnit\Framework\MockObject\MockObject; -use PHPUnit\Framework\TestCase; class CreditsControllerTest extends TestCase { @@ -19,12 +20,17 @@ class CreditsControllerTest extends TestCase /** @var Response|MockObject $response */ $response = $this->createMock(Response::class); $config = new Config(['foo' => 'bar', 'credits' => ['lor' => 'em']]); + /** @var Version|MockObject $version */ + $version = $this->createMock(Version::class); - $response->expects($this->once()) - ->method('withView') - ->with('pages/credits.twig', ['credits' => ['lor' => 'em']]); + $this->setExpects( + $response, + 'withView', + ['pages/credits.twig', ['credits' => ['lor' => 'em'], 'version' => '42.1.0-test']] + ); + $this->setExpects($version, 'getVersion', [], '42.1.0-test'); - $controller = new CreditsController($response, $config); + $controller = new CreditsController($response, $config, $version); $controller->index(); } } diff --git a/tests/Unit/Controllers/Metrics/ControllerTest.php b/tests/Unit/Controllers/Metrics/ControllerTest.php index 18daa96a..f203200c 100644 --- a/tests/Unit/Controllers/Metrics/ControllerTest.php +++ b/tests/Unit/Controllers/Metrics/ControllerTest.php @@ -6,6 +6,7 @@ use Engelsystem\Config\Config; use Engelsystem\Controllers\Metrics\Controller; use Engelsystem\Controllers\Metrics\MetricsEngine; use Engelsystem\Controllers\Metrics\Stats; +use Engelsystem\Helpers\Version; use Engelsystem\Http\Exceptions\HttpForbidden; use Engelsystem\Http\Request; use Engelsystem\Http\Response; @@ -28,7 +29,8 @@ class ControllerTest extends TestCase /** @var MetricsEngine|MockObject $engine */ /** @var Stats|MockObject $stats */ /** @var Config $config */ - list($response, $request, $engine, $stats, $config) = $this->getMocks(); + /** @var Version|MockObject $version */ + list($response, $request, $engine, $stats, $config, $version) = $this->getMocks(); $request->server = new ServerBag(); $request->server->set('REQUEST_TIME_FLOAT', 0.0123456789); @@ -37,6 +39,7 @@ class ControllerTest extends TestCase ->method('get') ->willReturnCallback(function ($path, $data) use ($response) { $this->assertEquals('/metrics', $path); + $this->assertArrayHasKey('info', $data); $this->assertArrayHasKey('users', $data); $this->assertArrayHasKey('licenses', $data); $this->assertArrayHasKey('users_working', $data); @@ -122,7 +125,9 @@ class ControllerTest extends TestCase 'XL' => 'X Large', ]); - $controller = new Controller($response, $engine, $config, $request, $stats); + $this->setExpects($version, 'getVersion', [], '0.42.42'); + + $controller = new Controller($response, $engine, $config, $request, $stats, $version); $controller->metrics(); } @@ -137,7 +142,8 @@ class ControllerTest extends TestCase /** @var MetricsEngine|MockObject $engine */ /** @var Stats|MockObject $stats */ /** @var Config $config */ - list($response, $request, $engine, $stats, $config) = $this->getMocks(); + /** @var Version|MockObject $version */ + list($response, $request, $engine, $stats, $config, $version) = $this->getMocks(); $response->expects($this->once()) ->method('withHeader') @@ -168,7 +174,7 @@ class ControllerTest extends TestCase $this->setExpects($stats, 'arrivedUsers', null, 10, $this->exactly(2)); $this->setExpects($stats, 'currentlyWorkingUsers', null, 5); - $controller = new Controller($response, $engine, $config, $request, $stats); + $controller = new Controller($response, $engine, $config, $request, $stats, $version); $controller->stats(); } @@ -182,7 +188,8 @@ class ControllerTest extends TestCase /** @var MetricsEngine|MockObject $engine */ /** @var Stats|MockObject $stats */ /** @var Config $config */ - list($response, $request, $engine, $stats, $config) = $this->getMocks(); + /** @var Version|MockObject $version */ + list($response, $request, $engine, $stats, $config, $version) = $this->getMocks(); $request->expects($this->once()) ->method('get') @@ -191,7 +198,7 @@ class ControllerTest extends TestCase $config->set('api_key', 'fooBar!'); - $controller = new Controller($response, $engine, $config, $request, $stats); + $controller = new Controller($response, $engine, $config, $request, $stats, $version); $this->expectException(HttpForbidden::class); $this->expectExceptionMessage(json_encode(['error' => 'The api_key is invalid'])); @@ -212,7 +219,8 @@ class ControllerTest extends TestCase /** @var Stats|MockObject $stats */ $stats = $this->createMock(Stats::class); $config = new Config(); + $version = $this->createMock(Version::class); - return [$response, $request, $engine, $stats, $config]; + return [$response, $request, $engine, $stats, $config, $version]; } } diff --git a/tests/Unit/Helpers/Stub/files/VERSION b/tests/Unit/Helpers/Stub/files/VERSION new file mode 100644 index 00000000..749a96f3 --- /dev/null +++ b/tests/Unit/Helpers/Stub/files/VERSION @@ -0,0 +1 @@ +0.42.0-testing diff --git a/tests/Unit/Helpers/VersionServiceProviderTest.php b/tests/Unit/Helpers/VersionServiceProviderTest.php new file mode 100644 index 00000000..609c649d --- /dev/null +++ b/tests/Unit/Helpers/VersionServiceProviderTest.php @@ -0,0 +1,25 @@ +instance('path.storage.app', '/tmp'); + + $serviceProvider = new VersionServiceProvider($app); + $serviceProvider->register(); + + $this->assertArrayHasKey(Version::class, $app->contextual); + } +} diff --git a/tests/Unit/Helpers/VersionTest.php b/tests/Unit/Helpers/VersionTest.php new file mode 100644 index 00000000..40569abb --- /dev/null +++ b/tests/Unit/Helpers/VersionTest.php @@ -0,0 +1,28 @@ +assertEquals('n/a', $version->getVersion()); + + $version = new Version(__DIR__ . '/Stub/files', $config); + $this->assertEquals('0.42.0-testing', $version->getVersion()); + + $config->set('version', '1.2.3-dev'); + $this->assertEquals('1.2.3-dev', $version->getVersion()); + } +} -- cgit v1.2.3 From ea4c258e5c26e6528d36cda3afb52458ca0bd801 Mon Sep 17 00:00:00 2001 From: Igor Scheller Date: Sun, 21 Jul 2019 04:53:50 +0200 Subject: GitLab CI: Removed xdebug beta as it is not php7.3 compatible --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index db26ce4c..fa23d90d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -57,7 +57,7 @@ test: junit: ./unittests.xml coverage: '/^\s*Lines:\s*(\d+(?:\.\d+)?%)/' before_script: - - apk add ${PHPIZE_DEPS} && pecl install xdebug-beta && docker-php-ext-enable xdebug + - apk add ${PHPIZE_DEPS} && pecl install xdebug && docker-php-ext-enable xdebug - curl -sS https://getcomposer.org/installer | php -- --no-ansi --install-dir /usr/local/bin/ --filename composer - cp -R tests/ phpunit.xml "${DOCROOT}" - HOMEDIR=$(pwd) @@ -121,6 +121,7 @@ deploy-staging: - master script: # Check if deployment variables where set + - |- - |- if [ -z "${SSH_PRIVATE_KEY}" ] || [ -z "${STAGING_REMOTE}" ] || [ -z "${STAGING_REMOTE_PATH}" ]; then echo "Skipping deployment"; -- cgit v1.2.3 From d5bf7fd065a5ea93dea9fd55e6ac225ee062a3db Mon Sep 17 00:00:00 2001 From: Igor Scheller Date: Sun, 21 Jul 2019 05:03:58 +0200 Subject: GitLab CI: Removed xdebug beta as it is now php7.3 compatible --- .gitlab-ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fa23d90d..a165c604 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -121,7 +121,6 @@ deploy-staging: - master script: # Check if deployment variables where set - - |- - |- if [ -z "${SSH_PRIVATE_KEY}" ] || [ -z "${STAGING_REMOTE}" ] || [ -z "${STAGING_REMOTE_PATH}" ]; then echo "Skipping deployment"; -- cgit v1.2.3 From b03102e3c613bd057f117a145d94aec4c977006c Mon Sep 17 00:00:00 2001 From: msquare Date: Sun, 21 Jul 2019 12:37:01 +0200 Subject: AuthController return types --- src/Controllers/AuthController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Controllers/AuthController.php b/src/Controllers/AuthController.php index a8cc1ace..55dd56b0 100644 --- a/src/Controllers/AuthController.php +++ b/src/Controllers/AuthController.php @@ -53,7 +53,7 @@ class AuthController extends BaseController /** * @return Response */ - public function login() + public function login(): Response { return $this->showLogin(); } @@ -62,7 +62,7 @@ class AuthController extends BaseController * @param bool $showRecovery * @return Response */ - protected function showLogin($showRecovery = false) + protected function showLogin($showRecovery = false): Response { $errors = Collection::make(Arr::flatten($this->session->get('errors', []))); $this->session->remove('errors'); -- cgit v1.2.3 From 51a3c6eb44a5dbdf9d7a3cfac678f0d29b0d3eef Mon Sep 17 00:00:00 2001 From: Igor Scheller Date: Sun, 21 Jul 2019 13:24:47 +0200 Subject: ErrorHandler: Remove some form fields before serialization --- src/Middleware/ErrorHandler.php | 13 ++++++++++++- tests/Unit/Middleware/ErrorHandlerTest.php | 6 +++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Middleware/ErrorHandler.php b/src/Middleware/ErrorHandler.php index c89edb1a..544f35d5 100644 --- a/src/Middleware/ErrorHandler.php +++ b/src/Middleware/ErrorHandler.php @@ -6,6 +6,7 @@ use Engelsystem\Http\Exceptions\HttpException; use Engelsystem\Http\Exceptions\ValidationException; use Engelsystem\Http\Request; use Engelsystem\Http\Response; +use Illuminate\Support\Arr; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; @@ -20,6 +21,16 @@ class ErrorHandler implements MiddlewareInterface /** @var string */ protected $viewPrefix = 'errors/'; + /** + * A list of inputs that are not saved from form input + * + * @var array + */ + protected $formIgnore = [ + 'password', + 'password_confirmation', + ]; + /** * @param TwigLoader $loader */ @@ -58,7 +69,7 @@ class ErrorHandler implements MiddlewareInterface ) ); - $session->set('form-data', $request->request->all()); + $session->set('form-data', Arr::except($request->request->all(), $this->formIgnore)); } } diff --git a/tests/Unit/Middleware/ErrorHandlerTest.php b/tests/Unit/Middleware/ErrorHandlerTest.php index ea9cb216..a9fdd71a 100644 --- a/tests/Unit/Middleware/ErrorHandlerTest.php +++ b/tests/Unit/Middleware/ErrorHandlerTest.php @@ -176,7 +176,11 @@ class ErrorHandlerTest extends TestCase $session = new Session(new MockArraySessionStorage()); $session->set('errors', ['validation' => ['foo' => ['validation.foo.required']]]); - $request = Request::create('/foo/bar', 'POST', ['foo' => 'bar']); + $request = Request::create( + '/foo/bar', + 'POST', + ['foo' => 'bar', 'password' => 'Test123', 'password_confirmation' => 'Test1234'] + ); $request->setSession($session); /** @var Application $app */ -- cgit v1.2.3 From 3d8476efd3709806d254b1c41e26e906080e0b39 Mon Sep 17 00:00:00 2001 From: Igor Scheller Date: Sun, 21 Jul 2019 13:37:35 +0200 Subject: ErrorHandler: Remove more form fields before serialization --- src/Middleware/ErrorHandler.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Middleware/ErrorHandler.php b/src/Middleware/ErrorHandler.php index 544f35d5..65e2e609 100644 --- a/src/Middleware/ErrorHandler.php +++ b/src/Middleware/ErrorHandler.php @@ -29,6 +29,12 @@ class ErrorHandler implements MiddlewareInterface protected $formIgnore = [ 'password', 'password_confirmation', + 'password2', + 'new_password', + 'new_password2', + 'new_pw', + 'new_pw2', + '_token', ]; /** -- cgit v1.2.3