Merge branch 'develop' into snipeit_v7

This commit is contained in:
Brady Wetherington 2023-06-28 14:25:33 +01:00
commit 51424d01a9
1077 changed files with 5920 additions and 3162 deletions

View file

@ -14,6 +14,11 @@ on:
- master
- develop
pull_request:
branches:
- master
- develop
pipeline:
- name: Setup
cmd: |

View file

@ -71,7 +71,8 @@ class AssetMaintenancesController extends Controller
'asset_tag',
'asset_name',
'user_id',
'supplier'
'supplier',
'is_warranty',
];
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
$sort = in_array($request->input('sort'), $allowed_columns) ? e($request->input('sort')) : 'created_at';

View file

@ -136,68 +136,6 @@ class AssetsController extends Controller
}
}
if ($request->filled('status_id')) {
$assets->where('assets.status_id', '=', $request->input('status_id'));
}
if ($request->filled('asset_tag')) {
$assets->where('assets.asset_tag', '=', $request->input('asset_tag'));
}
if ($request->filled('serial')) {
$assets->where('assets.serial', '=', $request->input('serial'));
}
if ($request->input('requestable') == 'true') {
$assets->where('assets.requestable', '=', '1');
}
if ($request->filled('model_id')) {
$assets->InModelList([$request->input('model_id')]);
}
if ($request->filled('category_id')) {
$assets->InCategory($request->input('category_id'));
}
if ($request->filled('location_id')) {
$assets->where('assets.location_id', '=', $request->input('location_id'));
}
if ($request->filled('rtd_location_id')) {
$assets->where('assets.rtd_location_id', '=', $request->input('rtd_location_id'));
}
if ($request->filled('supplier_id')) {
$assets->where('assets.supplier_id', '=', $request->input('supplier_id'));
}
if ($request->filled('asset_eol_date')) {
$assets->where('assets.asset_eol_date', '=', $request->input('asset_eol_date'));
}
if (($request->filled('assigned_to')) && ($request->filled('assigned_type'))) {
$assets->where('assets.assigned_to', '=', $request->input('assigned_to'))
->where('assets.assigned_type', '=', $request->input('assigned_type'));
}
if ($request->filled('company_id')) {
$assets->where('assets.company_id', '=', $request->input('company_id'));
}
if ($request->filled('manufacturer_id')) {
$assets->ByManufacturer($request->input('manufacturer_id'));
}
if ($request->filled('depreciation_id')) {
$assets->ByDepreciationId($request->input('depreciation_id'));
}
if ($request->filled('byod')) {
$assets->where('assets.byod', '=', $request->input('byod'));
}
$request->filled('order_number') ? $assets = $assets->where('assets.order_number', '=', e($request->get('order_number'))) : '';
// Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $assets->count()) ? $assets->count() : abs($request->input('offset'));
@ -300,6 +238,71 @@ class AssetsController extends Controller
$assets->TextSearch($request->input('search'));
}
// Leave these under the TextSearch scope, else the fuzziness will override the specific ID (status ID, etc) requested
if ($request->filled('status_id')) {
$assets->where('assets.status_id', '=', $request->input('status_id'));
}
if ($request->filled('asset_tag')) {
$assets->where('assets.asset_tag', '=', $request->input('asset_tag'));
}
if ($request->filled('serial')) {
$assets->where('assets.serial', '=', $request->input('serial'));
}
if ($request->input('requestable') == 'true') {
$assets->where('assets.requestable', '=', '1');
}
if ($request->filled('model_id')) {
$assets->InModelList([$request->input('model_id')]);
}
if ($request->filled('category_id')) {
$assets->InCategory($request->input('category_id'));
}
if ($request->filled('location_id')) {
$assets->where('assets.location_id', '=', $request->input('location_id'));
}
if ($request->filled('rtd_location_id')) {
$assets->where('assets.rtd_location_id', '=', $request->input('rtd_location_id'));
}
if ($request->filled('supplier_id')) {
$assets->where('assets.supplier_id', '=', $request->input('supplier_id'));
}
if ($request->filled('asset_eol_date')) {
$assets->where('assets.asset_eol_date', '=', $request->input('asset_eol_date'));
}
if (($request->filled('assigned_to')) && ($request->filled('assigned_type'))) {
$assets->where('assets.assigned_to', '=', $request->input('assigned_to'))
->where('assets.assigned_type', '=', $request->input('assigned_type'));
}
if ($request->filled('company_id')) {
$assets->where('assets.company_id', '=', $request->input('company_id'));
}
if ($request->filled('manufacturer_id')) {
$assets->ByManufacturer($request->input('manufacturer_id'));
}
if ($request->filled('depreciation_id')) {
$assets->ByDepreciationId($request->input('depreciation_id'));
}
if ($request->filled('byod')) {
$assets->where('assets.byod', '=', $request->input('byod'));
}
if ($request->filled('order_number')) {
$assets->where('assets.order_number', '=', $request->get('order_number'));
}
// This is kinda gross, but we need to do this because the Bootstrap Tables
// API passes custom field ordering as custom_fields.fieldname, and we have to strip

View file

@ -38,6 +38,16 @@ class Importer extends Component
public $field_map; // we need a separate variable for the field-mapping, because the keys in the normal array are too complicated for Livewire to understand
public $file_id; // TODO: I can't figure out *why* we need this, but it really seems like we do. I can't seem to pull the id from the activeFile for some reason?
// Make these variables public - we set the properties in the constructor so we can localize them (versus the old static arrays)
public $accessories_fields;
public $assets_fields;
public $users_fields;
public $licenses_fields;
public $locations_fields;
public $consumables_fields;
public $components_fields;
public $aliases_fields;
protected $rules = [
'files.*.file_path' => 'required|string',
'files.*.created_at' => 'required|string',
@ -57,189 +67,34 @@ class Importer extends Component
return json_encode(array_filter($tmp));
}
// all of these 'statics', alas, may have to change to something else to handle translations?
// I'm not sure. Maybe I use them to 'populate' the translations? TBH, I don't know yet.
static $general = [
'category' => 'Category',
'company' => 'Company',
'email' => 'Email',
'item_name' => 'Item Name',
'location' => 'Location',
'maintained' => 'Maintained',
'manufacturer' => 'Manufacturer',
'order_number' => 'Order Number',
'purchase_cost' => 'Purchase Cost',
'purchase_date' => 'Purchase Date',
'quantity' => 'Quantity',
'requestable' => 'Requestable',
'serial' => 'Serial Number',
'supplier' => 'Supplier',
'username' => 'Username',
'department' => 'Department',
];
static $accessories = [
'model_number' => 'Model Number',
'notes' => 'Notes',
];
static $assets = [
'asset_tag' => 'Asset Tag',
'asset_model' => 'Model Name',
'asset_notes' => 'Asset Notes',
'model_notes' => 'Model Notes',
'byod' => 'BYOD',
'checkout_class' => 'Checkout Type',
'checkout_location' => 'Checkout Location',
'image' => 'Image Filename',
'model_number' => 'Model Number',
'full_name' => 'Full Name',
'status' => 'Status',
'warranty_months' => 'Warranty Months',
'asset_eol_date' => 'EOL Date',
];
static $consumables = [
'item_no' => "Item Number",
'model_number' => "Model Number",
'notes' => 'Notes',
'min_amt' => "Minimum Quantity",
];
static $licenses = [
'asset_tag' => 'Assigned To Asset',
'expiration_date' => 'Expiration Date',
'full_name' => 'Full Name',
'license_email' => 'Licensed To Email',
'license_name' => 'Licensed To Name',
'purchase_order' => 'Purchase Order',
'reassignable' => 'Reassignable',
'seats' => 'Seats',
'notes' => 'Notes',
];
static $users = [
'employee_num' => 'Employee Number',
'first_name' => 'First Name',
'last_name' => 'Last Name',
'notes' => 'Notes',
'jobtitle' => 'Job Title',
'phone_number' => 'Phone Number',
'manager_first_name' => 'Manager First Name',
'manager_last_name' => 'Manager Last Name',
'activated' => 'Activated',
'address' => 'Address',
'city' => 'City',
'state' => 'State',
'country' => 'Country',
'zip' => 'Zip',
'vip' => 'VIP',
'remote' => 'Remote',
];
static $locations = [
'name' => 'Name',
'address' => 'Address',
'address2' => 'Address 2',
'city' => 'City',
'state' => 'State',
'country' => 'Country',
'zip' => 'Zip',
'currency' => 'Currency',
'ldap_ou' => 'LDAP OU',
'manager_username' => 'Manager Username',
'manager' => 'Manager',
'parent_location' => 'Parent Location',
'notes' => 'Notes',
];
//array of "real fieldnames" to a list of aliases for that field
static $aliases = [
'model_number' =>
[
'model',
'model no',
'model no.',
'model number',
'model num',
'model num.'
],
'warranty_months' =>
[
'Warranty',
'Warranty Months'
],
'qty' =>
[
'QTY',
'Quantity'
],
'zip' =>
[
'Postal Code',
'Post Code'
],
'min_amt' =>
[
'Min Amount',
'Min QTY'
],
'next_audit_date' =>
[
'Next Audit',
],
'address2' =>
[
'Address 2',
'Address2',
],
'ldap_ou' =>
[
'LDAP OU',
'OU',
],
'parent_location' =>
[
'Parent',
'Parent Location',
],
'manager' =>
[
'Managed By',
'Manager Name',
'Manager Full Name',
],
'manager_username' =>
[
'Manager Username',
],
];
private function getColumns($type)
{
switch ($type) {
case 'asset':
$results = self::$general + self::$assets;
$results = $this->assets_fields;
break;
case 'accessory':
$results = self::$general + self::$accessories;
$results = $this->accessories_fields;
break;
case 'consumable':
$results = self::$general + self::$consumables;
$results = $this->consumables_fields;
break;
case 'component':
$results = $this->components_fields;
break;
case 'license':
$results = self::$general + self::$licenses;
$results = $this->licenses_fields;
break;
case 'user':
$results = self::$general + self::$users;
$results = $this->users_fields;
break;
case 'location':
$results = self::$general + self::$locations;
$results = $this->locations_fields;
break;
default:
$results = self::$general;
$results = [];
}
asort($results, SORT_FLAG_CASE | SORT_STRING);
if ($type == "asset") {
@ -268,7 +123,7 @@ class Importer extends Component
continue;
} else {
//no, this key is *INVALID* for this import type. Better set it to null
// and we'll hope that the aliases or something else picks it up.
// and we'll hope that the $aliases_fields or something else picks it up.
$this->field_map[$i] = null; // fingers crossed! But it's not likely, tbh.
} // TODO - strictly speaking, this isn't necessary here I don't think.
}
@ -279,8 +134,8 @@ class Importer extends Component
continue 2; //don't bother with the alias check, go to the next header
}
}
// if you got here, we didn't find a match. Try the aliases
foreach (self::$aliases as $key => $alias_values) {
// if you got here, we didn't find a match. Try the $aliases_fields
foreach ($this->aliases_fields as $key => $alias_values) {
foreach ($alias_values as $alias_value) {
if (strcasecmp($alias_value, $header) === 0) { // aLsO CaSe-INSENSitiVE!
// Make *absolutely* sure that this key actually _exists_ in this import type -
@ -319,6 +174,302 @@ class Importer extends Component
'location' => trans('general.locations'),
];
/**
* These are the item-type specific columns
*/
$this->accessories_fields = [
'company' => trans('general.company'),
'location' => trans('general.location'),
'quantity' => trans('general.qty'),
'item_name' => trans('general.item_name_var', ['item' => trans('general.accessory')]),
'model_number' => trans('general.model_no'),
'notes' => trans('general.notes'),
'category' => trans('general.category'),
'supplier' => trans('general.supplier'),
'min_amt' => trans('mail.min_QTY'),
'purchase_cost' => trans('general.purchase_cost'),
'purchase_date' => trans('general.purchase_date'),
'manufacturer' => trans('general.manufacturer'),
'order_number' => trans('general.order_number'),
];
$this->assets_fields = [
'company' => trans('general.company'),
'location' => trans('general.location'),
'item_name' => trans('general.item_name_var', ['item' => trans('general.asset')]),
'asset_tag' => trans('general.asset_tag'),
'asset_model' => trans('general.model_name'),
'byod' => trans('general.byod'),
'model_number' => trans('general.model_no'),
'status' => trans('general.status'),
'warranty_months' => trans('admin/hardware/form.warranty'),
'category' => trans('general.category'),
'requestable' => trans('admin/hardware/general.requestable'),
'serial' => trans('general.serial_number'),
'supplier' => trans('general.supplier'),
'purchase_cost' => trans('general.purchase_cost'),
'purchase_date' => trans('general.purchase_date'),
'purchase_order' => trans('admin/licenses/form.purchase_order'),
'asset_notes' => trans('general.item_notes', ['item' => trans('admin/hardware/general.asset')]),
'model_notes' => trans('general.item_notes', ['item' => trans('admin/hardware/form.model')]),
'manufacturer' => trans('general.manufacturer'),
'order_number' => trans('general.order_number'),
'notes' => trans('general.notes'),
'image' => trans('general.importer.image_filename'),
/**
* Checkout fields:
* Assets can be checked out to other assets, people, or locations, but we currently
* only support checkout to people and locations in the importer
**/
'checkout_class' => trans('general.importer.checkout_type'),
'first_name' => trans('general.importer.checked_out_to_first_name'),
'last_name' => trans('general.importer.checked_out_to_last_name'),
'full_name' => trans('general.importer.checked_out_to_fullname'),
'email' => trans('general.importer.checked_out_to_email'),
'username' => trans('general.importer.checked_out_to_username'),
'checkout_location' => trans('general.importer.checkout_location'),
];
$this->consumables_fields = [
'company' => trans('general.company'),
'location' => trans('general.location'),
'quantity' => trans('general.qty'),
'item_name' => trans('general.item_name_var', ['item' => trans('general.consumable')]),
'model_number' => trans('general.model_no'),
'notes' => trans('general.notes'),
'min_amt' => trans('mail.min_QTY'),
'category' => trans('general.category'),
'purchase_cost' => trans('general.purchase_cost'),
'purchase_date' => trans('general.purchase_date'),
'checkout_class' => trans('general.importer.checkout_type'),
'supplier' => trans('general.supplier'),
'manufacturer' => trans('general.manufacturer'),
'order_number' => trans('general.order_number'),
'item_no' => trans('admin/consumables/general.item_no'),
];
$this->components_fields = [
'company' => trans('general.company'),
'location' => trans('general.location'),
'quantity' => trans('general.qty'),
'item_name' => trans('general.item_name_var', ['item' => trans('general.component')]),
'model_number' => trans('general.model_no'),
'notes' => trans('general.notes'),
'category' => trans('general.category'),
'supplier' => trans('general.supplier'),
'min_amt' => trans('mail.min_QTY'),
'purchase_cost' => trans('general.purchase_cost'),
'purchase_date' => trans('general.purchase_date'),
'manufacturer' => trans('general.manufacturer'),
'order_number' => trans('general.order_number'),
'serial' => trans('general.serial_number'),
];
$this->licenses_fields = [
'company' => trans('general.company'),
'location' => trans('general.location'),
'item_name' => trans('general.item_name_var', ['item' => trans('general.license')]),
'asset_tag' => trans('general.importer.checked_out_to_tag'),
'expiration_date' => trans('admin/licenses/form.expiration'),
'full_name' => trans('general.importer.checked_out_to_fullname'),
'license_email' => trans('admin/licenses/form.to_email'),
'license_name' => trans('admin/licenses/form.to_name'),
'purchase_order' => trans('admin/licenses/form.purchase_order'),
'reassignable' => trans('admin/licenses/form.reassignable'),
'seats' => trans('admin/licenses/form.seats'),
'notes' => trans('general.notes'),
'category' => trans('general.category'),
'supplier' => trans('general.supplier'),
'purchase_cost' => trans('general.purchase_cost'),
'purchase_date' => trans('general.purchase_date'),
'maintained' => trans('admin/licenses/form.maintained'),
'checkout_class' => trans('general.importer.checkout_type'),
'serial' => trans('general.license_serial'),
];
$this->users_fields = [
'id' => trans('general.id'),
'company' => trans('general.company'),
'location' => trans('general.location'),
'department' => trans('general.department'),
'first_name' => trans('general.first_name'),
'last_name' => trans('general.last_name'),
'notes' => trans('general.notes'),
'username' => trans('admin/users/table.username'),
'jobtitle' => trans('admin/users/table.title'),
'phone_number' => trans('admin/users/table.phone'),
'manager_first_name' => trans('general.importer.manager_first_name'),
'manager_last_name' => trans('general.importer.manager_last_name'),
'activated' => trans('general.activated'),
'address' => trans('general.address'),
'city' => trans('general.city'),
'state' => trans('general.state'),
'country' => trans('general.country'),
'zip' => trans('general.zip'),
'vip' => trans('general.importer.vip'),
'remote' => trans('admin/users/general.remote'),
'email' => trans('admin/users/table.email'),
'website' => trans('general.website'),
'avatar' => trans('general.image'),
'gravatar' => trans('general.importer.gravatar'),
'start_date' => trans('general.start_date'),
'end_date' => trans('general.end_date'),
'employee_number' => trans('general.employee_number'),
];
$this->locations_fields = [
'name' => trans('general.item_name_var', ['item' => trans('general.location')]),
'address' => trans('general.address'),
'address2' => trans('general.importer.address2'),
'city' => trans('general.city'),
'state' => trans('general.state'),
'country' => trans('general.country'),
'zip' => trans('general.zip'),
'currency' => trans('general.importer.currency'),
'ldap_ou' => trans('admin/locations/table.ldap_ou'),
'manager_username' => trans('general.importer.manager_username'),
'manager' => trans('general.importer.manager_full_name'),
'parent_location' => trans('admin/locations/table.parent'),
];
// "real fieldnames" to a list of aliases for that field
$this->aliases_fields = [
'item_name' =>
[
'item name',
'asset name',
'accessory name',
'user name',
'consumable name',
'component name',
'name',
],
'item_no' => [
'item number',
'item no.',
'item #',
],
'asset_model' =>
[
'model name',
'model',
],
'gravatar' =>
[
'gravatar',
],
'currency' =>
[
'$',
],
'jobtitle' =>
[
'job title for user',
'job title',
],
'username' =>
[
'user name',
'username',
trans('general.importer.checked_out_to_username'),
],
'first_name' =>
[
'first name',
trans('general.importer.checked_out_to_first_name'),
],
'last_name' =>
[
'last name',
'lastname',
trans('general.importer.checked_out_to_last_name'),
],
'email' =>
[
'email',
'e-mail',
trans('general.importer.checked_out_to_email'),
],
'phone_number' =>
[
'phone',
'phone number',
'phone num',
'telephone number',
'telephone',
'tel.',
],
'serial' =>
[
'serial number',
'serial no.',
'serial no',
'product key',
'key',
],
'model_number' =>
[
'model',
'model no',
'model no.',
'model number',
'model num',
'model num.'
],
'warranty_months' =>
[
'Warranty',
'Warranty Months'
],
'qty' =>
[
'QTY',
'Quantity'
],
'zip' =>
[
'Postal Code',
'Post Code',
'Zip Code'
],
'min_amt' =>
[
'Min Amount',
'Minimum Amount',
'Min Quantity',
'Minimum Quantity',
],
'next_audit_date' =>
[
'Next Audit',
],
'address2' =>
[
'Address 2',
'Address2',
],
'ldap_ou' =>
[
'LDAP OU',
'OU',
],
'parent_location' =>
[
'Parent',
'Parent Location',
],
'manager' =>
[
'Managed By',
'Manager Name',
'Manager Full Name',
],
'manager_username' =>
[
'Manager Username',
],
];
$this->columnOptions[''] = $this->getColumns(''); //blank mode? I don't know what this is supposed to mean
foreach($this->importTypes AS $type => $name) {
$this->columnOptions[$type] = $this->getColumns($type);

View file

@ -59,6 +59,7 @@ class AssetMaintenancesTransformer
'user_id' => ($assetmaintenance->admin) ? ['id' => $assetmaintenance->admin->id, 'name'=> e($assetmaintenance->admin->getFullNameAttribute())] : null,
'created_at' => Helper::getFormattedDateObject($assetmaintenance->created_at, 'datetime'),
'updated_at' => Helper::getFormattedDateObject($assetmaintenance->updated_at, 'datetime'),
'is_warranty'=> $assetmaintenance->is_warranty,
];

View file

@ -38,7 +38,7 @@ class AssetsTransformer
'byod' => ($asset->byod ? true : false),
'model_number' => (($asset->model) && ($asset->model->model_number)) ? e($asset->model->model_number) : null,
'eol' => ($asset->model->eol != '') ? $asset->model->eol : null,
'eol' => (($asset->model) && ($asset->model->eol != '')) ? $asset->model->eol : null,
'asset_eol_date' => ($asset->asset_eol_date != '') ? Helper::getFormattedDateObject($asset->asset_eol_date, 'date') : null,
'status_label' => ($asset->assetstatus) ? [
'id' => (int) $asset->assetstatus->id,

View file

@ -12,7 +12,10 @@ class AssetImporter extends ItemImporter
public function __construct($filename)
{
parent::__construct($filename);
$this->defaultStatusLabelId = Statuslabel::first()->id;
if (!is_null(Statuslabel::first())) {
$this->defaultStatusLabelId = Statuslabel::first()->id;
}
}
protected function handle($row)
@ -132,10 +135,9 @@ class AssetImporter extends ItemImporter
}
}
// FIXME: this disables model validation. Need to find a way to avoid double-logs without breaking everything.
// $asset->unsetEventDispatcher();
if ($asset->save()) {
$asset->logCreate('Imported using csv importer');
$asset->logCreate(trans('general.importer.import_note'));
$this->log('Asset '.$this->item['name'].' with serial number '.$this->item['serial'].' was created');
// If we have a target to checkout to, lets do so.

View file

@ -27,60 +27,14 @@ abstract class Importer
protected $updating;
/**
* Default Map of item fields->csv names
*
* This has been moved into Livewire/Importer.php to be more granular.
* @todo - remove references to this property since we don't use it anymore.
*
* @var array
*/
private $defaultFieldMap = [
'asset_tag' => 'asset tag',
'activated' => 'activated',
'category' => 'category',
'checkout_class' => 'checkout type', // Supports Location or User for assets. Using checkout_class instead of checkout_type because type exists on asset already.
'checkout_location' => 'checkout location',
'company' => 'company',
'item_name' => 'item name',
'item_number' => 'item number',
'image' => 'image',
'expiration_date' => 'expiration date',
'location' => 'location',
'notes' => 'notes',
'license_email' => 'licensed to email',
'license_name' => 'licensed to name',
'maintained' => 'maintained',
'manufacturer' => 'manufacturer',
'asset_model' => 'model name',
'model_number' => 'model number',
'order_number' => 'order number',
'purchase_cost' => 'purchase cost',
'purchase_date' => 'purchase date',
'purchase_order' => 'purchase order',
'qty' => 'quantity',
'reassignable' => 'reassignable',
'requestable' => 'requestable',
'seats' => 'seats',
'serial' => 'serial number',
'status' => 'status',
'supplier' => 'supplier',
'termination_date' => 'termination date',
'warranty_months' => 'warranty',
'full_name' => 'full name',
'email' => 'email',
'username' => 'username',
'address' => 'address',
'address2' => 'address2',
'city' => 'city',
'state' => 'state',
'country' => 'country',
'zip' => 'zip',
'jobtitle' => 'job title',
'employee_num' => 'employee number',
'phone_number' => 'phone number',
'first_name' => 'first name',
'last_name' => 'last name',
'department' => 'department',
'manager_name' => 'manager full name',
'manager_username' => 'manager username',
'min_amt' => 'minimum quantity',
'remote' => 'remote',
'vip' => 'vip',
];
/**
* Map of item fields->csv names
@ -288,6 +242,8 @@ abstract class Importer
$user_array = [
'full_name' => $this->findCsvMatch($row, 'full_name'),
'first_name' => $this->findCsvMatch($row, 'first_name'),
'last_name' => $this->findCsvMatch($row, 'last_name'),
'email' => $this->findCsvMatch($row, 'email'),
'manager_id'=> '',
'department_id' => '',
@ -296,7 +252,6 @@ abstract class Importer
'remote' => $this->fetchHumanBoolean(($this->findCsvMatch($row, 'remote'))),
];
if ($type == 'manager') {
$user_array['full_name'] = $this->findCsvMatch($row, 'manager');
$user_array['username'] = $this->findCsvMatch($row, 'manager_username');
@ -312,8 +267,9 @@ abstract class Importer
// If the full name and username is empty, bail out--we need this to extract first name (at the very least)
if ((empty($user_array['username'])) && (empty($user_array['full_name']))) {
$this->log('Insufficient user data provided (Full name or username is required) - skipping user creation.');
if ((empty($user_array['username'])) && (empty($user_array['full_name'])) && (empty($user_array['first_name']))) {
$this->log('Insufficient user data provided (Full name, first name or username is required) - skipping user creation.');
\Log::debug('User array: ');
\Log::debug(print_r($user_array, true));
\Log::debug(print_r($row, true));
return false;
@ -325,10 +281,12 @@ abstract class Importer
$user_array['email'] = User::generateEmailFromFullName($user_array['full_name']);
}
// Get some fields for first name and last name based off of full name
$user_formatted_array = User::generateFormattedNameFromFullName($user_array['full_name'], Setting::getSettings()->username_format);
$user_array['first_name'] = $user_formatted_array['first_name'];
$user_array['last_name'] = $user_formatted_array['last_name'];
if (empty($user_array['first_name'])) {
// Get some fields for first name and last name based off of full name
$user_formatted_array = User::generateFormattedNameFromFullName($user_array['full_name'], Setting::getSettings()->username_format);
$user_array['first_name'] = $user_formatted_array['first_name'];
$user_array['last_name'] = $user_formatted_array['last_name'];
}
if (empty($user_array['username'])) {
$user_array['username'] = $user_formatted_array['username'];

View file

@ -112,15 +112,11 @@ class ItemImporter extends Importer
*/
protected function determineCheckout($row)
{
// Locations don't get checked out to anyone/anything
if (get_class($this) == LocationImporter::class) {
return;
}
// We only support checkout-to-location for asset, so short circuit otherwise.
if (get_class($this) != AssetImporter::class) {
return $this->createOrFetchUser($row);
}
if (strtolower($this->item['checkout_class']) === 'location' && $this->findCsvMatch($row, 'checkout_location') != null ) {
return Location::findOrFail($this->createOrFetchLocation($this->findCsvMatch($row, 'checkout_location')));
}

View file

@ -42,16 +42,21 @@ class UserImporter extends ItemImporter
public function createUserIfNotExists(array $row)
{
// Pull the records from the CSV to determine their values
$this->item['id'] = $this->findCsvMatch($row, 'id');
$this->item['username'] = $this->findCsvMatch($row, 'username');
$this->item['first_name'] = $this->findCsvMatch($row, 'first_name');
$this->item['last_name'] = $this->findCsvMatch($row, 'last_name');
$this->item['email'] = $this->findCsvMatch($row, 'email');
$this->item['gravatar'] = $this->findCsvMatch($row, 'gravatar');
$this->item['phone'] = $this->findCsvMatch($row, 'phone_number');
$this->item['website'] = $this->findCsvMatch($row, 'website');
$this->item['jobtitle'] = $this->findCsvMatch($row, 'jobtitle');
$this->item['address'] = $this->findCsvMatch($row, 'address');
$this->item['city'] = $this->findCsvMatch($row, 'city');
$this->item['state'] = $this->findCsvMatch($row, 'state');
$this->item['country'] = $this->findCsvMatch($row, 'country');
$this->item['start_date'] = $this->findCsvMatch($row, 'start_date');
$this->item['end_date'] = $this->findCsvMatch($row, 'end_date');
$this->item['zip'] = $this->findCsvMatch($row, 'zip');
$this->item['activated'] = ($this->fetchHumanBoolean($this->findCsvMatch($row, 'activated')) == 1) ? '1' : 0;
$this->item['employee_num'] = $this->findCsvMatch($row, 'employee_num');
@ -72,13 +77,18 @@ class UserImporter extends ItemImporter
$user_formatted_array = User::generateFormattedNameFromFullName($user_full_name, Setting::getSettings()->username_format);
$this->item['username'] = $user_formatted_array['username'];
}
$user = User::where('username', $this->item['username'])->first();
if ($user) {
if (! $this->updating) {
$this->log('A matching User '.$this->item['name'].' already exists. ');
\Log::debug('A matching User '.$this->item['name'].' already exists. ');
// Check if a numeric ID was passed. If it does, use that above all else.
if ((array_key_exists('id', $this->item) && ($this->item['id'] != "") && (is_numeric($this->item['id'])))) {
$user = User::find($this->item['id']);
} else {
$user = User::where('username', $this->item['username'])->first();
}
if ($user) {
if (! $this->updating) {
\Log::debug('A matching User '.$this->item['name'].' already exists. ');
return;
}
$this->log('Updating User');
@ -105,7 +115,6 @@ class UserImporter extends ItemImporter
$user->fill($this->sanitizeItemForStoring($user));
if ($user->save()) {
// $user->logCreate('Imported using CSV Importer');
$this->log('User '.$this->item['name'].' was created');
if (($user->email) && ($user->activated == '1')) {

View file

@ -1,45 +0,0 @@
| CSV | Item | Applicable Types |
|---------------------|------------------|-------------------------------------------|
| activated | | User |
| asset tag | asset_tag | Asset |
| category | category | All |
| company | company | All |
| department_id | | User ? All |
| item name | item_name | All |
| image | image | Asset |
| email | | |
| expiration date | expiration_date | License |
| location | location | All |
| notes | notes | All |
| licensed to email | license_email | License |
| licensed to name | license_name | License |
| maintained | maintained | License |
| manager_id | | User |
| manufacturer | manufacturer | All |
| model name | asset_model | Asset |
| model number | model_number | Asset |
| order number | order_number | All ? |
| purchase cost | purchase_cost | All ? |
| purchase date | purchase_date | All ? |
| purchase order | purchase_order | License |
| quantity | qty | Accessory, Consumable, Component, License |
| reassignable | reassignable | License |
| requestable | requestable | Asset, Accessory? |
| seats | seats | License |
| serial number | serial | Asset, license |
| status | status | Asset ? All |
| supplier | supplier | Asset ? All |
| minimum quantity | min_amt | Consumable |
| termination date | termination_date | License |
| warranty months | warranty_months | Asset |
| User Related Fields | assigned_to | Asset |
| name | | |
| email | | |
| username | | |
| address | address | User |
| city | city | User |
| state | state | User |
| country | country | User |
| vip | vip | User |
| byod | byod | Asset |

View file

@ -1566,7 +1566,7 @@ class Asset extends Depreciable
*/
public function scopeOrderModelNumber($query, $order)
{
return $query->join('models', 'assets.model_id', '=', 'models.id')->orderBy('models.model_number', $order);
return $query->leftJoin('models as model_number_sort', 'assets.model_id', '=', 'models.id')->orderBy('models.model_number', $order);
}

View file

@ -44,13 +44,13 @@ class AssetAuditPresenter extends Presenter
'visible' => true,
'formatter' => 'hardwareLinkFormatter',
], [
'field' => 'image',
'field' => 'file',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('admin/hardware/table.image'),
'visible' => false,
'formatter' => 'imageFormatter',
'formatter' => 'auditImageFormatter',
], [
'field' => 'asset_tag',
'searchable' => true,

View file

@ -95,6 +95,7 @@ class AssetMaintenancesPresenter extends Presenter
'searchable' => true,
'sortable' => true,
'title' => trans('admin/asset_maintenances/table.is_warranty'),
'formatter' => 'trueFalseFormatter'
], [
'field' => 'cost',
'searchable' => true,

View file

@ -74,8 +74,11 @@ return array(
* This is only checked on command line call by dompdf.php, but not by
* direct class use like:
* $dompdf = new DOMPDF(); $dompdf->load_html($htmldata); $dompdf->render(); $pdfdata = $dompdf->output();
*
*
* Hardcoding 2 Paths needed for Docker Containers
*/
"chroot" => realpath(base_path()),
"chroot" => realpath(base_path()) . ",/var/lib/snipeit/data/uploads,/var/lib/snipeit/data/private_uploads",
/**
* Whether to enable font subsetting or not.

View file

@ -1,10 +1,10 @@
<?php
return array (
'app_version' => 'v6.1.1-pre',
'full_app_version' => 'v6.1.1-pre - build 10778-gfc5b02e39',
'build_version' => '10778',
'app_version' => 'v6.1.1',
'full_app_version' => 'v6.1.1 - build 10847-g2ac4449ea',
'build_version' => '10847',
'prerelease_version' => '',
'hash_version' => 'gfc5b02e39',
'full_hash' => 'v6.1.1-pre-536-gfc5b02e39',
'hash_version' => 'g2ac4449ea',
'full_hash' => 'v6.1.1-605-g2ac4449ea',
'branch' => 'develop',
);

View file

@ -17,5 +17,6 @@ return array(
'use_default_eula' => 'Gebruik eerder die <a href="#" data-toggle="modal" data-target="#eulaModal">primary standaard EULA</a>.',
'use_default_eula_disabled' => '<del>Gebruik die primêre standaardverlof in plaas daarvan.</del> Geen primêre standaard EULA is ingestel nie. Voeg asseblief een by Instellings.',
'clone' => 'Clone Accessory',
'delete_disabled' => 'This accessory cannot be deleted yet because some items are still checked out.',
);

View file

@ -23,7 +23,8 @@ return array(
'checkout' => array(
'error' => 'Komponent is nie nagegaan nie, probeer asseblief weer',
'success' => 'Komponent is suksesvol nagegaan.',
'user_does_not_exist' => 'Die gebruiker is ongeldig. Probeer asseblief weer.'
'user_does_not_exist' => 'Die gebruiker is ongeldig. Probeer asseblief weer.',
'unavailable' => 'Not enough components remaining: :remaining remaining, :requested requested ',
),
'checkin' => array(

View file

@ -23,7 +23,8 @@ return array(
'checkout' => array(
'error' => 'Verbruiksgoedere is nie nagegaan nie, probeer asseblief weer',
'success' => 'Verbruiksgoedere is suksesvol nagegaan.',
'user_does_not_exist' => 'Die gebruiker is ongeldig. Probeer asseblief weer.'
'user_does_not_exist' => 'Die gebruiker is ongeldig. Probeer asseblief weer.',
'unavailable' => 'There are not enough consumables for this checkout. Please check the quantity left. ',
),
'checkin' => array(

View file

@ -49,4 +49,6 @@ return [
'unique' => 'Unique',
'display_in_user_view' => 'Allow the checked out user to view these values in their View Assigned Assets page',
'display_in_user_view_table' => 'Visible to User',
'auto_add_to_fieldsets' => 'Automatically add this to every new fieldset',
'add_to_preexisting_fieldsets' => 'Add to any existing fieldsets',
];

View file

@ -23,6 +23,7 @@ return [
'restore' => 'Herstel bate',
'pending' => 'hangende',
'undeployable' => 'Undeployable',
'undeployable_tooltip' => 'This asset has a status label that is undeployable and cannot be checked out at this time.',
'view' => 'Bekyk bate',
'csv_error' => 'You have an error in your CSV file:',
'import_text' => '

View file

@ -8,6 +8,7 @@ return [
'change' => 'In uit',
'checkout_date' => 'Checkout Datum',
'checkoutto' => 'Gekontroleer',
'components_cost' => 'Total Components Cost',
'current_value' => 'Current Value',
'diff' => 'diff',
'dl_csv' => 'Laai CSV af',

View file

@ -1,8 +1,8 @@
<?php
return array(
'about_licenses_title' => 'Oor lisensies',
'about_licenses' => 'Lisensies word gebruik om sagteware op te spoor. Hulle het \'n gespesifiseerde aantal sitplekke wat aan individue nagekeken kan word',
'about_licenses_title' => 'Oor lisensies',
'about_licenses' => 'Lisensies word gebruik om sagteware op te spoor. Hulle het \'n gespesifiseerde aantal sitplekke wat aan individue nagekeken kan word',
'checkin' => 'Checkin License Seat',
'checkout_history' => 'Afhandeling Geskiedenis',
'checkout' => 'Checkout License Seat',
@ -18,4 +18,30 @@ return array(
'software_licenses' => 'Sagteware lisensies',
'user' => 'gebruiker',
'view' => 'Bekyk lisensie',
'delete_disabled' => 'This license cannot be deleted yet because some seats are still checked out.',
'bulk' =>
[
'checkin_all' => [
'button' => 'Checkin All Seats',
'modal' => 'This will action checkin one seat. | This action will checkin all :checkedout_seats_count seats for this license.',
'enabled_tooltip' => 'Checkin ALL seats for this license from both users and assets',
'disabled_tooltip' => 'This is disabled because there are no seats currently checked out',
'success' => 'License successfully checked in! | All licenses were successfully checked in!',
'log_msg' => 'Checked in via bulk license checkout in license GUI',
],
'checkout_all' => [
'button' => 'Checkout All Seats',
'modal' => 'This action will checkout one seat to the first available user. | This action will checkout all :available_seats_count seats to the first available users. A user is considered available for this seat if they do not already have this license checked out to them, and the Auto-Assign License property is enabled on their user account.',
'enabled_tooltip' => 'Checkout ALL seats (or as many as are available) to ALL users',
'disabled_tooltip' => 'This is disabled because there are no seats currently available',
'success' => 'License successfully checked out! | :count licenses were successfully checked out!',
'error_no_seats' => 'There are no remaining seats left for this license.',
'warn_not_enough_seats' => ':count users were assigned this license, but we ran out of available license seats.',
'warn_no_avail_users' => 'Nothing to do. There are no users who do not already have this license assigned to them.',
'log_msg' => 'Checked out via bulk license checkout in license GUI',
],
],
);

View file

@ -2,6 +2,7 @@
return array(
'support_url_help' => 'Use <code>{LOCALE}</code> and <code>{SERIAL}</code> in your URL as variables to have those values auto-populate when viewing assets.',
'does_not_exist' => 'Vervaardiger bestaan nie.',
'assoc_users' => 'Hierdie vervaardiger word tans geassosieer met ten minste een model en kan nie verwyder word nie. Dateer asseblief jou modelle op om nie meer hierdie vervaardiger te gebruik nie en probeer weer.',

View file

@ -10,6 +10,7 @@ return array(
'support_email' => 'Ondersteunings-e-pos',
'support_phone' => 'Ondersteuningsfoon',
'support_url' => 'Ondersteunings-URL',
'warranty_lookup_url' => 'Warranty Lookup URL',
'update' => 'Update Fabrikant',
'url' => 'URL',

View file

@ -32,7 +32,7 @@ return [
'backups_restoring' => 'Restoring from Backup',
'backups_upload' => 'Upload Backup',
'backups_path' => 'Backups on the server are stored in <code>:path</code>',
'backups_restore_warning' => 'Use the restore button <small><span class="btn btn-xs btn-warning"><i class="text-white fas fa-retweet" aria-hidden="true"></i></span></small> to restore from a previous backup. (This does not currently work with S3 file storage or Docker.<br><br>Your <strong>entire :app_name database and any uploaded files will be completely replaced</strong> by what\'s in the backup file. ',
'backups_restore_warning' => 'Use the restore button <small><span class="btn btn-xs btn-warning"><i class="text-white fas fa-retweet" aria-hidden="true"></i></span></small> to restore from a previous backup. (This does not currently work with S3 file storage or Docker.)<br><br>Your <strong>entire :app_name database and any uploaded files will be completely replaced</strong> by what\'s in the backup file. ',
'backups_logged_out' => 'All existing users, including you, will be logged out once your restore is complete.',
'backups_large' => 'Very large backups may time out on the restore attempt and may still need to be run via command line. ',
'barcode_settings' => 'Barcode-instellings',
@ -86,6 +86,8 @@ return [
'ldap_settings' => 'LDAP-instellings',
'ldap_client_tls_cert_help' => 'Client-Side TLS Certificate and Key for LDAP connections are usually only useful in Google Workspace configurations with "Secure LDAP." Both are required.',
'ldap_client_tls_key' => 'LDAP Client-Side TLS key',
'ldap_location' => 'LDAP Location',
'ldap_location_help' => 'The Ldap Location field should be used if <strong>an OU is not being used in the Base Bind DN.</strong> Leave this blank if an OU search is being used.',
'ldap_login_test_help' => 'Enter a valid LDAP username and password from the base DN you specified above to test whether your LDAP login is configured correctly. YOU MUST SAVE YOUR UPDATED LDAP SETTINGS FIRST.',
'ldap_login_sync_help' => 'This only tests that LDAP can sync correctly. If your LDAP Authentication query is not correct, users may still not be able to login. YOU MUST SAVE YOUR UPDATED LDAP SETTINGS FIRST.',
'ldap_manager' => 'LDAP Manager',
@ -328,4 +330,9 @@ return [
'setup_migration_create_user' => 'Next: Create User',
'ldap_settings_link' => 'LDAP Settings Page',
'slack_test' => 'Test <i class="fab fa-slack"></i> Integration',
'google_callback_help' => 'This should be entered as the callback URL in your Google OAuth app settings in your organization&apos;s <strong><a href="https://console.cloud.google.com/" target="_blank">Google developer console <i class="fa fa-external-link" aria-hidden="true"></i></a></strong>.',
'google_login' => 'Google Workspace Login Settings',
'enable_google_login' => 'Enable users to login with Google Workspace',
'enable_google_login_help' => 'Users will not be automatically provisioned. They must have an existing account here AND in Google Workspace, and their username here must match their Google Workspace email address. ',
];

View file

@ -6,7 +6,7 @@ return array(
'declined' => 'Jy het hierdie bate suksesvol geweier.',
'bulk_manager_warn' => 'Jou gebruikers is suksesvol opgedateer, maar jou bestuurderinskrywing is nie gestoor nie, want die bestuurder wat jy gekies het, was ook in die gebruikerslys om geredigeer te word, en gebruikers mag nie hul eie bestuurder wees nie. Kies asseblief u gebruikers weer, behalwe die bestuurder.',
'user_exists' => 'Gebruiker bestaan reeds!',
'user_not_found' => 'Gebruiker [: id] bestaan nie.',
'user_not_found' => 'User does not exist.',
'user_login_required' => 'Die aanmeldingsveld is nodig',
'user_password_required' => 'Die wagwoord is nodig.',
'insufficient_permissions' => 'Onvoldoende Toestemmings.',

View file

@ -12,5 +12,8 @@ return [
'remember_me' => 'Onthou my',
'username_help_top' => 'Enter your <strong>username</strong> to be emailed a password reset link.',
'username_help_bottom' => 'Your username and email address <em>may</em> be the same, but may not be, depending on your configuration. If you cannot remember your username, contact your administrator. <br><br><strong>Usernames without an associated email address will not be emailed a password reset link.</strong> ',
];
'google_login' => 'Or login with Google Workspace',
'google_login_failed' => 'Google Login failed, please try again.',
];

View file

@ -92,6 +92,7 @@ return [
'debug_warning_text' => 'Hierdie program word uitgevoer in die produksiemodus met debugging aangeskakel. Dit kan sensitiewe data blootstel indien u aansoek vir die buitewêreld toeganklik is. Deaktiveer debug-modus deur die <code>APP_DEBUG</code>-waarde in jou <code>.env</code>-lêer te stel na <code>false</code>.',
'delete' => 'verwyder',
'delete_confirm' => 'Are you sure you wish to delete :item?',
'delete_confirm_no_undo' => 'Are you sure you wish to delete :item? This can not be undone.',
'deleted' => 'geskrap',
'delete_seats' => 'Plekke verwyder',
'deletion_failed' => 'Deletion failed',
@ -439,4 +440,13 @@ return [
'setup_migration_output' => 'Migration output:',
'setup_migration_create_user' => 'Next: Create User',
'importer_generic_error' => 'Your file import is complete, but we did receive an error. This is usually caused by third-party API throttling from a notification webhook (such as Slack) and would not have interfered with the import itself, but you should confirm this.',
'confirm' => 'Confirm',
'autoassign_licenses' => 'Auto-Assign Licenses',
'autoassign_licenses_help' => 'Allow this user to have licenses assigned via the bulk-assign license UI or cli tools.',
'autoassign_licenses_help_long' => 'This allows a user to be have licenses assigned via the bulk-assign license UI or cli tools. (For example, you might not want contractors to be auto-assigned a license you would provide to only staff members. You can still individually assign licenses to those users, but they will not be included in the Checkout License to All Users functions.)',
'no_autoassign_licenses_help' => 'Do not include user for bulk-assigning through the license UI or cli tools.',
'modal_confirm_generic' => 'Are you sure?',
'cannot_be_deleted' => 'This item cannot be deleted',
'undeployable_tooltip' => 'This item cannot be checked out. Check the quantity remaining.',
];

View file

@ -74,6 +74,7 @@ return [
'your_credentials' => 'Jou Snipe-IT-referenties',
'Accessory_Checkin_Notification' => 'Accessory checked in',
'Asset_Checkin_Notification' => 'Asset checked in',
'Asset_Checkout_Notification' => 'Asset checked out',
'License_Checkin_Notification' => 'License checked in',
'Expected_Checkin_Report' => 'Expected asset checkin report',
'Expected_Checkin_Notification' => 'Reminder: :name checkin deadline approaching',

View file

@ -67,6 +67,8 @@ return [
'array' => 'Die: Attribuut moet ten minste: min items hê.',
],
'starts_with' => 'The :attribute must start with one of the following: :values.',
'ends_with' => 'The :attribute must end with one of the following: :values.',
'not_in' => 'Die gekose: attribuut is ongeldig.',
'numeric' => 'Die: Attribuut moet \'n nommer wees.',
'present' => 'Die: attribuut veld moet teenwoordig wees.',

View file

@ -17,5 +17,6 @@ return array(
'use_default_eula' => 'Use the <a href="#" data-toggle="modal" data-target="#eulaModal">primary default EULA</a> instead.',
'use_default_eula_disabled' => '<del>Use the primary default EULA instead.</del> No primary default EULA is set. Please add one in Settings.',
'clone' => 'Clone Accessory',
'delete_disabled' => 'This accessory cannot be deleted yet because some items are still checked out.',
);

View file

@ -23,7 +23,8 @@ return array(
'checkout' => array(
'error' => 'Component was not checked out, please try again',
'success' => 'Component checked out successfully.',
'user_does_not_exist' => 'That user is invalid. Please try again.'
'user_does_not_exist' => 'That user is invalid. Please try again.',
'unavailable' => 'Not enough components remaining: :remaining remaining, :requested requested ',
),
'checkin' => array(

View file

@ -23,7 +23,8 @@ return array(
'checkout' => array(
'error' => 'Consumable was not checked out, please try again',
'success' => 'Consumable checked out successfully.',
'user_does_not_exist' => 'That user is invalid. Please try again.'
'user_does_not_exist' => 'That user is invalid. Please try again.',
'unavailable' => 'There are not enough consumables for this checkout. Please check the quantity left. ',
),
'checkin' => array(

View file

@ -49,4 +49,6 @@ return [
'unique' => 'Unique',
'display_in_user_view' => 'Allow the checked out user to view these values in their View Assigned Assets page',
'display_in_user_view_table' => 'Visible to User',
'auto_add_to_fieldsets' => 'Automatically add this to every new fieldset',
'add_to_preexisting_fieldsets' => 'Add to any existing fieldsets',
];

View file

@ -23,6 +23,7 @@ return [
'restore' => 'Restore Asset',
'pending' => 'Pending',
'undeployable' => 'Undeployable',
'undeployable_tooltip' => 'This asset has a status label that is undeployable and cannot be checked out at this time.',
'view' => 'View Asset',
'csv_error' => 'You have an error in your CSV file:',
'import_text' => '

View file

@ -8,6 +8,7 @@ return [
'change' => 'In/Out',
'checkout_date' => 'Checkout Date',
'checkoutto' => 'Checked Out',
'components_cost' => 'Total Components Cost',
'current_value' => 'Current Value',
'diff' => 'Diff',
'dl_csv' => 'Download CSV',

View file

@ -1,8 +1,8 @@
<?php
return array(
'about_licenses_title' => 'About Licenses',
'about_licenses' => 'Licenses are used to track software. They have a specified number of seats that can be checked out to individuals',
'about_licenses_title' => 'About Licenses',
'about_licenses' => 'Licenses are used to track software. They have a specified number of seats that can be checked out to individuals',
'checkin' => 'Checkin License Seat',
'checkout_history' => 'Checkout History',
'checkout' => 'Checkout License Seat',
@ -18,4 +18,30 @@ return array(
'software_licenses' => 'Software Licenses',
'user' => 'User',
'view' => 'View License',
'delete_disabled' => 'This license cannot be deleted yet because some seats are still checked out.',
'bulk' =>
[
'checkin_all' => [
'button' => 'Checkin All Seats',
'modal' => 'This will action checkin one seat. | This action will checkin all :checkedout_seats_count seats for this license.',
'enabled_tooltip' => 'Checkin ALL seats for this license from both users and assets',
'disabled_tooltip' => 'This is disabled because there are no seats currently checked out',
'success' => 'License successfully checked in! | All licenses were successfully checked in!',
'log_msg' => 'Checked in via bulk license checkout in license GUI',
],
'checkout_all' => [
'button' => 'Checkout All Seats',
'modal' => 'This action will checkout one seat to the first available user. | This action will checkout all :available_seats_count seats to the first available users. A user is considered available for this seat if they do not already have this license checked out to them, and the Auto-Assign License property is enabled on their user account.',
'enabled_tooltip' => 'Checkout ALL seats (or as many as are available) to ALL users',
'disabled_tooltip' => 'This is disabled because there are no seats currently available',
'success' => 'License successfully checked out! | :count licenses were successfully checked out!',
'error_no_seats' => 'There are no remaining seats left for this license.',
'warn_not_enough_seats' => ':count users were assigned this license, but we ran out of available license seats.',
'warn_no_avail_users' => 'Nothing to do. There are no users who do not already have this license assigned to them.',
'log_msg' => 'Checked out via bulk license checkout in license GUI',
],
],
);

View file

@ -2,6 +2,7 @@
return array(
'support_url_help' => 'Use <code>{LOCALE}</code> and <code>{SERIAL}</code> in your URL as variables to have those values auto-populate when viewing assets.',
'does_not_exist' => 'Manufacturer does not exist.',
'assoc_users' => 'This manufacturer is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this manufacturer and try again. ',

View file

@ -10,6 +10,7 @@ return array(
'support_email' => 'Support Email',
'support_phone' => 'Support Phone',
'support_url' => 'Support URL',
'warranty_lookup_url' => 'Warranty Lookup URL',
'update' => 'Update Manufacturer',
'url' => 'URL',

View file

@ -32,7 +32,7 @@ return [
'backups_restoring' => 'Restoring from Backup',
'backups_upload' => 'Upload Backup',
'backups_path' => 'Backups on the server are stored in <code>:path</code>',
'backups_restore_warning' => 'Use the restore button <small><span class="btn btn-xs btn-warning"><i class="text-white fas fa-retweet" aria-hidden="true"></i></span></small> to restore from a previous backup. (This does not currently work with S3 file storage or Docker.<br><br>Your <strong>entire :app_name database and any uploaded files will be completely replaced</strong> by what\'s in the backup file. ',
'backups_restore_warning' => 'Use the restore button <small><span class="btn btn-xs btn-warning"><i class="text-white fas fa-retweet" aria-hidden="true"></i></span></small> to restore from a previous backup. (This does not currently work with S3 file storage or Docker.)<br><br>Your <strong>entire :app_name database and any uploaded files will be completely replaced</strong> by what\'s in the backup file. ',
'backups_logged_out' => 'All existing users, including you, will be logged out once your restore is complete.',
'backups_large' => 'Very large backups may time out on the restore attempt and may still need to be run via command line. ',
'barcode_settings' => 'Barcode Settings',
@ -86,6 +86,8 @@ return [
'ldap_settings' => 'LDAP Settings',
'ldap_client_tls_cert_help' => 'Client-Side TLS Certificate and Key for LDAP connections are usually only useful in Google Workspace configurations with "Secure LDAP." Both are required.',
'ldap_client_tls_key' => 'LDAP Client-Side TLS key',
'ldap_location' => 'LDAP Location',
'ldap_location_help' => 'The Ldap Location field should be used if <strong>an OU is not being used in the Base Bind DN.</strong> Leave this blank if an OU search is being used.',
'ldap_login_test_help' => 'Enter a valid LDAP username and password from the base DN you specified above to test whether your LDAP login is configured correctly. YOU MUST SAVE YOUR UPDATED LDAP SETTINGS FIRST.',
'ldap_login_sync_help' => 'This only tests that LDAP can sync correctly. If your LDAP Authentication query is not correct, users may still not be able to login. YOU MUST SAVE YOUR UPDATED LDAP SETTINGS FIRST.',
'ldap_manager' => 'LDAP Manager',
@ -328,4 +330,9 @@ return [
'setup_migration_create_user' => 'Next: Create User',
'ldap_settings_link' => 'LDAP Settings Page',
'slack_test' => 'Test <i class="fab fa-slack"></i> Integration',
'google_callback_help' => 'This should be entered as the callback URL in your Google OAuth app settings in your organization&apos;s <strong><a href="https://console.cloud.google.com/" target="_blank">Google developer console <i class="fa fa-external-link" aria-hidden="true"></i></a></strong>.',
'google_login' => 'Google Workspace Login Settings',
'enable_google_login' => 'Enable users to login with Google Workspace',
'enable_google_login_help' => 'Users will not be automatically provisioned. They must have an existing account here AND in Google Workspace, and their username here must match their Google Workspace email address. ',
];

View file

@ -6,7 +6,7 @@ return array(
'declined' => 'You have successfully declined this asset.',
'bulk_manager_warn' => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
'user_exists' => 'User already exists!',
'user_not_found' => 'User [:id] does not exist.',
'user_not_found' => 'User does not exist.',
'user_login_required' => 'The login field is required',
'user_password_required' => 'The password is required.',
'insufficient_permissions' => 'Insufficient Permissions.',

View file

@ -12,5 +12,8 @@ return [
'remember_me' => 'Remember Me',
'username_help_top' => 'Enter your <strong>username</strong> to be emailed a password reset link.',
'username_help_bottom' => 'Your username and email address <em>may</em> be the same, but may not be, depending on your configuration. If you cannot remember your username, contact your administrator. <br><br><strong>Usernames without an associated email address will not be emailed a password reset link.</strong> ',
];
'google_login' => 'Or login with Google Workspace',
'google_login_failed' => 'Google Login failed, please try again.',
];

View file

@ -92,6 +92,7 @@ return [
'debug_warning_text' => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
'delete' => 'Delete',
'delete_confirm' => 'Are you sure you wish to delete :item?',
'delete_confirm_no_undo' => 'Are you sure you wish to delete :item? This can not be undone.',
'deleted' => 'Deleted',
'delete_seats' => 'Deleted Seats',
'deletion_failed' => 'Deletion failed',
@ -439,4 +440,13 @@ return [
'setup_migration_output' => 'Migration output:',
'setup_migration_create_user' => 'Next: Create User',
'importer_generic_error' => 'Your file import is complete, but we did receive an error. This is usually caused by third-party API throttling from a notification webhook (such as Slack) and would not have interfered with the import itself, but you should confirm this.',
'confirm' => 'Confirm',
'autoassign_licenses' => 'Auto-Assign Licenses',
'autoassign_licenses_help' => 'Allow this user to have licenses assigned via the bulk-assign license UI or cli tools.',
'autoassign_licenses_help_long' => 'This allows a user to be have licenses assigned via the bulk-assign license UI or cli tools. (For example, you might not want contractors to be auto-assigned a license you would provide to only staff members. You can still individually assign licenses to those users, but they will not be included in the Checkout License to All Users functions.)',
'no_autoassign_licenses_help' => 'Do not include user for bulk-assigning through the license UI or cli tools.',
'modal_confirm_generic' => 'Are you sure?',
'cannot_be_deleted' => 'This item cannot be deleted',
'undeployable_tooltip' => 'This item cannot be checked out. Check the quantity remaining.',
];

View file

@ -75,6 +75,7 @@ return [
'your_credentials' => 'Your Snipe-IT credentials',
'Accessory_Checkin_Notification' => 'Accessory checked in',
'Asset_Checkin_Notification' => 'Asset checked in',
'Asset_Checkout_Notification' => 'Asset checked out',
'License_Checkin_Notification' => 'License checked in',
'Expected_Checkin_Report' => 'Expected asset checkin report',
'Expected_Checkin_Notification' => 'Reminder: :name checkin deadline approaching',

View file

@ -67,6 +67,8 @@ return [
'array' => 'The :attribute must have at least :min items.',
],
'starts_with' => 'The :attribute must start with one of the following: :values.',
'ends_with' => 'The :attribute must end with one of the following: :values.',
'not_in' => 'The selected :attribute is invalid.',
'numeric' => 'The :attribute must be a number.',
'present' => 'The :attribute field must be present.',

View file

@ -17,5 +17,6 @@ return array(
'use_default_eula' => 'قم باستعمال <a href="#" data-toggle="modal" data-target="#eulaModal">اتفاقية ترخيص المستخدم الافتراضية الاساسية</a>.',
'use_default_eula_disabled' => '<del>استخدام (اتفاقية ترخيص المستخدم) الافتراضية الأساسية بدلا من ذلك.</del> لم يتم تحديد (اتفاقية ترخيص المستخدم) الافتراضية الأساسية. الرجاء إضافتها في الإعدادات.',
'clone' => 'استنساخ الملحق',
'delete_disabled' => 'This accessory cannot be deleted yet because some items are still checked out.',
);

View file

@ -23,7 +23,8 @@ return array(
'checkout' => array(
'error' => 'لم تتم عملية اخراج المكون، الرجاء المحاولة مرة اخرى',
'success' => 'تم إخراج المكون بنجاح.',
'user_does_not_exist' => 'هذا المستخدم خاطئ، الرجاء المحاولة مرة أخرى.'
'user_does_not_exist' => 'هذا المستخدم خاطئ، الرجاء المحاولة مرة أخرى.',
'unavailable' => 'لا توجد عناصر كافية remaining: :remaining متبقية، :requested مطلوبة ',
),
'checkin' => array(

View file

@ -23,7 +23,8 @@ return array(
'checkout' => array(
'error' => 'لم يتم إخراج المادة الإستهلاكية، الرجاء المحاولة مرة اخرى',
'success' => 'تم إخراج المادة الإستهلاكية بنجاح.',
'user_does_not_exist' => 'هذا المستخدم غير صحيح. الرجاء المحاولة مرة أخرى.'
'user_does_not_exist' => 'هذا المستخدم غير صحيح. الرجاء المحاولة مرة أخرى.',
'unavailable' => 'There are not enough consumables for this checkout. Please check the quantity left. ',
),
'checkin' => array(

View file

@ -49,4 +49,6 @@ return [
'unique' => 'غير مكرر',
'display_in_user_view' => 'Allow the checked out user to view these values in their View Assigned Assets page',
'display_in_user_view_table' => 'Visible to User',
'auto_add_to_fieldsets' => 'Automatically add this to every new fieldset',
'add_to_preexisting_fieldsets' => 'Add to any existing fieldsets',
];

View file

@ -48,7 +48,7 @@ return [
'asset_location_update_default' => 'Update only default location',
'asset_not_deployable' => 'That asset status is not deployable. This asset cannot be checked out.',
'asset_deployable' => 'That status is deployable. This asset can be checked out.',
'processing_spinner' => 'Processing... (This might take a bit of time on large files)',
'processing_spinner' => 'معالجة... (قد يستغرق هذا بعض الوقت على ملفات كبيرة)',
'optional_infos' => 'Optional Information',
'order_details' => 'Order Related Information'
];

View file

@ -23,6 +23,7 @@ return [
'restore' => 'استعادة الأصل',
'pending' => 'قيد الانتظار',
'undeployable' => 'غير قابل للتوزيع',
'undeployable_tooltip' => 'This asset has a status label that is undeployable and cannot be checked out at this time.',
'view' => 'عرض الأصل',
'csv_error' => 'You have an error in your CSV file:',
'import_text' => '

View file

@ -8,6 +8,7 @@ return [
'change' => 'ادخال \\ اخراج',
'checkout_date' => 'تاريخ الاخراج',
'checkoutto' => 'الاخراج',
'components_cost' => 'Total Components Cost',
'current_value' => 'Current Value',
'diff' => 'الفرق',
'dl_csv' => 'التنزيل كملف CSV',

View file

@ -1,8 +1,8 @@
<?php
return array(
'about_licenses_title' => 'حول التراخيص',
'about_licenses' => 'تستخدم التراخيص لتتبع البرمجيات. كل لديه عدد محدد من المقاعد التي يمكن اخراجها للأفراد',
'about_licenses_title' => 'حول التراخيص',
'about_licenses' => 'تستخدم التراخيص لتتبع البرمجيات. كل لديه عدد محدد من المقاعد التي يمكن اخراجها للأفراد',
'checkin' => 'ادخال مقعد الترخيص',
'checkout_history' => 'أرشيف الاخراج',
'checkout' => 'اخراج مقعد ترخيص',
@ -18,4 +18,30 @@ return array(
'software_licenses' => 'تراخيص البرامج',
'user' => 'مستخدم',
'view' => 'عرض الترخيص',
'delete_disabled' => 'This license cannot be deleted yet because some seats are still checked out.',
'bulk' =>
[
'checkin_all' => [
'button' => 'Checkin All Seats',
'modal' => 'This will action checkin one seat. | This action will checkin all :checkedout_seats_count seats for this license.',
'enabled_tooltip' => 'Checkin ALL seats for this license from both users and assets',
'disabled_tooltip' => 'This is disabled because there are no seats currently checked out',
'success' => 'License successfully checked in! | All licenses were successfully checked in!',
'log_msg' => 'Checked in via bulk license checkout in license GUI',
],
'checkout_all' => [
'button' => 'Checkout All Seats',
'modal' => 'This action will checkout one seat to the first available user. | This action will checkout all :available_seats_count seats to the first available users. A user is considered available for this seat if they do not already have this license checked out to them, and the Auto-Assign License property is enabled on their user account.',
'enabled_tooltip' => 'Checkout ALL seats (or as many as are available) to ALL users',
'disabled_tooltip' => 'This is disabled because there are no seats currently available',
'success' => 'License successfully checked out! | :count licenses were successfully checked out!',
'error_no_seats' => 'There are no remaining seats left for this license.',
'warn_not_enough_seats' => ':count users were assigned this license, but we ran out of available license seats.',
'warn_no_avail_users' => 'Nothing to do. There are no users who do not already have this license assigned to them.',
'log_msg' => 'Checked out via bulk license checkout in license GUI',
],
],
);

View file

@ -2,6 +2,7 @@
return array(
'support_url_help' => 'Use <code>{LOCALE}</code> and <code>{SERIAL}</code> in your URL as variables to have those values auto-populate when viewing assets.',
'does_not_exist' => 'الشركة المصنعة غير موجودة.',
'assoc_users' => 'هذه الشركة المصنعة مرتبطة حاليا مع موديل واحد على الأقل وبالتالي لا يمكن حذفها. يرجى تحديث الموديلات الخاصة بك بحيث لا تشير لهذه الشركة المصنعة وحاول مرة أخرى. ',

View file

@ -10,6 +10,7 @@ return array(
'support_email' => 'دعم البريد الإلكتروني',
'support_phone' => 'دعم الهاتف',
'support_url' => 'رابط الدعم التقني',
'warranty_lookup_url' => 'Warranty Lookup URL',
'update' => 'تحديث الشركة المصنعة',
'url' => 'الرابط',

View file

@ -6,7 +6,7 @@ return array(
'deleted' => 'تم حذف هذا الموديل.',
'bulk_delete' => 'حذف موديلات الاصول بالجملة',
'bulk_delete_help' => 'استخدم مربعات الاختيار أدناه لتأكيد حذف موديلات الأصول المحددة. لا يمكن حذف موديلات الأصول التي تحتوي على أصول مرتبطة بها إلى أن يتم ربط الأصول بموديل مختلف.',
'bulk_delete_warn' => 'You are about to delete one asset model.|You are about to delete :model_count asset models.',
'bulk_delete_warn' => 'أنت على وشك حذف نموذج واحد للأصول.|أنت على وشك حذف :model_count من نماذج الأصول.',
'restore' => 'إستعادة الموديل',
'requestable' => 'يمكن للمستخدمين طلب هذا الموديل',
'show_mac_address' => 'عرض حقل عنوان ماك MAC في الأصول لهذا الموديل',

View file

@ -32,14 +32,14 @@ return array(
'bulkedit' => array(
'error' => 'لم يتم تغيير أي حقول، لذلك لم يتم تحديث أي شيء.',
'success' => 'Model successfully updated. |:model_count models successfully updated.',
'warn' => 'You are about to update the properies of the following model: |You are about to edit the properties of the following :model_count models:',
'success' => 'تم تحديث النموذج بنجاح. |تم تحديث :model_count نموذج بنجاح.',
'warn' => 'أنت على وشك تحديث خصائص النموذج التالي model: |أنت على وشك تعديل خصائص :model_count models:',
),
'bulkdelete' => array(
'error' => 'لم يتم اختيار أي موديلات، لذلك لم يتم حذف أي شيء.',
'success' => 'Model deleted!|:success_count models deleted!',
'success' => 'تم حذف النموذج!|تم حذف :success_count نموذج!',
'success_partial' => 'تم حذف:success_count: من الموديلات، ومع ذلك تعذر حذف fail_count: نظرًا لأنها لا تزال تحتوي على أصول مقترنة بها.'
),

View file

@ -32,7 +32,7 @@ return [
'backups_restoring' => 'Restoring from Backup',
'backups_upload' => 'Upload Backup',
'backups_path' => 'Backups on the server are stored in <code>:path</code>',
'backups_restore_warning' => 'Use the restore button <small><span class="btn btn-xs btn-warning"><i class="text-white fas fa-retweet" aria-hidden="true"></i></span></small> to restore from a previous backup. (This does not currently work with S3 file storage or Docker.<br><br>Your <strong>entire :app_name database and any uploaded files will be completely replaced</strong> by what\'s in the backup file. ',
'backups_restore_warning' => 'Use the restore button <small><span class="btn btn-xs btn-warning"><i class="text-white fas fa-retweet" aria-hidden="true"></i></span></small> to restore from a previous backup. (This does not currently work with S3 file storage or Docker.)<br><br>Your <strong>entire :app_name database and any uploaded files will be completely replaced</strong> by what\'s in the backup file. ',
'backups_logged_out' => 'سيتم تسجيل الخروج من جميع المستخدمين الحاليين، بما في ذلك انت، بمجرد اكتمال الاستعادة.',
'backups_large' => 'Very large backups may time out on the restore attempt and may still need to be run via command line. ',
'barcode_settings' => 'إعدادات الباركود',
@ -86,6 +86,8 @@ return [
'ldap_settings' => 'إعدادات لداب',
'ldap_client_tls_cert_help' => 'Client-Side TLS Certificate and Key for LDAP connections are usually only useful in Google Workspace configurations with "Secure LDAP." Both are required.',
'ldap_client_tls_key' => 'LDAP Client-Side TLS key',
'ldap_location' => 'LDAP Location',
'ldap_location_help' => 'The Ldap Location field should be used if <strong>an OU is not being used in the Base Bind DN.</strong> Leave this blank if an OU search is being used.',
'ldap_login_test_help' => 'أدخل اسم مستخدم وكلمة مرور LDAP من الاسم المميز الأساسي DN الذي حددته أعلاه لاختبار ما إذا كان قد تمت تهيئة معلومات تسجيل الدخول إلى LDAP بشكل صحيح أم لا. يجب حفظ تحديث LDAP الخاص بك أولا.',
'ldap_login_sync_help' => 'هذا يختبر فقط أن LDAP يستطيع المزامنة بشكل صحيح. إذا كان استعلام التوثيق الى LDAP الخاص بك غير صحيح، قد لا يزال المستخدمون غير قادرين على تسجيل الدخول. يجب عليك اولا حفظ اي تغييرات في إعدادات LDAP.',
'ldap_manager' => 'LDAP Manager',
@ -328,4 +330,9 @@ return [
'setup_migration_create_user' => 'Next: Create User',
'ldap_settings_link' => 'LDAP Settings Page',
'slack_test' => 'Test <i class="fab fa-slack"></i> Integration',
'google_callback_help' => 'This should be entered as the callback URL in your Google OAuth app settings in your organization&apos;s <strong><a href="https://console.cloud.google.com/" target="_blank">Google developer console <i class="fa fa-external-link" aria-hidden="true"></i></a></strong>.',
'google_login' => 'Google Workspace Login Settings',
'enable_google_login' => 'Enable users to login with Google Workspace',
'enable_google_login_help' => 'Users will not be automatically provisioned. They must have an existing account here AND in Google Workspace, and their username here must match their Google Workspace email address. ',
];

View file

@ -50,5 +50,5 @@ return [
'email_credentials_text' => 'Email my credentials to the email address above',
'next_save_user' => 'Next: Save User',
'all_assigned_list_generation' => 'تم إنشاؤها في:',
'email_user_creds_on_create' => 'Email this user their credentials?',
'email_user_creds_on_create' => 'إرسال بيانات دخول هذا المستخدم بالبريد الإلكتروني؟',
];

View file

@ -6,7 +6,7 @@ return array(
'declined' => 'لقد رفضت هذا الأصل بنجاح.',
'bulk_manager_warn' => 'تم تحديث المستخدمين بنجاح، ولكن لم يتم حفظ إدخال مديرك لأن المدير الذي حددته كان أيضا في قائمة المستخدمين التي سيتم تعديلها، وقد لا يكون المستخدمون مديرهم الخاص. يرجى تحديد المستخدمين مرة أخرى، باستثناء المدير.',
'user_exists' => 'المستخدم موجود مسبقاً!',
'user_not_found' => 'المستخدم :id غير موجود.',
'user_not_found' => 'User does not exist.',
'user_login_required' => 'حقل تسجيل الدخول اجباري',
'user_password_required' => 'كلمة المرور اجبارية.',
'insufficient_permissions' => 'صلاحيات غير كافية.',

View file

@ -12,5 +12,8 @@ return [
'remember_me' => 'تذكرني',
'username_help_top' => 'أدخل اسم المستخدم الخاص بك <strong></strong> ليتم إرسال رابط إعادة تعيين كلمة المرور إلى البريد الإلكتروني.',
'username_help_bottom' => 'قد يكون اسم المستخدم وعنوان البريد الإلكتروني الخاصين بك متماثلين، ولكن قد لا يكونا كذلك، بناءً على الإعدادات الخاصة بك. إذا كنت لا تستطيع تذكر اسم المستخدم الخاص بك، اتصل بالمسؤول. لن يتم إرسال رابط إعادة تعيين كلمة المرور عبر البريد الإلكتروني إلى أسماء المستخدمين التي لا تحتوي على عنوان بريد إلكتروني مرتبط بها ',
];
'google_login' => 'Or login with Google Workspace',
'google_login_failed' => 'Google Login failed, please try again.',
];

View file

@ -92,6 +92,7 @@ return [
'debug_warning_text' => 'هذا التطبيق يعمل في وضع الإنتاج مع تمكين التصحيح. هذا يمكن أن يعرض البيانات الحساسة إذا كان التطبيق الخاص بك هو في متناول العالم الخارجي. تعطيل وضع التصحيح عن طريق تعيين قيمة <code>APP_DEBUG</code> في ملف <code>.env</code> إلى <code>false</code>.',
'delete' => 'حذف',
'delete_confirm' => 'هل أنت متأكد من حذف :المنتج؟',
'delete_confirm_no_undo' => 'Are you sure you wish to delete :item? This can not be undone.',
'deleted' => 'تم حذفها',
'delete_seats' => 'المقاعد المحذوفة',
'deletion_failed' => 'فشل الحذف',
@ -439,4 +440,13 @@ return [
'setup_migration_output' => 'ناتج الهجرة:',
'setup_migration_create_user' => 'التالي: إنشاء مستخدم',
'importer_generic_error' => 'Your file import is complete, but we did receive an error. This is usually caused by third-party API throttling from a notification webhook (such as Slack) and would not have interfered with the import itself, but you should confirm this.',
'confirm' => 'Confirm',
'autoassign_licenses' => 'Auto-Assign Licenses',
'autoassign_licenses_help' => 'Allow this user to have licenses assigned via the bulk-assign license UI or cli tools.',
'autoassign_licenses_help_long' => 'This allows a user to be have licenses assigned via the bulk-assign license UI or cli tools. (For example, you might not want contractors to be auto-assigned a license you would provide to only staff members. You can still individually assign licenses to those users, but they will not be included in the Checkout License to All Users functions.)',
'no_autoassign_licenses_help' => 'Do not include user for bulk-assigning through the license UI or cli tools.',
'modal_confirm_generic' => 'Are you sure?',
'cannot_be_deleted' => 'This item cannot be deleted',
'undeployable_tooltip' => 'This item cannot be checked out. Check the quantity remaining.',
];

View file

@ -74,6 +74,7 @@ return [
'your_credentials' => 'أوراق اعتماد قنص-إيت الخاص بك',
'Accessory_Checkin_Notification' => 'تم تسحيل الملحق',
'Asset_Checkin_Notification' => 'تم تسجيل الأصل',
'Asset_Checkout_Notification' => 'Asset checked out',
'License_Checkin_Notification' => 'تم تسجيل الرخصة',
'Expected_Checkin_Report' => 'تقرير تسجيل الأصول المتوقع',
'Expected_Checkin_Notification' => 'تذكير: تاريخ تحقق :name يقترب من الموعد النهائي',

View file

@ -67,6 +67,8 @@ return [
'array' => 'يجب أن تحتوي :attribute على الأقل :min من العناصر.',
],
'starts_with' => 'The :attribute must start with one of the following: :values.',
'ends_with' => 'The :attribute must end with one of the following: :values.',
'not_in' => ':attribute المحدد غير صالح.',
'numeric' => 'يجب أن يكون :attribute رقما.',
'present' => 'يجب أن يكون :attribute موجود.',

View file

@ -17,5 +17,6 @@ return array(
'use_default_eula' => 'Използване на <a href="#" data-toggle="modal" data-target="#eulaModal">EULA по подразбиране</a>.',
'use_default_eula_disabled' => '<del>Използване на EULA по подразбиране</del> Няма EULA по подразбиране. Добавете я в Настройки.',
'clone' => 'Clone Accessory',
'delete_disabled' => 'This accessory cannot be deleted yet because some items are still checked out.',
);

View file

@ -23,7 +23,8 @@ return array(
'checkout' => array(
'error' => 'Компонентът не беше отписан, моля опитайте отново.',
'success' => 'Компонентът отписан успешно.',
'user_does_not_exist' => 'Невалиден потребител. Моля опитайте отново.'
'user_does_not_exist' => 'Невалиден потребител. Моля опитайте отново.',
'unavailable' => 'Not enough components remaining: :remaining remaining, :requested requested ',
),
'checkin' => array(

View file

@ -23,7 +23,8 @@ return array(
'checkout' => array(
'error' => 'Консумативът не беше изписан. Моля опитайте отново.',
'success' => 'Консумативът изписан успешно.',
'user_does_not_exist' => 'Невалиден потребител. Моля опитайте отново.'
'user_does_not_exist' => 'Невалиден потребител. Моля опитайте отново.',
'unavailable' => 'There are not enough consumables for this checkout. Please check the quantity left. ',
),
'checkin' => array(

View file

@ -49,4 +49,6 @@ return [
'unique' => 'Unique',
'display_in_user_view' => 'Allow the checked out user to view these values in their View Assigned Assets page',
'display_in_user_view_table' => 'Visible to User',
'auto_add_to_fieldsets' => 'Automatically add this to every new fieldset',
'add_to_preexisting_fieldsets' => 'Add to any existing fieldsets',
];

View file

@ -23,6 +23,7 @@ return [
'restore' => 'Възстановяване на актив',
'pending' => 'Предстоящ',
'undeployable' => 'Не може да бъде предоставян',
'undeployable_tooltip' => 'This asset has a status label that is undeployable and cannot be checked out at this time.',
'view' => 'Преглед на актив',
'csv_error' => 'Имате грешка във вашият CSV файл:',
'import_text' => '

View file

@ -8,6 +8,7 @@ return [
'change' => 'Предоставяне',
'checkout_date' => 'Дата на изписване',
'checkoutto' => 'Изписан',
'components_cost' => 'Total Components Cost',
'current_value' => 'Текуща стойност',
'diff' => 'Разлика',
'dl_csv' => 'Сваляне на CSV',

View file

@ -1,8 +1,8 @@
<?php
return array(
'about_licenses_title' => 'Относно лицензи',
'about_licenses' => 'Лицензите се използват за проследяване на софтуер. Те имат определен брой места, които могат да бъдат отписани към лица',
'about_licenses_title' => 'Относно лицензи',
'about_licenses' => 'Лицензите се използват за проследяване на софтуер. Те имат определен брой места, които могат да бъдат отписани към лица',
'checkin' => 'Вписване на потребителски лиценз',
'checkout_history' => 'История на изписванията',
'checkout' => 'Изписване на потребителски лиценз',
@ -18,4 +18,30 @@ return array(
'software_licenses' => 'Софтуерни лицензи',
'user' => 'Потребител',
'view' => 'Преглед на лиценз',
'delete_disabled' => 'This license cannot be deleted yet because some seats are still checked out.',
'bulk' =>
[
'checkin_all' => [
'button' => 'Checkin All Seats',
'modal' => 'This will action checkin one seat. | This action will checkin all :checkedout_seats_count seats for this license.',
'enabled_tooltip' => 'Checkin ALL seats for this license from both users and assets',
'disabled_tooltip' => 'This is disabled because there are no seats currently checked out',
'success' => 'License successfully checked in! | All licenses were successfully checked in!',
'log_msg' => 'Checked in via bulk license checkout in license GUI',
],
'checkout_all' => [
'button' => 'Checkout All Seats',
'modal' => 'This action will checkout one seat to the first available user. | This action will checkout all :available_seats_count seats to the first available users. A user is considered available for this seat if they do not already have this license checked out to them, and the Auto-Assign License property is enabled on their user account.',
'enabled_tooltip' => 'Checkout ALL seats (or as many as are available) to ALL users',
'disabled_tooltip' => 'This is disabled because there are no seats currently available',
'success' => 'License successfully checked out! | :count licenses were successfully checked out!',
'error_no_seats' => 'There are no remaining seats left for this license.',
'warn_not_enough_seats' => ':count users were assigned this license, but we ran out of available license seats.',
'warn_no_avail_users' => 'Nothing to do. There are no users who do not already have this license assigned to them.',
'log_msg' => 'Checked out via bulk license checkout in license GUI',
],
],
);

View file

@ -2,6 +2,7 @@
return array(
'support_url_help' => 'Use <code>{LOCALE}</code> and <code>{SERIAL}</code> in your URL as variables to have those values auto-populate when viewing assets.',
'does_not_exist' => 'Несъществуващ производител.',
'assoc_users' => 'Този производител е асоцииран с поне един от моделите и не може да бъде изтрит. Моля, променете връзките на моделите по отношение на този производител и опитайте отново. ',

View file

@ -10,6 +10,7 @@ return array(
'support_email' => 'Email за поддръжка',
'support_phone' => 'Телефон за поддръжка',
'support_url' => 'URL адрес за поддръжка',
'warranty_lookup_url' => 'Warranty Lookup URL',
'update' => 'Обновяване на производител',
'url' => 'URL адрес',

View file

@ -32,7 +32,7 @@ return [
'backups_restoring' => 'Възстановяване от архив',
'backups_upload' => 'Качване на архив',
'backups_path' => 'Архивите на сървъра са записани в <code>:path</code>',
'backups_restore_warning' => 'Use the restore button <small><span class="btn btn-xs btn-warning"><i class="text-white fas fa-retweet" aria-hidden="true"></i></span></small> to restore from a previous backup. (This does not currently work with S3 file storage or Docker.<br><br>Your <strong>entire :app_name database and any uploaded files will be completely replaced</strong> by what\'s in the backup file. ',
'backups_restore_warning' => 'Use the restore button <small><span class="btn btn-xs btn-warning"><i class="text-white fas fa-retweet" aria-hidden="true"></i></span></small> to restore from a previous backup. (This does not currently work with S3 file storage or Docker.)<br><br>Your <strong>entire :app_name database and any uploaded files will be completely replaced</strong> by what\'s in the backup file. ',
'backups_logged_out' => 'All existing users, including you, will be logged out once your restore is complete.',
'backups_large' => 'Много големите архиви може да не могат да се възстановят поради изтичане на времето на сесията и ще трябва да се възстановят ръчно през команден ред. ',
'barcode_settings' => 'Настройки на баркод',
@ -86,6 +86,8 @@ return [
'ldap_settings' => 'LDAP настройки',
'ldap_client_tls_cert_help' => 'Client-Side TLS Certificate and Key for LDAP connections are usually only useful in Google Workspace configurations with "Secure LDAP." Both are required.',
'ldap_client_tls_key' => 'LDAP Client-Side TLS key',
'ldap_location' => 'LDAP Location',
'ldap_location_help' => 'The Ldap Location field should be used if <strong>an OU is not being used in the Base Bind DN.</strong> Leave this blank if an OU search is being used.',
'ldap_login_test_help' => 'Въведете валидни LDAP потребител и парола от базовия DN, който указахте по-горе, за да тествате коректната конфигурация. НЕОБХОДИМО Е ДА ЗАПИШЕТЕ LDAP НАСТРОЙКИТЕ ПРЕДИ ТОВА.',
'ldap_login_sync_help' => 'Това единствено проверява дали LDAP може да се синхронизира успешно. Ако вашата LDAP заявка за оторизация не е коректна е възможно потребителите да не могат да влязат. НЕОБХОДИМО Е ДА ЗАПИШЕТЕ LDAP НАСТРОЙКИТЕ ПРЕДИ ТОВА.',
'ldap_manager' => 'LDAP Manager',
@ -328,4 +330,9 @@ return [
'setup_migration_create_user' => 'Next: Create User',
'ldap_settings_link' => 'LDAP Settings Page',
'slack_test' => 'Test <i class="fab fa-slack"></i> Integration',
'google_callback_help' => 'This should be entered as the callback URL in your Google OAuth app settings in your organization&apos;s <strong><a href="https://console.cloud.google.com/" target="_blank">Google developer console <i class="fa fa-external-link" aria-hidden="true"></i></a></strong>.',
'google_login' => 'Google Workspace Login Settings',
'enable_google_login' => 'Enable users to login with Google Workspace',
'enable_google_login_help' => 'Users will not be automatically provisioned. They must have an existing account here AND in Google Workspace, and their username here must match their Google Workspace email address. ',
];

View file

@ -6,7 +6,7 @@ return array(
'declined' => 'Активът беше отказан.',
'bulk_manager_warn' => 'Вашите потребителски профили бяха обновени успешно, обаче вашето управителско вписване не беше запазено, защото управителят, които сте избрали бе в списъка с потребителски профили за промяна и потребителите не могат да бъдат свои управители. Моля изберете вашите потребителски профили отново, с изключение на управителя.',
'user_exists' => 'Потребителят вече съществува!',
'user_not_found' => 'Потребител [:id] не съществува.',
'user_not_found' => 'User does not exist.',
'user_login_required' => 'Полето за вход е задължително',
'user_password_required' => 'Паролата е задължителна.',
'insufficient_permissions' => 'Нямате необходимите права.',

View file

@ -12,5 +12,8 @@ return [
'remember_me' => 'Запомни ме',
'username_help_top' => 'Въведете вашето <strong>потребителско име</strong> за да получите линк за смяна на парола.',
'username_help_bottom' => 'Вашето потребителско име и е-майл адрес <em>може да</em> са еднакви или да не са, зависимост от вашата конфигурация. Ако не помните вашето потребителско име се свържете с Администратора. <br><br><strong>Потребители които нямат въведен е-майл адрес няма да получат линк за смяна на парола.</strong> ',
];
'google_login' => 'Or login with Google Workspace',
'google_login_failed' => 'Google Login failed, please try again.',
];

View file

@ -92,6 +92,7 @@ return [
'debug_warning_text' => 'Това приложение се изпълнява в режим на производство с разрешено отстраняване на грешки. Това може да изложи чувствителни данни, ако приложението ви е достъпно за външния свят. Забранете режим отстраняване на грешки чрез задаване на стойността <code>APP_DEBUF</code> <code>.env</code> във файла <code>false</code>.',
'delete' => 'Изтриване',
'delete_confirm' => 'Сигурни ли сте, че желаете изтриването на :item?',
'delete_confirm_no_undo' => 'Are you sure you wish to delete :item? This can not be undone.',
'deleted' => 'Изтрито',
'delete_seats' => 'Изтрити работни места за лиценз',
'deletion_failed' => 'Deletion failed',
@ -439,4 +440,13 @@ return [
'setup_migration_output' => 'Migration output:',
'setup_migration_create_user' => 'Next: Create User',
'importer_generic_error' => 'Your file import is complete, but we did receive an error. This is usually caused by third-party API throttling from a notification webhook (such as Slack) and would not have interfered with the import itself, but you should confirm this.',
'confirm' => 'Confirm',
'autoassign_licenses' => 'Auto-Assign Licenses',
'autoassign_licenses_help' => 'Allow this user to have licenses assigned via the bulk-assign license UI or cli tools.',
'autoassign_licenses_help_long' => 'This allows a user to be have licenses assigned via the bulk-assign license UI or cli tools. (For example, you might not want contractors to be auto-assigned a license you would provide to only staff members. You can still individually assign licenses to those users, but they will not be included in the Checkout License to All Users functions.)',
'no_autoassign_licenses_help' => 'Do not include user for bulk-assigning through the license UI or cli tools.',
'modal_confirm_generic' => 'Are you sure?',
'cannot_be_deleted' => 'This item cannot be deleted',
'undeployable_tooltip' => 'This item cannot be checked out. Check the quantity remaining.',
];

View file

@ -74,6 +74,7 @@ return [
'your_credentials' => 'Вашите идентификационни данни за Snipe-IT',
'Accessory_Checkin_Notification' => 'Аксесоарат е вписан',
'Asset_Checkin_Notification' => 'Актива е вписан',
'Asset_Checkout_Notification' => 'Asset checked out',
'License_Checkin_Notification' => 'Лиценза е вписан',
'Expected_Checkin_Report' => 'Очакван рапорт за вписване на актив',
'Expected_Checkin_Notification' => 'Напомняне: :name крайната дата за вписване наближава',

View file

@ -67,6 +67,8 @@ return [
'array' => 'Атрибутът: трябва да има поне: min елементи.',
],
'starts_with' => 'The :attribute must start with one of the following: :values.',
'ends_with' => 'The :attribute must end with one of the following: :values.',
'not_in' => 'Избраният :attribute е невалиден.',
'numeric' => ':attribute трябва да бъде число.',
'present' => 'Полето на атрибута трябва да е налице.',

View file

@ -17,5 +17,6 @@ return array(
'use_default_eula' => 'Use the <a href="#" data-toggle="modal" data-target="#eulaModal">primary default EULA</a> instead.',
'use_default_eula_disabled' => '<del>Use the primary default EULA instead.</del> No primary default EULA is set. Please add one in Settings.',
'clone' => 'Clone Accessory',
'delete_disabled' => 'This accessory cannot be deleted yet because some items are still checked out.',
);

View file

@ -23,7 +23,8 @@ return array(
'checkout' => array(
'error' => 'Component was not checked out, please try again',
'success' => 'Component checked out successfully.',
'user_does_not_exist' => 'That user is invalid. Please try again.'
'user_does_not_exist' => 'That user is invalid. Please try again.',
'unavailable' => 'Not enough components remaining: :remaining remaining, :requested requested ',
),
'checkin' => array(

View file

@ -23,7 +23,8 @@ return array(
'checkout' => array(
'error' => 'Consumable was not checked out, please try again',
'success' => 'Consumable checked out successfully.',
'user_does_not_exist' => 'That user is invalid. Please try again.'
'user_does_not_exist' => 'That user is invalid. Please try again.',
'unavailable' => 'There are not enough consumables for this checkout. Please check the quantity left. ',
),
'checkin' => array(

View file

@ -49,4 +49,6 @@ return [
'unique' => 'Unique',
'display_in_user_view' => 'Allow the checked out user to view these values in their View Assigned Assets page',
'display_in_user_view_table' => 'Visible to User',
'auto_add_to_fieldsets' => 'Automatically add this to every new fieldset',
'add_to_preexisting_fieldsets' => 'Add to any existing fieldsets',
];

View file

@ -23,6 +23,7 @@ return [
'restore' => 'Restore Asset',
'pending' => 'Pending',
'undeployable' => 'Undeployable',
'undeployable_tooltip' => 'This asset has a status label that is undeployable and cannot be checked out at this time.',
'view' => 'View Asset',
'csv_error' => 'You have an error in your CSV file:',
'import_text' => '

View file

@ -8,6 +8,7 @@ return [
'change' => 'In/Out',
'checkout_date' => 'Checkout Date',
'checkoutto' => 'Checked Out',
'components_cost' => 'Total Components Cost',
'current_value' => 'Current Value',
'diff' => 'Diff',
'dl_csv' => 'Download CSV',

View file

@ -1,8 +1,8 @@
<?php
return array(
'about_licenses_title' => 'About Licenses',
'about_licenses' => 'Licenses are used to track software. They have a specified number of seats that can be checked out to individuals',
'about_licenses_title' => 'About Licenses',
'about_licenses' => 'Licenses are used to track software. They have a specified number of seats that can be checked out to individuals',
'checkin' => 'Checkin License Seat',
'checkout_history' => 'Checkout History',
'checkout' => 'Checkout License Seat',
@ -18,4 +18,30 @@ return array(
'software_licenses' => 'Software Licenses',
'user' => 'User',
'view' => 'View License',
'delete_disabled' => 'This license cannot be deleted yet because some seats are still checked out.',
'bulk' =>
[
'checkin_all' => [
'button' => 'Checkin All Seats',
'modal' => 'This will action checkin one seat. | This action will checkin all :checkedout_seats_count seats for this license.',
'enabled_tooltip' => 'Checkin ALL seats for this license from both users and assets',
'disabled_tooltip' => 'This is disabled because there are no seats currently checked out',
'success' => 'License successfully checked in! | All licenses were successfully checked in!',
'log_msg' => 'Checked in via bulk license checkout in license GUI',
],
'checkout_all' => [
'button' => 'Checkout All Seats',
'modal' => 'This action will checkout one seat to the first available user. | This action will checkout all :available_seats_count seats to the first available users. A user is considered available for this seat if they do not already have this license checked out to them, and the Auto-Assign License property is enabled on their user account.',
'enabled_tooltip' => 'Checkout ALL seats (or as many as are available) to ALL users',
'disabled_tooltip' => 'This is disabled because there are no seats currently available',
'success' => 'License successfully checked out! | :count licenses were successfully checked out!',
'error_no_seats' => 'There are no remaining seats left for this license.',
'warn_not_enough_seats' => ':count users were assigned this license, but we ran out of available license seats.',
'warn_no_avail_users' => 'Nothing to do. There are no users who do not already have this license assigned to them.',
'log_msg' => 'Checked out via bulk license checkout in license GUI',
],
],
);

View file

@ -2,6 +2,7 @@
return array(
'support_url_help' => 'Use <code>{LOCALE}</code> and <code>{SERIAL}</code> in your URL as variables to have those values auto-populate when viewing assets.',
'does_not_exist' => 'Manufacturer does not exist.',
'assoc_users' => 'This manufacturer is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this manufacturer and try again. ',

View file

@ -10,6 +10,7 @@ return array(
'support_email' => 'Support Email',
'support_phone' => 'Support Phone',
'support_url' => 'Support URL',
'warranty_lookup_url' => 'Warranty Lookup URL',
'update' => 'Update Manufacturer',
'url' => 'URL',

View file

@ -32,7 +32,7 @@ return [
'backups_restoring' => 'Restoring from Backup',
'backups_upload' => 'Upload Backup',
'backups_path' => 'Backups on the server are stored in <code>:path</code>',
'backups_restore_warning' => 'Use the restore button <small><span class="btn btn-xs btn-warning"><i class="text-white fas fa-retweet" aria-hidden="true"></i></span></small> to restore from a previous backup. (This does not currently work with S3 file storage or Docker.<br><br>Your <strong>entire :app_name database and any uploaded files will be completely replaced</strong> by what\'s in the backup file. ',
'backups_restore_warning' => 'Use the restore button <small><span class="btn btn-xs btn-warning"><i class="text-white fas fa-retweet" aria-hidden="true"></i></span></small> to restore from a previous backup. (This does not currently work with S3 file storage or Docker.)<br><br>Your <strong>entire :app_name database and any uploaded files will be completely replaced</strong> by what\'s in the backup file. ',
'backups_logged_out' => 'All existing users, including you, will be logged out once your restore is complete.',
'backups_large' => 'Very large backups may time out on the restore attempt and may still need to be run via command line. ',
'barcode_settings' => 'Barcode Settings',
@ -86,6 +86,8 @@ return [
'ldap_settings' => 'LDAP Settings',
'ldap_client_tls_cert_help' => 'Client-Side TLS Certificate and Key for LDAP connections are usually only useful in Google Workspace configurations with "Secure LDAP." Both are required.',
'ldap_client_tls_key' => 'LDAP Client-Side TLS key',
'ldap_location' => 'LDAP Location',
'ldap_location_help' => 'The Ldap Location field should be used if <strong>an OU is not being used in the Base Bind DN.</strong> Leave this blank if an OU search is being used.',
'ldap_login_test_help' => 'Enter a valid LDAP username and password from the base DN you specified above to test whether your LDAP login is configured correctly. YOU MUST SAVE YOUR UPDATED LDAP SETTINGS FIRST.',
'ldap_login_sync_help' => 'This only tests that LDAP can sync correctly. If your LDAP Authentication query is not correct, users may still not be able to login. YOU MUST SAVE YOUR UPDATED LDAP SETTINGS FIRST.',
'ldap_manager' => 'LDAP Manager',
@ -328,4 +330,9 @@ return [
'setup_migration_create_user' => 'Next: Create User',
'ldap_settings_link' => 'LDAP Settings Page',
'slack_test' => 'Test <i class="fab fa-slack"></i> Integration',
'google_callback_help' => 'This should be entered as the callback URL in your Google OAuth app settings in your organization&apos;s <strong><a href="https://console.cloud.google.com/" target="_blank">Google developer console <i class="fa fa-external-link" aria-hidden="true"></i></a></strong>.',
'google_login' => 'Google Workspace Login Settings',
'enable_google_login' => 'Enable users to login with Google Workspace',
'enable_google_login_help' => 'Users will not be automatically provisioned. They must have an existing account here AND in Google Workspace, and their username here must match their Google Workspace email address. ',
];

View file

@ -6,7 +6,7 @@ return array(
'declined' => 'You have successfully declined this asset.',
'bulk_manager_warn' => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.',
'user_exists' => 'User already exists!',
'user_not_found' => 'User [:id] does not exist.',
'user_not_found' => 'User does not exist.',
'user_login_required' => 'The login field is required',
'user_password_required' => 'The password is required.',
'insufficient_permissions' => 'Insufficient Permissions.',

View file

@ -12,5 +12,8 @@ return [
'remember_me' => 'Remember Me',
'username_help_top' => 'Enter your <strong>username</strong> to be emailed a password reset link.',
'username_help_bottom' => 'Your username and email address <em>may</em> be the same, but may not be, depending on your configuration. If you cannot remember your username, contact your administrator. <br><br><strong>Usernames without an associated email address will not be emailed a password reset link.</strong> ',
];
'google_login' => 'Or login with Google Workspace',
'google_login_failed' => 'Google Login failed, please try again.',
];

View file

@ -92,6 +92,7 @@ return [
'debug_warning_text' => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
'delete' => 'Suprimeix',
'delete_confirm' => 'Are you sure you wish to delete :item?',
'delete_confirm_no_undo' => 'Are you sure you wish to delete :item? This can not be undone.',
'deleted' => 'S\'ha suprimit',
'delete_seats' => 'Deleted Seats',
'deletion_failed' => 'Deletion failed',
@ -439,4 +440,13 @@ return [
'setup_migration_output' => 'Migration output:',
'setup_migration_create_user' => 'Next: Create User',
'importer_generic_error' => 'Your file import is complete, but we did receive an error. This is usually caused by third-party API throttling from a notification webhook (such as Slack) and would not have interfered with the import itself, but you should confirm this.',
'confirm' => 'Confirm',
'autoassign_licenses' => 'Auto-Assign Licenses',
'autoassign_licenses_help' => 'Allow this user to have licenses assigned via the bulk-assign license UI or cli tools.',
'autoassign_licenses_help_long' => 'This allows a user to be have licenses assigned via the bulk-assign license UI or cli tools. (For example, you might not want contractors to be auto-assigned a license you would provide to only staff members. You can still individually assign licenses to those users, but they will not be included in the Checkout License to All Users functions.)',
'no_autoassign_licenses_help' => 'Do not include user for bulk-assigning through the license UI or cli tools.',
'modal_confirm_generic' => 'Are you sure?',
'cannot_be_deleted' => 'This item cannot be deleted',
'undeployable_tooltip' => 'This item cannot be checked out. Check the quantity remaining.',
];

View file

@ -75,6 +75,7 @@ return [
'your_credentials' => 'Your Snipe-IT credentials',
'Accessory_Checkin_Notification' => 'Accessory checked in',
'Asset_Checkin_Notification' => 'Asset checked in',
'Asset_Checkout_Notification' => 'Asset checked out',
'License_Checkin_Notification' => 'License checked in',
'Expected_Checkin_Report' => 'Expected asset checkin report',
'Expected_Checkin_Notification' => 'Reminder: :name checkin deadline approaching',

View file

@ -67,6 +67,8 @@ return [
'array' => 'The :attribute must have at least :min items.',
],
'starts_with' => 'The :attribute must start with one of the following: :values.',
'ends_with' => 'The :attribute must end with one of the following: :values.',
'not_in' => 'The selected :attribute is invalid.',
'numeric' => 'The :attribute must be a number.',
'present' => 'The :attribute field must be present.',

View file

@ -18,5 +18,6 @@ return array(
'use_default_eula_disabled' => '<del>Použít výchozí EULA.</del>
Žádná výchozí EULA nenastavena. Zadejte novou v nastevení.',
'clone' => 'Clone Accessory',
'delete_disabled' => 'Toto příslušenství ještě nelze odstranit, protože některé jeho položky jsou stále vydány.',
);

View file

@ -23,7 +23,8 @@ return array(
'checkout' => array(
'error' => 'Díl se nepodařilo předat, zkuste to prosím znovu',
'success' => 'Díl byl v pořádku předán.',
'user_does_not_exist' => 'Neplatný uživatel. Zkuste to prosím znovu.'
'user_does_not_exist' => 'Neplatný uživatel. Zkuste to prosím znovu.',
'unavailable' => 'Not enough components remaining: :remaining remaining, :requested requested ',
),
'checkin' => array(

View file

@ -23,7 +23,8 @@ return array(
'checkout' => array(
'error' => 'Spotřební materiál se nepodařilo přidělit, pokuste se o to znovu',
'success' => 'Spotřební materiál byl v pořádku přidělen.',
'user_does_not_exist' => 'Tento uživatel není platný, zkuste to prosím jinak.'
'user_does_not_exist' => 'Tento uživatel není platný, zkuste to prosím jinak.',
'unavailable' => 'There are not enough consumables for this checkout. Please check the quantity left. ',
),
'checkin' => array(

View file

@ -49,4 +49,6 @@ return [
'unique' => 'Unikátní',
'display_in_user_view' => 'Povolit uživateli vyhledat tyto hodnoty na stránce Zobrazit přiřazené položky',
'display_in_user_view_table' => 'Viditelné pro uživatele',
'auto_add_to_fieldsets' => 'Automatically add this to every new fieldset',
'add_to_preexisting_fieldsets' => 'Add to any existing fieldsets',
];

View file

@ -23,6 +23,7 @@ return [
'restore' => 'Obnovit zařízení',
'pending' => 'Čekající',
'undeployable' => 'Nelze vyskladnit',
'undeployable_tooltip' => 'This asset has a status label that is undeployable and cannot be checked out at this time.',
'view' => 'Zobrazit majetek',
'csv_error' => 'Máte chybu v souboru CSV:',
'import_text' => '

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