mirror of
https://github.com/Part-DB/Part-DB-server.git
synced 2025-06-22 01:49:05 +02:00
Added user entity and basic login/logout system.
This commit is contained in:
parent
71711bc0ba
commit
62d875d1e5
8 changed files with 925 additions and 191 deletions
|
@ -1,7 +1,15 @@
|
||||||
security:
|
security:
|
||||||
|
encoders:
|
||||||
|
App\Entity\User:
|
||||||
|
algorithm: bcrypt
|
||||||
|
|
||||||
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
|
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
|
||||||
providers:
|
providers:
|
||||||
in_memory: { memory: ~ }
|
# used to reload user from session & other features (e.g. switch_user)
|
||||||
|
app_user_provider:
|
||||||
|
entity:
|
||||||
|
class: App\Entity\User
|
||||||
|
property: name
|
||||||
firewalls:
|
firewalls:
|
||||||
dev:
|
dev:
|
||||||
pattern: ^/(_(profiler|wdt)|css|images|js)/
|
pattern: ^/(_(profiler|wdt)|css|images|js)/
|
||||||
|
@ -14,8 +22,16 @@ security:
|
||||||
#http_basic: true
|
#http_basic: true
|
||||||
# https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
|
# https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
|
||||||
|
|
||||||
# form_login: true
|
|
||||||
# https://symfony.com/doc/current/security/form_login_setup.html
|
# https://symfony.com/doc/current/security/form_login_setup.html
|
||||||
|
form_login:
|
||||||
|
login_path: login
|
||||||
|
check_path: login
|
||||||
|
csrf_token_generator: security.csrf.token_manager
|
||||||
|
use_referer: true
|
||||||
|
|
||||||
|
logout:
|
||||||
|
path: logout
|
||||||
|
target: homepage
|
||||||
|
|
||||||
# Easy way to control access for large sections of your site
|
# Easy way to control access for large sections of your site
|
||||||
# Note: Only the *first* access control that matches will be used
|
# Note: Only the *first* access control that matches will be used
|
||||||
|
|
66
src/Controller/SecurityController.php
Normal file
66
src/Controller/SecurityController.php
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* part-db version 0.1
|
||||||
|
* Copyright (C) 2005 Christoph Lechner
|
||||||
|
* http://www.cl-projects.de/
|
||||||
|
*
|
||||||
|
* part-db version 0.2+
|
||||||
|
* Copyright (C) 2009 K. Jacobs and others (see authors.php)
|
||||||
|
* http://code.google.com/p/part-db/
|
||||||
|
*
|
||||||
|
* Part-DB Version 0.4+
|
||||||
|
* Copyright (C) 2016 - 2019 Jan Böhmer
|
||||||
|
* https://github.com/jbtronics
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace App\Controller;
|
||||||
|
|
||||||
|
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
|
use Symfony\Component\Routing\Annotation\Route;
|
||||||
|
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
|
||||||
|
|
||||||
|
class SecurityController extends AbstractController
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @Route("/login", name="login", methods={"GET", "POST"})
|
||||||
|
*/
|
||||||
|
public function login(AuthenticationUtils $authenticationUtils)
|
||||||
|
{
|
||||||
|
// get the login error if there is one
|
||||||
|
$error = $authenticationUtils->getLastAuthenticationError();
|
||||||
|
|
||||||
|
// last username entered by the user
|
||||||
|
$lastUsername = $authenticationUtils->getLastUsername();
|
||||||
|
|
||||||
|
return $this->render('security/login.html.twig', [
|
||||||
|
'last_username' => $lastUsername,
|
||||||
|
'error' => $error,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Route("/logout", name="logout")
|
||||||
|
*/
|
||||||
|
public function logout()
|
||||||
|
{
|
||||||
|
throw new \Exception('Will be intercepted before getting here');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
314
src/Entity/User.php
Normal file
314
src/Entity/User.php
Normal file
|
@ -0,0 +1,314 @@
|
||||||
|
<?php declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* part-db version 0.1
|
||||||
|
* Copyright (C) 2005 Christoph Lechner
|
||||||
|
* http://www.cl-projects.de/
|
||||||
|
*
|
||||||
|
* part-db version 0.2+
|
||||||
|
* Copyright (C) 2009 K. Jacobs and others (see authors.php)
|
||||||
|
* http://code.google.com/p/part-db/
|
||||||
|
*
|
||||||
|
* Part-DB Version 0.4+
|
||||||
|
* Copyright (C) 2016 - 2019 Jan Böhmer
|
||||||
|
* https://github.com/jbtronics
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace App\Entity;
|
||||||
|
|
||||||
|
use Doctrine\ORM\Mapping as ORM;
|
||||||
|
use Symfony\Component\Security\Core\User\UserInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
|
||||||
|
* @ORM\Table("users")
|
||||||
|
*/
|
||||||
|
class User extends NamedDBElement implements UserInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @ORM\Id()
|
||||||
|
* @ORM\GeneratedValue()
|
||||||
|
* @ORM\Column(type="integer")
|
||||||
|
*/
|
||||||
|
protected $id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ORM\Column(type="string", length=180, unique=true)
|
||||||
|
*/
|
||||||
|
protected $name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* //@ORM\Column(type="json")
|
||||||
|
*/
|
||||||
|
//protected $roles = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string The hashed password
|
||||||
|
* @ORM\Column(type="string")
|
||||||
|
*/
|
||||||
|
protected $password;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string The first name of the User
|
||||||
|
* @ORM\Column(type="string", length=255)
|
||||||
|
*/
|
||||||
|
protected $first_name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string The last name of the User
|
||||||
|
* @ORM\Column(type="string", length=255)
|
||||||
|
*/
|
||||||
|
protected $last_name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string The department the user is working
|
||||||
|
* @ORM\Column(type="string", length=255)
|
||||||
|
*/
|
||||||
|
protected $department;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string The email address of the user
|
||||||
|
* @ORM\Column(type="string", length=255)
|
||||||
|
*/
|
||||||
|
protected $email;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string The language/locale the user prefers
|
||||||
|
* @ORM\Column(type="string", name="config_language")
|
||||||
|
*/
|
||||||
|
protected $language;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string The timezone the user prefers
|
||||||
|
* @ORM\Column(type="string", name="config_timezone")
|
||||||
|
*/
|
||||||
|
protected $timezone;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string The theme
|
||||||
|
* @ORM\Column(type="string", name="config_theme")
|
||||||
|
*/
|
||||||
|
protected $theme;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A visual identifier that represents this user.
|
||||||
|
*
|
||||||
|
* @see UserInterface
|
||||||
|
*/
|
||||||
|
public function getUsername(): string
|
||||||
|
{
|
||||||
|
return (string) $this->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see UserInterface
|
||||||
|
*/
|
||||||
|
public function getRoles(): array
|
||||||
|
{
|
||||||
|
$roles = [];
|
||||||
|
//$roles = $this->roles;
|
||||||
|
// guarantee every user at least has ROLE_USER
|
||||||
|
$roles[] = 'ROLE_USER';
|
||||||
|
|
||||||
|
return array_unique($roles);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setRoles(array $roles): self
|
||||||
|
{
|
||||||
|
//$this->roles = $roles;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see UserInterface
|
||||||
|
*/
|
||||||
|
public function getPassword(): string
|
||||||
|
{
|
||||||
|
return (string) $this->password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setPassword(string $password): self
|
||||||
|
{
|
||||||
|
$this->password = $password;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see UserInterface
|
||||||
|
*/
|
||||||
|
public function getSalt()
|
||||||
|
{
|
||||||
|
// not needed when using the "bcrypt" algorithm in security.yaml
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see UserInterface
|
||||||
|
*/
|
||||||
|
public function eraseCredentials()
|
||||||
|
{
|
||||||
|
// If you store any temporary, sensitive data on the user, clear it here
|
||||||
|
// $this->plainPassword = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the ID as an string, defined by the element class.
|
||||||
|
* This should have a form like P000014, for a part with ID 14.
|
||||||
|
* @return string The ID as a string;
|
||||||
|
*/
|
||||||
|
public function getIDString(): string
|
||||||
|
{
|
||||||
|
return "U" . $this->getID();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/************************************************
|
||||||
|
* Getters
|
||||||
|
************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getFirstName(): string
|
||||||
|
{
|
||||||
|
return $this->first_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $first_name
|
||||||
|
* @return User
|
||||||
|
*/
|
||||||
|
public function setFirstName(string $first_name): User
|
||||||
|
{
|
||||||
|
$this->first_name = $first_name;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getLastName(): string
|
||||||
|
{
|
||||||
|
return $this->last_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $last_name
|
||||||
|
* @return User
|
||||||
|
*/
|
||||||
|
public function setLastName(string $last_name): User
|
||||||
|
{
|
||||||
|
$this->last_name = $last_name;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getDepartment(): string
|
||||||
|
{
|
||||||
|
return $this->department;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $department
|
||||||
|
* @return User
|
||||||
|
*/
|
||||||
|
public function setDepartment(string $department): User
|
||||||
|
{
|
||||||
|
$this->department = $department;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getEmail(): string
|
||||||
|
{
|
||||||
|
return $this->email;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $email
|
||||||
|
* @return User
|
||||||
|
*/
|
||||||
|
public function setEmail(string $email): User
|
||||||
|
{
|
||||||
|
$this->email = $email;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getLanguage(): string
|
||||||
|
{
|
||||||
|
return $this->language;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $language
|
||||||
|
* @return User
|
||||||
|
*/
|
||||||
|
public function setLanguage(string $language): User
|
||||||
|
{
|
||||||
|
$this->language = $language;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getTimezone(): string
|
||||||
|
{
|
||||||
|
return $this->timezone;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $timezone
|
||||||
|
* @return User
|
||||||
|
*/
|
||||||
|
public function setTimezone(string $timezone): User
|
||||||
|
{
|
||||||
|
$this->timezone = $timezone;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getTheme(): string
|
||||||
|
{
|
||||||
|
return $this->theme;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $theme
|
||||||
|
* @return User
|
||||||
|
*/
|
||||||
|
public function setTheme(string $theme): User
|
||||||
|
{
|
||||||
|
$this->theme = $theme;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
50
src/Repository/UserRepository.php
Normal file
50
src/Repository/UserRepository.php
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Repository;
|
||||||
|
|
||||||
|
use App\Entity\User;
|
||||||
|
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
||||||
|
use Symfony\Bridge\Doctrine\RegistryInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method User|null find($id, $lockMode = null, $lockVersion = null)
|
||||||
|
* @method User|null findOneBy(array $criteria, array $orderBy = null)
|
||||||
|
* @method User[] findAll()
|
||||||
|
* @method User[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
|
||||||
|
*/
|
||||||
|
class UserRepository extends ServiceEntityRepository
|
||||||
|
{
|
||||||
|
public function __construct(RegistryInterface $registry)
|
||||||
|
{
|
||||||
|
parent::__construct($registry, User::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**
|
||||||
|
// * @return User[] Returns an array of User objects
|
||||||
|
// */
|
||||||
|
/*
|
||||||
|
public function findByExampleField($value)
|
||||||
|
{
|
||||||
|
return $this->createQueryBuilder('u')
|
||||||
|
->andWhere('u.exampleField = :val')
|
||||||
|
->setParameter('val', $value)
|
||||||
|
->orderBy('u.id', 'ASC')
|
||||||
|
->setMaxResults(10)
|
||||||
|
->getQuery()
|
||||||
|
->getResult()
|
||||||
|
;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
public function findOneBySomeField($value): ?User
|
||||||
|
{
|
||||||
|
return $this->createQueryBuilder('u')
|
||||||
|
->andWhere('u.exampleField = :val')
|
||||||
|
->setParameter('val', $value)
|
||||||
|
->getQuery()
|
||||||
|
->getOneOrNullResult()
|
||||||
|
;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
|
@ -81,16 +81,16 @@
|
||||||
<ul class="navbar-nav ml-3">
|
<ul class="navbar-nav ml-3">
|
||||||
<li class="nav-item dropdown">
|
<li class="nav-item dropdown">
|
||||||
<a href="#" class="dropdown-toggle link-anchor nav-link" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
|
<a href="#" class="dropdown-toggle link-anchor nav-link" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
|
||||||
{% if true %}<i class="fa fa-user" aria-hidden="true"></i>{% else %}<i class="far fa-user" aria-hidden="true"></i>{% endif %} <span class="caret"></span></a>
|
{% if app.user %}<i class="fa fa-user" aria-hidden="true"></i>{% else %}<i class="far fa-user" aria-hidden="true"></i>{% endif %} <span class="caret"></span></a>
|
||||||
<ul class="dropdown-menu dropdown-menu-right" id="login-menu">
|
<ul class="dropdown-menu dropdown-menu-right" id="login-menu">
|
||||||
{% if true %}
|
{% if app.user %}
|
||||||
<a class="dropdown-item disabled" href="#" >{% trans %}user.loggedin.label{% endtrans %} {$firstname} {$lastname} ({$username})</a>
|
<a class="dropdown-item disabled" href="#" >{% trans %}user.loggedin.label{% endtrans %} {{ app.user.firstName }} {{app.user.lastName}} ({{app.user.name}})</a>
|
||||||
<a class="dropdown-item" href="user_settings.php"><i class="fa fa-cogs fa-fw" aria-hidden="true"></i> {% trans %}user.settings.label{% endtrans %}</a>
|
<a class="dropdown-item" href="user_settings.php"><i class="fa fa-cogs fa-fw" aria-hidden="true"></i> {% trans %}user.settings.label{% endtrans %}</a>
|
||||||
<a class="dropdown-item" href="user_info.php"><i class="fa fa-info-circle fa-fw" aria-hidden="true"></i> {% trans %}user.info.label{% endtrans %}</a>
|
<a class="dropdown-item" href="user_info.php"><i class="fa fa-info-circle fa-fw" aria-hidden="true"></i> {% trans %}user.info.label{% endtrans %}</a>
|
||||||
<li role="separator" class="dropdown-divider"></li>
|
<li role="separator" class="dropdown-divider"></li>
|
||||||
<a class="dropdown-item" href="{$relative_path}login.php?logout"><i class="fa fa-sign-out-alt fa-fw" aria-hidden="true"></i> {% trans %}user.logout{% endtrans %}</a>
|
<a class="dropdown-item" href="{{ path('logout') }}"><i class="fa fa-sign-out-alt fa-fw" aria-hidden="true"></i> {% trans %}user.logout{% endtrans %}</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
<a class="dropdown-item" href="{$relative_path}login.php?redirect={$smarty.server.REQUEST_URI|escape:"url"}" id="login-link"><i class="fa fa-sign-in-alt fa-fw" aria-hidden="true"></i> {% trans %}user.login{% endtrans %}</a>
|
<a class="dropdown-item" href="{{ path('login', {'_target_path':app.request.pathinfo}) }}" id="login-link"><i class="fa fa-sign-in-alt fa-fw" aria-hidden="true"></i> {% trans %}user.login{% endtrans %}</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<li role="separator" class="dropdown-divider"></li>
|
<li role="separator" class="dropdown-divider"></li>
|
||||||
<a class="dropdown-item disabled" href="#">{% trans %}user.language_select{% endtrans %}</a>
|
<a class="dropdown-item disabled" href="#">{% trans %}user.language_select{% endtrans %}</a>
|
||||||
|
|
51
templates/security/login.html.twig
Normal file
51
templates/security/login.html.twig
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
{% extends "main_card.html.twig" %}
|
||||||
|
|
||||||
|
{% block title %}{% trans %}login.title{% endtrans %}{% endblock %}
|
||||||
|
|
||||||
|
{% block card_title %}<h5>
|
||||||
|
<i class="fa fa-sign-in-alt fa-fw" aria-hidden="true"></i>
|
||||||
|
{% trans %}login.card_title{% endtrans %}
|
||||||
|
</h5>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
{% if error %}
|
||||||
|
<div class="alert alert-danger" role="alert">
|
||||||
|
<strong>{{ error.messageKey|trans(error.messageData, 'security') }}</strong>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{{ parent() }}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block card_content %}
|
||||||
|
<form action="{{ path('login') }}" method="post" class="form-hor">
|
||||||
|
|
||||||
|
<input type="hidden" name="_csrf_token"
|
||||||
|
value="{{ csrf_token('authenticate') }}">
|
||||||
|
|
||||||
|
<input type="hidden" name="_target_path" value="{{ app.request.query.get('_target_path') }}" />
|
||||||
|
|
||||||
|
<div class="form-group row">
|
||||||
|
<label class="col-form-label col-md-3 col-lg-2">{% trans %}login.username.label{% endtrans %}</label>
|
||||||
|
<div class="col-md-9 col-lg-10">
|
||||||
|
<input type="text" class="form-control" name="_username" value="{{ last_username }}"
|
||||||
|
placeholder="{% trans %}login.username.placeholder{% endtrans %}" autocomplete="username">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group row">
|
||||||
|
<label class="col-form-label col-md-3 col-lg-2">{% trans %}login.password.label{% endtrans %}</label>
|
||||||
|
<div class="col-md-9 col-lg-10">
|
||||||
|
<input type="password" class="form-control" placeholder="{% trans %}login.password.placeholder{% endtrans %}" name="_password"
|
||||||
|
autocomplete="current-password">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group row">
|
||||||
|
<div class="col-md-9 offset-md-3 col-lg-10 offset-lg-2">
|
||||||
|
<button type="submit" class="btn btn-primary">{% trans %}login.btn{% endtrans %}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
{% endblock %}
|
|
@ -517,5 +517,47 @@
|
||||||
<target>Neues Bauteil erstellen</target>
|
<target>Neues Bauteil erstellen</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="6Ks0rFM" name="login.username.label">
|
||||||
|
<segment>
|
||||||
|
<source>login.username.label</source>
|
||||||
|
<target>Benutzername</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="JUuJUUV" name="login.username.placeholder">
|
||||||
|
<segment>
|
||||||
|
<source>login.username.placeholder</source>
|
||||||
|
<target>Benutzername</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="HJtrGOc" name="login.password.label">
|
||||||
|
<segment>
|
||||||
|
<source>login.password.label</source>
|
||||||
|
<target>Passwort</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="8SD.6EK" name="login.password.placeholder">
|
||||||
|
<segment>
|
||||||
|
<source>login.password.placeholder</source>
|
||||||
|
<target>Passwort</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="XtrGxkd" name="login.btn">
|
||||||
|
<segment>
|
||||||
|
<source>login.btn</source>
|
||||||
|
<target>Login</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="nDK0G.T" name="login.card_title">
|
||||||
|
<segment>
|
||||||
|
<source>login.card_title</source>
|
||||||
|
<target>Login</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Kd99AFq" name="login.title">
|
||||||
|
<segment>
|
||||||
|
<source>login.title</source>
|
||||||
|
<target>Login</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|
|
@ -1,326 +1,521 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="en">
|
||||||
<file source-language="en" target-language="en" datatype="plaintext" original="file.ext">
|
<file id="messages.en">
|
||||||
<header>
|
<unit id="cElTSD4" name="sidebar.toggle">
|
||||||
<tool tool-id="symfony" tool-name="Symfony"/>
|
<segment>
|
||||||
</header>
|
|
||||||
<body>
|
|
||||||
<trans-unit id="cElTSD4" resname="sidebar.toggle">
|
|
||||||
<source>sidebar.toggle</source>
|
<source>sidebar.toggle</source>
|
||||||
<target state="translated">Toggle Sidebar</target>
|
<target state="translated">Toggle Sidebar</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="el2uFyW" resname="search.options.label">
|
</unit>
|
||||||
|
<unit id="el2uFyW" name="search.options.label">
|
||||||
|
<segment>
|
||||||
<source>search.options.label</source>
|
<source>search.options.label</source>
|
||||||
<target state="translated">Search options</target>
|
<target state="translated">Search options</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="kTRK6H_" resname="name.label">
|
</unit>
|
||||||
|
<unit id="kTRK6H_" name="name.label">
|
||||||
|
<segment>
|
||||||
<source>name.label</source>
|
<source>name.label</source>
|
||||||
<target state="translated">Name</target>
|
<target state="translated">Name</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="ZY57BXc" resname="category.label">
|
</unit>
|
||||||
|
<unit id="ZY57BXc" name="category.label">
|
||||||
|
<segment>
|
||||||
<source>category.label</source>
|
<source>category.label</source>
|
||||||
<target state="translated">Category</target>
|
<target state="translated">Category</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="LSnWIG7" resname="description.label">
|
</unit>
|
||||||
|
<unit id="LSnWIG7" name="description.label">
|
||||||
|
<segment>
|
||||||
<source>description.label</source>
|
<source>description.label</source>
|
||||||
<target state="translated">Description</target>
|
<target state="translated">Description</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="RezjOdV" resname="storelocation.label">
|
</unit>
|
||||||
|
<unit id="RezjOdV" name="storelocation.label">
|
||||||
|
<segment>
|
||||||
<source>storelocation.label</source>
|
<source>storelocation.label</source>
|
||||||
<target state="translated">Store location</target>
|
<target state="translated">Store location</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="BWS7Lck" resname="comment.label">
|
</unit>
|
||||||
|
<unit id="BWS7Lck" name="comment.label">
|
||||||
|
<segment>
|
||||||
<source>comment.label</source>
|
<source>comment.label</source>
|
||||||
<target state="translated">Comment</target>
|
<target state="translated">Comment</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="z1DQ7QF" resname="ordernumber.label.short">
|
</unit>
|
||||||
|
<unit id="z1DQ7QF" name="ordernumber.label.short">
|
||||||
|
<segment>
|
||||||
<source>ordernumber.label.short</source>
|
<source>ordernumber.label.short</source>
|
||||||
<target state="translated">Ordernr.</target>
|
<target state="translated">Ordernr.</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="zT4k8ZJ" resname="supplier.label">
|
</unit>
|
||||||
|
<unit id="zT4k8ZJ" name="supplier.label">
|
||||||
|
<segment>
|
||||||
<source>supplier.label</source>
|
<source>supplier.label</source>
|
||||||
<target state="translated">Supplier</target>
|
<target state="translated">Supplier</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="WB3sH1G" resname="manufacturer.label">
|
</unit>
|
||||||
|
<unit id="WB3sH1G" name="manufacturer.label">
|
||||||
|
<segment>
|
||||||
<source>manufacturer.label</source>
|
<source>manufacturer.label</source>
|
||||||
<target state="translated">Manufacturer</target>
|
<target state="translated">Manufacturer</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="griVyRf" resname="footprint.label">
|
</unit>
|
||||||
|
<unit id="griVyRf" name="footprint.label">
|
||||||
|
<segment>
|
||||||
<source>footprint.label</source>
|
<source>footprint.label</source>
|
||||||
<target state="translated">Footprint</target>
|
<target state="translated">Footprint</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="Bs5QvO0" resname="search.deactivateBarcode">
|
</unit>
|
||||||
|
<unit id="Bs5QvO0" name="search.deactivateBarcode">
|
||||||
|
<segment>
|
||||||
<source>search.deactivateBarcode</source>
|
<source>search.deactivateBarcode</source>
|
||||||
<target state="translated">Deact. Barcode</target>
|
<target state="translated">Deact. Barcode</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="biFM.cv" resname="search.regexmatching">
|
</unit>
|
||||||
|
<unit id="biFM.cv" name="search.regexmatching">
|
||||||
|
<segment>
|
||||||
<source>search.regexmatching</source>
|
<source>search.regexmatching</source>
|
||||||
<target state="translated">Reg.Ex. Matching</target>
|
<target state="translated">Reg.Ex. Matching</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="rOLpDSq" resname="go.exclamation">
|
</unit>
|
||||||
|
<unit id="rOLpDSq" name="go.exclamation">
|
||||||
|
<segment>
|
||||||
<source>go.exclamation</source>
|
<source>go.exclamation</source>
|
||||||
<target state="translated">Go!</target>
|
<target state="translated">Go!</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="iqU5ScK" resname="barcode.scan">
|
</unit>
|
||||||
|
<unit id="iqU5ScK" name="barcode.scan">
|
||||||
|
<segment>
|
||||||
<source>barcode.scan</source>
|
<source>barcode.scan</source>
|
||||||
<target state="translated">Scan Barcode</target>
|
<target state="translated">Scan Barcode</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="PRvW.EI" resname="user.loggedin.label">
|
</unit>
|
||||||
|
<unit id="PRvW.EI" name="user.loggedin.label">
|
||||||
|
<segment>
|
||||||
<source>user.loggedin.label</source>
|
<source>user.loggedin.label</source>
|
||||||
<target state="translated">Logged in as</target>
|
<target state="translated">Logged in as</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="4fEJHYJ" resname="user.settings.label">
|
</unit>
|
||||||
|
<unit id="4fEJHYJ" name="user.settings.label">
|
||||||
|
<segment>
|
||||||
<source>user.settings.label</source>
|
<source>user.settings.label</source>
|
||||||
<target state="translated">User settings</target>
|
<target state="translated">User settings</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="_M8LV3f" resname="user.info.label">
|
</unit>
|
||||||
|
<unit id="_M8LV3f" name="user.info.label">
|
||||||
|
<segment>
|
||||||
<source>user.info.label</source>
|
<source>user.info.label</source>
|
||||||
<target state="translated">User informations</target>
|
<target state="translated">User informations</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="okzpfQC" resname="user.logout">
|
</unit>
|
||||||
|
<unit id="okzpfQC" name="user.logout">
|
||||||
|
<segment>
|
||||||
<source>user.logout</source>
|
<source>user.logout</source>
|
||||||
<target state="translated">Logout</target>
|
<target state="translated">Logout</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="rruB2OR" resname="user.login">
|
</unit>
|
||||||
|
<unit id="rruB2OR" name="user.login">
|
||||||
|
<segment>
|
||||||
<source>user.login</source>
|
<source>user.login</source>
|
||||||
<target state="translated">Login</target>
|
<target state="translated">Login</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="DFDnILM" resname="categories.label">
|
</unit>
|
||||||
|
<unit id="DFDnILM" name="categories.label">
|
||||||
|
<segment>
|
||||||
<source>categories.label</source>
|
<source>categories.label</source>
|
||||||
<target state="translated">Categories</target>
|
<target state="translated">Categories</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="Kw3N1AA" resname="actions">
|
</unit>
|
||||||
|
<unit id="Kw3N1AA" name="actions">
|
||||||
|
<segment>
|
||||||
<source>actions</source>
|
<source>actions</source>
|
||||||
<target state="translated">Actions</target>
|
<target state="translated">Actions</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="10f_Ka3" resname="expandAll">
|
</unit>
|
||||||
|
<unit id="10f_Ka3" name="expandAll">
|
||||||
|
<segment>
|
||||||
<source>expandAll</source>
|
<source>expandAll</source>
|
||||||
<target state="translated">Expand All</target>
|
<target state="translated">Expand All</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="eS_kUcS" resname="reduceAll">
|
</unit>
|
||||||
|
<unit id="eS_kUcS" name="reduceAll">
|
||||||
|
<segment>
|
||||||
<source>reduceAll</source>
|
<source>reduceAll</source>
|
||||||
<target state="translated">Reduce All</target>
|
<target state="translated">Reduce All</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id=".x0rFcf" resname="datasource">
|
</unit>
|
||||||
|
<unit id=".x0rFcf" name="datasource">
|
||||||
|
<segment>
|
||||||
<source>datasource</source>
|
<source>datasource</source>
|
||||||
<target state="translated">Datasource</target>
|
<target state="translated">Datasource</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="OllfX2C" resname="category.labelp">
|
</unit>
|
||||||
|
<unit id="OllfX2C" name="category.labelp">
|
||||||
|
<segment>
|
||||||
<source>category.labelp</source>
|
<source>category.labelp</source>
|
||||||
<target state="translated">Categories</target>
|
<target state="translated">Categories</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="vZGwiMS" resname="storelocation.labelp">
|
</unit>
|
||||||
|
<unit id="vZGwiMS" name="storelocation.labelp">
|
||||||
|
<segment>
|
||||||
<source>storelocation.labelp</source>
|
<source>storelocation.labelp</source>
|
||||||
<target state="translated">Storelocations</target>
|
<target state="translated">Storelocations</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="ZJ9SPOS" resname="footprint.labelp">
|
</unit>
|
||||||
|
<unit id="ZJ9SPOS" name="footprint.labelp">
|
||||||
|
<segment>
|
||||||
<source>footprint.labelp</source>
|
<source>footprint.labelp</source>
|
||||||
<target state="translated">Footprints</target>
|
<target state="translated">Footprints</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="NSnSQf4" resname="manufacturer.labelp">
|
</unit>
|
||||||
|
<unit id="NSnSQf4" name="manufacturer.labelp">
|
||||||
|
<segment>
|
||||||
<source>manufacturer.labelp</source>
|
<source>manufacturer.labelp</source>
|
||||||
<target state="translated">Manufacturers</target>
|
<target state="translated">Manufacturers</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="DQQjhS_" resname="supplier.labelp">
|
</unit>
|
||||||
|
<unit id="DQQjhS_" name="supplier.labelp">
|
||||||
|
<segment>
|
||||||
<source>supplier.labelp</source>
|
<source>supplier.labelp</source>
|
||||||
<target state="translated">Suppliers</target>
|
<target state="translated">Suppliers</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="g6tt4u1" resname="device.labelp">
|
</unit>
|
||||||
|
<unit id="g6tt4u1" name="device.labelp">
|
||||||
|
<segment>
|
||||||
<source>device.labelp</source>
|
<source>device.labelp</source>
|
||||||
<target state="translated">Devices</target>
|
<target state="translated">Devices</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="__OuWRw" resname="tools.label">
|
</unit>
|
||||||
|
<unit id="__OuWRw" name="tools.label">
|
||||||
|
<segment>
|
||||||
<source>tools.label</source>
|
<source>tools.label</source>
|
||||||
<target state="translated">Tools</target>
|
<target state="translated">Tools</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="xndYXfF" resname="expandall">
|
</unit>
|
||||||
|
<unit id="xndYXfF" name="expandall">
|
||||||
|
<segment>
|
||||||
<source>expandall</source>
|
<source>expandall</source>
|
||||||
<target state="translated">Expand All</target>
|
<target state="translated">Expand All</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="ZdJ4vzs" resname="reduceall">
|
</unit>
|
||||||
|
<unit id="ZdJ4vzs" name="reduceall">
|
||||||
|
<segment>
|
||||||
<source>reduceall</source>
|
<source>reduceall</source>
|
||||||
<target state="translated">Reduce All</target>
|
<target state="translated">Reduce All</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="JUGwseE" resname="tools.labelp">
|
</unit>
|
||||||
|
<unit id="JUGwseE" name="tools.labelp">
|
||||||
|
<segment>
|
||||||
<source>tools.labelp</source>
|
<source>tools.labelp</source>
|
||||||
<target state="translated">Tools</target>
|
<target state="translated">Tools</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="ZQMol4U" resname="vendor.base.javascript_hint">
|
</unit>
|
||||||
|
<unit id="ZQMol4U" name="vendor.base.javascript_hint">
|
||||||
|
<segment>
|
||||||
<source>vendor.base.javascript_hint</source>
|
<source>vendor.base.javascript_hint</source>
|
||||||
<target state="translated">Please activate Javascript to use all features!</target>
|
<target state="translated">Please activate Javascript to use all features!</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="UoflU8w" resname="part.info.title">
|
</unit>
|
||||||
|
<unit id="UoflU8w" name="part.info.title">
|
||||||
|
<segment>
|
||||||
<source>part.info.title</source>
|
<source>part.info.title</source>
|
||||||
<target state="translated">Detail info for part</target>
|
<target state="translated">Detail info for part</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="2y0kouO" resname="id.label">
|
</unit>
|
||||||
|
<unit id="2y0kouO" name="id.label">
|
||||||
|
<segment>
|
||||||
<source>id.label</source>
|
<source>id.label</source>
|
||||||
<target state="translated">ID</target>
|
<target state="translated">ID</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="J.AXbaM" resname="instock.label">
|
</unit>
|
||||||
|
<unit id="J.AXbaM" name="instock.label">
|
||||||
|
<segment>
|
||||||
<source>instock.label</source>
|
<source>instock.label</source>
|
||||||
<target state="translated">Instock</target>
|
<target state="translated">Instock</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="VYcxdrz" resname="mininstock.label">
|
</unit>
|
||||||
|
<unit id="VYcxdrz" name="mininstock.label">
|
||||||
|
<segment>
|
||||||
<source>mininstock.label</source>
|
<source>mininstock.label</source>
|
||||||
<target state="translated">Minimum Instock</target>
|
<target state="translated">Minimum Instock</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="LL2dt8U" resname="part.avg_price.label">
|
</unit>
|
||||||
|
<unit id="LL2dt8U" name="part.avg_price.label">
|
||||||
|
<segment>
|
||||||
<source>part.avg_price.label</source>
|
<source>part.avg_price.label</source>
|
||||||
<target state="translated">Average Price</target>
|
<target state="translated">Average Price</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="MZz0rtU" resname="attachment.labelp">
|
</unit>
|
||||||
|
<unit id="MZz0rtU" name="attachment.labelp">
|
||||||
|
<segment>
|
||||||
<source>attachment.labelp</source>
|
<source>attachment.labelp</source>
|
||||||
<target state="translated">Attachments</target>
|
<target state="translated">Attachments</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="b5.SSzx" resname="vendor.partinfo.shopping_infos">
|
</unit>
|
||||||
|
<unit id="b5.SSzx" name="vendor.partinfo.shopping_infos">
|
||||||
|
<segment>
|
||||||
<source>vendor.partinfo.shopping_infos</source>
|
<source>vendor.partinfo.shopping_infos</source>
|
||||||
<target state="translated">Shopping informations</target>
|
<target state="translated">Shopping informations</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="1Soir6U" resname="vendor.partinfo.history">
|
</unit>
|
||||||
|
<unit id="1Soir6U" name="vendor.partinfo.history">
|
||||||
|
<segment>
|
||||||
<source>vendor.partinfo.history</source>
|
<source>vendor.partinfo.history</source>
|
||||||
<target state="translated">History</target>
|
<target state="translated">History</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="4ixhjeS" resname="part.delete.caption">
|
</unit>
|
||||||
|
<unit id="4ixhjeS" name="part.delete.caption">
|
||||||
|
<segment>
|
||||||
<source>part.delete.caption</source>
|
<source>part.delete.caption</source>
|
||||||
<target state="translated">Delete Part</target>
|
<target state="translated">Delete Part</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="CP6LfDs" resname="part.delete.btn">
|
</unit>
|
||||||
|
<unit id="CP6LfDs" name="part.delete.btn">
|
||||||
|
<segment>
|
||||||
<source>part.delete.btn</source>
|
<source>part.delete.btn</source>
|
||||||
<target state="translated">Delete Part</target>
|
<target state="translated">Delete Part</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="eG9UnaY" resname="part.withdraw.caption:">
|
</unit>
|
||||||
|
<unit id="eG9UnaY" name="part.withdraw.caption:">
|
||||||
|
<segment>
|
||||||
<source>part.withdraw.caption:</source>
|
<source>part.withdraw.caption:</source>
|
||||||
<target state="translated">Withdraw parts:</target>
|
<target state="translated">Withdraw parts:</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="7TiUzGF" resname="part.withdraw.btn">
|
</unit>
|
||||||
|
<unit id="7TiUzGF" name="part.withdraw.btn">
|
||||||
|
<segment>
|
||||||
<source>part.withdraw.btn</source>
|
<source>part.withdraw.btn</source>
|
||||||
<target state="translated">Withdraw</target>
|
<target state="translated">Withdraw</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="RVKdVNt" resname="part.withdraw.comment:">
|
</unit>
|
||||||
|
<unit id="RVKdVNt" name="part.withdraw.comment:">
|
||||||
|
<segment>
|
||||||
<source>part.withdraw.comment:</source>
|
<source>part.withdraw.comment:</source>
|
||||||
<target state="translated">Comment/Purpose</target>
|
<target state="translated">Comment/Purpose</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="kXcojTi" resname="part.add.caption">
|
</unit>
|
||||||
|
<unit id="kXcojTi" name="part.add.caption">
|
||||||
|
<segment>
|
||||||
<source>part.add.caption</source>
|
<source>part.add.caption</source>
|
||||||
<target state="translated">Add parts</target>
|
<target state="translated">Add parts</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="rYoCVp9" resname="part.add.btn">
|
</unit>
|
||||||
|
<unit id="rYoCVp9" name="part.add.btn">
|
||||||
|
<segment>
|
||||||
<source>part.add.btn</source>
|
<source>part.add.btn</source>
|
||||||
<target state="translated">Add</target>
|
<target state="translated">Add</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="4CUEJg5" resname="part.add.comment">
|
</unit>
|
||||||
|
<unit id="4CUEJg5" name="part.add.comment">
|
||||||
|
<segment>
|
||||||
<source>part.add.comment</source>
|
<source>part.add.comment</source>
|
||||||
<target state="translated">Comment/Purpose</target>
|
<target state="translated">Comment/Purpose</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="cMLFYZw" resname="createdAt">
|
</unit>
|
||||||
|
<unit id="cMLFYZw" name="createdAt">
|
||||||
|
<segment>
|
||||||
<source>createdAt</source>
|
<source>createdAt</source>
|
||||||
<target state="translated">Created At</target>
|
<target state="translated">Created At</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="ZcUFNEJ" resname="lastModified">
|
</unit>
|
||||||
|
<unit id="ZcUFNEJ" name="lastModified">
|
||||||
|
<segment>
|
||||||
<source>lastModified</source>
|
<source>lastModified</source>
|
||||||
<target state="translated">Last modified</target>
|
<target state="translated">Last modified</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="lQ8QeGr" resname="search.placeholder">
|
</unit>
|
||||||
|
<unit id="lQ8QeGr" name="search.placeholder">
|
||||||
|
<segment>
|
||||||
<source>search.placeholder</source>
|
<source>search.placeholder</source>
|
||||||
<target state="translated">Search</target>
|
<target state="translated">Search</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="nZxWuSY" resname="instock.label_short">
|
</unit>
|
||||||
|
<unit id="nZxWuSY" name="instock.label_short">
|
||||||
|
<segment>
|
||||||
<source>instock.label_short</source>
|
<source>instock.label_short</source>
|
||||||
<target state="translated">Instock</target>
|
<target state="translated">Instock</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="ryY3rJ_" resname="mininstock.label_short">
|
</unit>
|
||||||
|
<unit id="ryY3rJ_" name="mininstock.label_short">
|
||||||
|
<segment>
|
||||||
<source>mininstock.label_short</source>
|
<source>mininstock.label_short</source>
|
||||||
<target state="translated">Min Instock</target>
|
<target state="translated">Min Instock</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="oabvQfM" resname="user.language_select">
|
</unit>
|
||||||
|
<unit id="oabvQfM" name="user.language_select">
|
||||||
|
<segment>
|
||||||
<source>user.language_select</source>
|
<source>user.language_select</source>
|
||||||
<target state="translated">Switch Language</target>
|
<target state="translated">Switch Language</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="rMCnZt." resname="language.english">
|
</unit>
|
||||||
|
<unit id="rMCnZt." name="language.english">
|
||||||
|
<segment>
|
||||||
<source>language.english</source>
|
<source>language.english</source>
|
||||||
<target state="translated">English</target>
|
<target state="translated">English</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="OmHgIys" resname="language.german">
|
</unit>
|
||||||
|
<unit id="OmHgIys" name="language.german">
|
||||||
|
<segment>
|
||||||
<source>language.german</source>
|
<source>language.german</source>
|
||||||
<target state="translated">German</target>
|
<target state="translated">German</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="Qj.Hpb." resname="version.caption">
|
</unit>
|
||||||
|
<unit id="Qj.Hpb." name="version.caption">
|
||||||
|
<segment>
|
||||||
<source>version.caption</source>
|
<source>version.caption</source>
|
||||||
<target state="translated">Version</target>
|
<target state="translated">Version</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="GDYG7.b" resname="homepage.license">
|
</unit>
|
||||||
|
<unit id="GDYG7.b" name="homepage.license">
|
||||||
|
<segment>
|
||||||
<source>homepage.license</source>
|
<source>homepage.license</source>
|
||||||
<target state="translated">License information</target>
|
<target state="translated">License information</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="5nDb2pj" resname="homepage.github.caption">
|
</unit>
|
||||||
|
<unit id="5nDb2pj" name="homepage.github.caption">
|
||||||
|
<segment>
|
||||||
<source>homepage.github.caption</source>
|
<source>homepage.github.caption</source>
|
||||||
<target state="translated">Project page</target>
|
<target state="translated">Project page</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="7nCeHg7" resname="homepage.github.text">
|
</unit>
|
||||||
|
<unit id="7nCeHg7" name="homepage.github.text">
|
||||||
|
<segment>
|
||||||
<source>homepage.github.text</source>
|
<source>homepage.github.text</source>
|
||||||
<target state="translated">Downloads, bugreports, to-do-list etc. can be found on <a href="%href%" class="link-external" target="_blank">GitHub project page</a></target>
|
<target state="translated"><![CDATA[Downloads, bugreports, to-do-list etc. can be found on <a href="%href%" class="link-external" target="_blank">GitHub project page</a>]]></target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="9pp.6vF" resname="homepage.help.caption">
|
</unit>
|
||||||
|
<unit id="9pp.6vF" name="homepage.help.caption">
|
||||||
|
<segment>
|
||||||
<source>homepage.help.caption</source>
|
<source>homepage.help.caption</source>
|
||||||
<target state="translated">Help</target>
|
<target state="translated">Help</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="exp3iqv" resname="homepage.help.text">
|
</unit>
|
||||||
|
<unit id="exp3iqv" name="homepage.help.text">
|
||||||
|
<segment>
|
||||||
<source>homepage.help.text</source>
|
<source>homepage.help.text</source>
|
||||||
<target state="translated">Help and tips can be found in Wiki the <a href="%href%" class="link-external" target="_blank">GitHub page</a> </target>
|
<target state="translated"><![CDATA[Help and tips can be found in Wiki the <a href="%href%" class="link-external" target="_blank">GitHub page</a> ]]></target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="R2g.45a" resname="homepage.forum.caption">
|
</unit>
|
||||||
|
<unit id="R2g.45a" name="homepage.forum.caption">
|
||||||
|
<segment>
|
||||||
<source>homepage.forum.caption</source>
|
<source>homepage.forum.caption</source>
|
||||||
<target state="translated">Forum</target>
|
<target state="translated">Forum</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="nfBdkzp" resname="homepage.forum.text">
|
</unit>
|
||||||
|
<unit id="nfBdkzp" name="homepage.forum.text">
|
||||||
|
<segment>
|
||||||
<source>homepage.forum.text</source>
|
<source>homepage.forum.text</source>
|
||||||
<target state="translated">For questions about the Part-DB there is a thread on <a href="%href%" class="link-external" target="_blank">mikrocontroller.net</a></target>
|
<target state="translated"><![CDATA[For questions about the Part-DB there is a thread on <a href="%href%" class="link-external" target="_blank">mikrocontroller.net</a>]]></target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="exDsVQ3" resname="homepage.wiki.caption">
|
</unit>
|
||||||
|
<unit id="exDsVQ3" name="homepage.wiki.caption">
|
||||||
|
<segment>
|
||||||
<source>homepage.wiki.caption</source>
|
<source>homepage.wiki.caption</source>
|
||||||
<target state="translated">Wiki</target>
|
<target state="translated">Wiki</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="tdI0IlW" resname="homepage.wiki.text">
|
</unit>
|
||||||
|
<unit id="tdI0IlW" name="homepage.wiki.text">
|
||||||
|
<segment>
|
||||||
<source>homepage.wiki.text</source>
|
<source>homepage.wiki.text</source>
|
||||||
<target state="translated">Further information is available in <a href="%href%" class="link-external" target="_blank">mikrocontroller.net Article</a></target>
|
<target state="translated"><![CDATA[Further information is available in <a href="%href%" class="link-external" target="_blank">mikrocontroller.net Article</a>]]></target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="gAFUu2a" resname="homepage.basedOn">
|
</unit>
|
||||||
|
<unit id="gAFUu2a" name="homepage.basedOn">
|
||||||
|
<segment>
|
||||||
<source>homepage.basedOn</source>
|
<source>homepage.basedOn</source>
|
||||||
<target state="translated">Based on the original Part-DB created by</target>
|
<target state="translated">Based on the original Part-DB created by</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="PlY3xmo" resname="homepage.others">
|
</unit>
|
||||||
|
<unit id="PlY3xmo" name="homepage.others">
|
||||||
|
<segment>
|
||||||
<source>homepage.others</source>
|
<source>homepage.others</source>
|
||||||
<target state="translated">and others</target>
|
<target state="translated">and others</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="79bMpjW" resname="part_list.loading.caption">
|
</unit>
|
||||||
|
<unit id="79bMpjW" name="part_list.loading.caption">
|
||||||
|
<segment>
|
||||||
<source>part_list.loading.caption</source>
|
<source>part_list.loading.caption</source>
|
||||||
<target state="translated">Loading</target>
|
<target state="translated">Loading</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit id="dJ3yFo4" resname="part_list.loading.message">
|
</unit>
|
||||||
|
<unit id="dJ3yFo4" name="part_list.loading.message">
|
||||||
|
<segment>
|
||||||
<source>part_list.loading.message</source>
|
<source>part_list.loading.message</source>
|
||||||
<target state="translated">This can take a moment. If this message do not disappear, try to reload the page.</target>
|
<target state="translated">This can take a moment. If this message do not disappear, try to reload the page.</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit resname="flash.success" id="flash.success">
|
</unit>
|
||||||
|
<unit id="g4ahva6" name="flash.success">
|
||||||
|
<segment>
|
||||||
<source>flash.success</source>
|
<source>flash.success</source>
|
||||||
<target state="translated">Success</target>
|
<target state="translated">Success</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit resname="flash.error" id="flash.error">
|
</unit>
|
||||||
|
<unit id="NehzWgk" name="flash.error">
|
||||||
|
<segment>
|
||||||
<source>flash.error</source>
|
<source>flash.error</source>
|
||||||
<target state="translated">Error</target>
|
<target state="translated">Error</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit resname="flash.warning" id="flash.warning">
|
</unit>
|
||||||
|
<unit id="h8vhq_r" name="flash.warning">
|
||||||
|
<segment>
|
||||||
<source>flash.warning</source>
|
<source>flash.warning</source>
|
||||||
<target state="translated">Warning</target>
|
<target state="translated">Warning</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit resname="flash.notice" id="flash.notice">
|
</unit>
|
||||||
|
<unit id="m5p2YEz" name="flash.notice">
|
||||||
|
<segment>
|
||||||
<source>flash.notice</source>
|
<source>flash.notice</source>
|
||||||
<target state="translated">Notice</target>
|
<target state="translated">Notice</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
<trans-unit resname="flash.info" id="flash.info">
|
</unit>
|
||||||
|
<unit id="YA5xZMy" name="flash.info">
|
||||||
|
<segment>
|
||||||
<source>flash.info</source>
|
<source>flash.info</source>
|
||||||
<target state="translated">Info</target>
|
<target state="translated">Info</target>
|
||||||
</trans-unit>
|
</segment>
|
||||||
</body>
|
</unit>
|
||||||
|
<unit id="Kd99AFq" name="login.title">
|
||||||
|
<segment>
|
||||||
|
<source>login.title</source>
|
||||||
|
<target>Login</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="nDK0G.T" name="login.card_title">
|
||||||
|
<segment>
|
||||||
|
<source>login.card_title</source>
|
||||||
|
<target>Login</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="6Ks0rFM" name="login.username.label">
|
||||||
|
<segment>
|
||||||
|
<source>login.username.label</source>
|
||||||
|
<target>Username</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="JUuJUUV" name="login.username.placeholder">
|
||||||
|
<segment>
|
||||||
|
<source>login.username.placeholder</source>
|
||||||
|
<target>Username</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="HJtrGOc" name="login.password.label">
|
||||||
|
<segment>
|
||||||
|
<source>login.password.label</source>
|
||||||
|
<target>Password</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="8SD.6EK" name="login.password.placeholder">
|
||||||
|
<segment>
|
||||||
|
<source>login.password.placeholder</source>
|
||||||
|
<target>Password</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="XtrGxkd" name="login.btn">
|
||||||
|
<segment>
|
||||||
|
<source>login.btn</source>
|
||||||
|
<target>Login</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue