Enable menu translation (#10298)

And better translation support for sensors, not complete
This commit is contained in:
Tony Murray 2019-06-04 20:03:50 -05:00 committed by GitHub
parent cc0fa745b2
commit 6ba05cdbbb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 556 additions and 232 deletions

View File

@ -617,7 +617,7 @@ class Sensor implements DiscoveryModule, PollerModule
foreach ($sensors as $sensor) {
$sensor_value = $data[$sensor['sensor_id']];
echo " {$sensor['sensor_descr']}: $sensor_value {$types[$sensor['sensor_class']]['unit']}\n";
echo " {$sensor['sensor_descr']}: $sensor_value " . __('sensors.' . $sensor['sensor_class'] . '.unit') . PHP_EOL;
// update rrd and database
$rrd_name = array(

View File

@ -129,125 +129,68 @@ class WirelessSensor extends Sensor
*/
public static function getTypes($valid = false, $device_id = null)
{
// Add new types here
// Add new types here translations/descriptions/units in resources/lang/<lang>/wireless.php
// FIXME I'm really bad with icons, someone please help!
static $types = array(
'ap-count' => array(
'short' => 'APs',
'long' => 'AP Count',
'unit' => '',
static $types = [
'ap-count' => [
'icon' => 'wifi',
),
'clients' => array(
'short' => 'Clients',
'long' => 'Client Count',
'unit' => '',
],
'clients' => [
'icon' => 'tablet',
),
'quality' => array(
'short' => 'Quality',
'long' => 'Quality',
'unit' => '%',
],
'quality' => [
'icon' => 'feed',
),
'capacity' => array(
'short' => 'Capacity',
'long' => 'Capacity',
'unit' => '%',
],
'capacity' => [
'icon' => 'feed',
),
'utilization' => array(
'short' => 'Utilization',
'long' => 'utilization',
'unit' => '%',
],
'utilization' => [
'icon' => 'percent',
),
'rate' => array(
'short' => 'Rate',
'long' => 'TX/RX Rate',
'unit' => 'bps',
],
'rate' => [
'icon' => 'tachometer',
),
'ccq' => array(
'short' => 'CCQ',
'long' => 'Client Connection Quality',
'unit' => '%',
],
'ccq' => [
'icon' => 'wifi',
),
'snr' => array(
'short' => 'SNR',
'long' => 'Signal-to-Noise Ratio',
'unit' => 'dB',
],
'snr' => [
'icon' => 'signal',
),
'ssr' => array(
'short' => 'SSR',
'long' => 'Signal Strength Ratio',
'unit' => 'dB',
],
'ssr' => [
'icon' => 'signal',
),
'mse' => array(
'short' => 'MSE',
'long' => 'Mean Square Error',
'unit' => 'dB',
],
'mse' => [
'icon' => 'signal',
),
'xpi' => array(
'short' => 'XPI',
'long' => 'Cross Polar Interference',
'unit' => 'dB',
],
'xpi' => [
'icon' => 'signal',
),
'rssi' => array(
'short' => 'RSSI',
'long' => 'Received Signal Strength Indicator',
'unit' => 'dBm',
],
'rssi' => [
'icon' => 'signal',
),
'power' => array(
'short' => 'Power/Signal',
'long' => 'TX/RX Power or Signal',
'unit' => 'dBm',
],
'power' => [
'icon' => 'bolt',
),
'noise-floor' => array(
'short' => 'Noise Floor',
'long' => 'Noise Floor',
'unit' => 'dBm/Hz',
],
'noise-floor' => [
'icon' => 'signal',
),
'errors' => array(
'short' => 'Errors',
'long' => 'Errors',
'unit' => '',
],
'errors' => [
'icon' => 'exclamation-triangle',
'type' => 'counter',
),
'error-ratio' => array(
'short' => 'Error Ratio',
'long' => 'Bit/Packet Error Ratio',
'unit' => '%',
],
'error-ratio' => [
'icon' => 'exclamation-triangle',
),
'error-rate' => array(
'short' => 'BER',
'long' => 'Bit Error Rate',
'unit' => 'bps',
],
'error-rate' => [
'icon' => 'exclamation-triangle',
),
'frequency' => array(
'short' => 'Frequency',
'long' => 'Frequency',
'unit' => 'MHz',
],
'frequency' => [
'icon' => 'line-chart',
),
'distance' => array(
'short' => 'Distance',
'long' => 'Distance',
'unit' => 'km',
],
'distance' => [
'icon' => 'space-shuttle',
),
);
],
];
if ($valid) {
$sql = 'SELECT `sensor_class` FROM `wireless_sensors`';

View File

@ -34,9 +34,7 @@ class WirelessSensor extends DeviceRelatedModel
public function classDescr()
{
return collect(collect(\LibreNMS\Device\WirelessSensor::getTypes())
->get($this->sensor_class, []))
->get('short', ucwords(str_replace('_', ' ', $this->sensor_class)));
return __("wireless.$this->sensor_class.short");
}
public function icon()

View File

@ -58,7 +58,7 @@ function printEntPhysical($device, $ent, $level, $class)
}
if ($ent['entPhysicalClass'] == 'sensor' && isset($sensor)) {
echo ' ('.trim($sensor['sensor_current'] . ' ' . get_units_from_sensor($sensor)) . ')';
echo ' (' . trim($sensor['sensor_current'] . ' ' . __('sensors.' . $sensor['sensor_class'] . '.unit')) . ')';
}
if (isset($link)) {

View File

@ -38,7 +38,7 @@ foreach ($datas as $type) {
}
echo '>';
echo generate_link($types[$type]['short'], $wireless_link_array, array('metric' => $type));
echo generate_link(__("wireless.$type.short"), $wireless_link_array, ['metric' => $type]);
echo '</span>';
}
@ -47,9 +47,10 @@ print_optionbar_end();
if ($vars['metric'] == 'overview') {
foreach ($datas as $type) {
$text = $types[$type]['long'];
if (!empty($types[$type]['unit'])) {
$text .= ' (' . $types[$type]['unit'] . ')';
$text = __("wireless.$type.long");
$unit = __("wireless.$type.unit");
if (!empty($unit)) {
$text .= " ($unit)";
}
$graph_title = generate_link($text, $wireless_link_array, array('metric' => $type));
@ -58,7 +59,7 @@ if ($vars['metric'] == 'overview') {
include $config['install_dir'] . '/includes/html/print-device-graph.php';
}
} elseif (isset($types[$vars['metric']])) {
$unit = $types[$vars['metric']]['unit'];
$unit = __('wireless.' . $vars['metric'] . '.unit');
$factor = 1;
if ($unit == 'MHz') {
$unit = 'Hz';

View File

@ -1676,46 +1676,6 @@ function return_number($value)
return $value;
}
function get_units_from_sensor($sensor)
{
switch ($sensor['sensor_class']) {
case 'airflow':
return 'cfm';
case 'current':
return 'A';
case 'dbm':
case 'signal':
return 'dBm';
case 'fanspeed':
return 'rpm';
case 'frequency':
return 'Hz';
case 'charge':
case 'humidity':
case 'load':
return '%';
case 'cooling':
case 'power':
return 'W';
case 'power_consumed':
return 'kWh';
case 'pressure':
return 'kPa';
case 'runtime':
return 'Min';
case 'snr':
return 'SNR';
case 'state':
return '#';
case 'temperature':
return '°C';
case 'voltage':
return 'V';
default:
return '';
}
}
function parse_entity_state($state, $value)
{
$data = array(

View File

@ -0,0 +1,169 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Sesnors Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used to translate names and units of sensors
|
*/
'airflow' => [
'short' => 'Airflow',
'long' => 'Airflow',
'unit' => 'cfm',
'unit_long' => 'Cubic Feet per Minute',
],
'ber' => [
'short' => 'BER',
'long' => 'Bit Error Rate',
'unit' => '',
'unit_long' => '',
],
'charge' => [
'short' => 'Charge',
'long' => 'Charge Percent',
'unit' => '%',
'unit_long' => 'Percent',
],
'chromatic_dispersion' => [
'short' => 'Chromatic Dispersion',
'long' => 'Chromatic Dispersion',
'unit' => 'ps/nm/km',
'unit_long' => 'Picoseconds per Nanometer per Kilometer',
],
'cooling' => [
'short' => 'Cooling',
'long' => '',
'unit' => 'W',
'unit_long' => 'Watts',
],
'count' => [
'short' => 'Count',
'long' => 'Count',
'unit' => '',
'unit_long' => '',
],
'current' => [
'short' => 'Current',
'long' => 'Current',
'unit' => 'A',
'unit_long' => 'Amperes',
],
'dbm' => [
'short' => 'dBm',
'long' => 'dBm',
'unit' => 'dBm',
'unit_long' => 'Decibal-Milliwatts',
],
'delay' => [
'short' => 'Delay',
'long' => 'Delay',
'unit' => 's',
'unit_long' => 'Seconds',
],
'eer' => [
'short' => 'EER',
'long' => 'Energy Efficient Ratio',
'unit' => '',
'unit_long' => '',
],
'fanspeed' => [
'short' => 'Fanspeed',
'long' => 'Fan Speed',
'unit' => 'RPM',
'unit_long' => 'Rotations per Minute',
],
'frequency' => [
'short' => 'Frequency',
'long' => 'Frequency',
'unit' => 'Hz',
'unit_long' => 'Hertz',
],
'humidity' => [
'short' => 'Humidity',
'long' => 'Humidity Percent',
'unit' => '%',
'unit_long' => 'Percent',
],
'load' => [
'short' => 'Load',
'long' => 'Load Percent',
'unit' => '%',
'unit_long' => 'Percent',
],
'power' => [
'short' => 'Power',
'long' => 'Power',
'unit' => 'W',
'unit_long' => 'Watts',
],
'power_consumed' => [
'short' => 'Power Consumed',
'long' => 'Power Consumed',
'unit' => 'kWh',
'unit_long' => 'Killowatt-Hours',
],
'power_factor' => [
'short' => 'Power Factor',
'long' => 'Power Factor',
'unit' => '',
'unit_long' => '',
],
'pressure' => [
'short' => 'Pressure',
'long' => 'Pressure',
'unit' => 'kPa',
'unit_long' => 'Kilopascals',
],
'quality_factor' => [
'short' => 'Quality Factor',
'long' => 'Quality Factor',
'unit' => '',
'unit_long' => '',
],
'runtime' => [
'short' => 'Runtime',
'long' => 'Runtime',
'unit' => 'Min',
'unit_long' => 'Minutes',
],
'signal' => [
'short' => 'Signal',
'long' => 'Signal',
'unit' => 'dBm',
'unit_long' => 'Decibal-Milliwatts',
],
'snr' => [
'short' => 'SNR',
'long' => 'Signal to Noise Ratio',
'unit' => 'dB',
'unit_long' => 'Decibels',
],
'state' => [
'short' => 'State',
'long' => 'State',
'unit' => '',
],
'temperature' => [
'short' => 'Temperature',
'long' => 'Temperature',
'unit' => '°C',
'unit_long' => '° Celsius',
],
'voltage' => [
'short' => 'Voltage',
'long' => 'voltage',
'unit' => 'V',
'unit_long' => 'Volts',
],
'waterflow' => [
'short' => 'Waterflow',
'long' => 'Water Flow',
'unit' => 'l/m',
'unit_long' => 'Liters Per Minute',
],
];

View File

@ -0,0 +1,110 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Wireless Sensors Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used to translate names and units of wireless sensors
|
*/
'ap-count' => [
'short' => 'APs',
'long' => 'AP Count',
'unit' => '',
],
'clients' => [
'short' => 'Clients',
'long' => 'Client Count',
'unit' => '',
],
'capacity' => [
'short' => 'Capacity',
'long' => 'Capacity',
'unit' => '%',
],
'ccq' => [
'short' => 'CCQ',
'long' => 'Client Connection Quality',
'unit' => '%',
],
'errors' => [
'short' => 'Errors',
'long' => 'Error Count',
'unit' => '',
],
'error-ratio' => [
'short' => 'Error Ratio',
'long' => 'Bit/Packet Error Ratio',
'unit' => '%',
],
'error-rate' => [
'short' => 'BER',
'long' => 'Bit Error Rate',
'unit' => 'bps',
],
'frequency' => [
'short' => 'Frequency',
'long' => 'Frequency',
'unit' => 'MHz',
],
'distance' => [
'short' => 'Distance',
'long' => 'Distance',
'unit' => 'km',
],
'mse' => [
'short' => 'MSE',
'long' => 'Mean Square Error',
'unit' => 'dB',
],
'noise-floor' => [
'short' => 'Noise Floor',
'long' => 'Noise Floor',
'unit' => 'dBm/Hz',
],
'power' => [
'short' => 'Power/Signal',
'long' => 'TX/RX Power or Signal',
'unit' => 'dBm',
],
'quality' => [
'short' => 'Quality',
'long' => 'Quality',
'unit' => '%',
],
'rate' => [
'short' => 'Rate',
'long' => 'TX/RX Rate',
'unit' => 'bps',
],
'rssi' => [
'short' => 'RSSI',
'long' => 'Received Signal Strength Indicator',
'unit' => 'dBm',
],
'snr' => [
'short' => 'SNR',
'long' => 'Signal-to-Noise Ratio',
'unit' => 'dB',
],
'ssr' => [
'short' => 'SSR',
'long' => 'Signal Strength Ratio',
'unit' => 'dB',
],
'utilization' => [
'short' => 'Utilization',
'long' => 'utilization',
'unit' => '%',
],
'xpi' => [
'short' => 'XPI',
'long' => 'Cross Polar Interference',
'unit' => 'dB',
],
];

View File

@ -2,7 +2,7 @@
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navHeaderCollapse">
<span class="sr-only">Toggle navigation</span>
<span class="sr-only">@lang('Toggle navigation')</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
@ -20,16 +20,27 @@
<ul class="nav navbar-nav">
{{-- Overview --}}
<li class="dropdown">
<a href="{{ url('overview') }}" class="dropdown-toggle" data-hover="dropdown" data-toggle="dropdown"><i class="fa fa-home fa-fw fa-lg fa-nav-icons hidden-md" aria-hidden="true"></i> <span class="hidden-sm">Overview</span></a>
<a href="{{ url('overview') }}" class="dropdown-toggle" data-hover="dropdown"
data-toggle="dropdown"><i class="fa fa-home fa-fw fa-lg fa-nav-icons hidden-md"
aria-hidden="true"></i> <span
class="hidden-sm">@lang('Overview')</span></a>
<ul class="dropdown-menu multi-level" role="menu">
<li><a href="{{ url('overview') }}"><i class="fa fa-tv fa-fw fa-lg" aria-hidden="true"></i> Dashboard</a></li>
<li><a href="{{ url('overview') }}"><i class="fa fa-tv fa-fw fa-lg"
aria-hidden="true"></i> @lang('Dashboard')</a></li>
<li class="dropdown-submenu">
<a href="{{ url('overview') }}"><i class="fa fa-map fa-fw fa-lg" aria-hidden="true"></i> Maps</a>
<a href="{{ url('overview') }}"><i class="fa fa-map fa-fw fa-lg"
aria-hidden="true"></i> @lang('Maps')</a>
<ul class="dropdown-menu">
<li><a href="{{ url('availability-map') }}"><i class="fa fa-arrow-circle-up fa-fw fa-lg" aria-hidden="true"></i> Availability</a></li>
<li><a href="{{ url('map') }}"><i class="fa fa-sitemap fa-fw fa-lg" aria-hidden="true"></i> Network</a></li>
<li><a href="{{ url('availability-map') }}"><i class="fa fa-arrow-circle-up fa-fw fa-lg"
aria-hidden="true"></i> @lang('Availability')
</a></li>
<li><a href="{{ url('map') }}"><i class="fa fa-sitemap fa-fw fa-lg"
aria-hidden="true"></i> @lang('Network')</a></li>
@if($device_groups->isNotEmpty())
<li class="dropdown-submenu"><a href="#"><i class="fa fa-th fa-fw fa-lg" aria-hidden="true"></i> Device Groups Maps</a><ul class="dropdown-menu scrollable-menu">
<li class="dropdown-submenu"><a href="#"><i class="fa fa-th fa-fw fa-lg"
aria-hidden="true"></i> @lang('Device Groups Maps')
</a>
<ul class="dropdown-menu scrollable-menu">
@foreach($device_groups as $group)
<li><a href="{{ url("map/group=$group->id") }}" title="{{ $group->desc }}"><i class="fa fa-th fa-fw fa-lg" aria-hidden="true"></i>
{{ ucfirst($group->name) }}
@ -37,12 +48,14 @@
@endforeach
</ul></li>
@endif
<li><a href="{{ url('fullscreenmap') }}"><i class="fa fa-expand fa-fw fa-lg" aria-hidden="true"></i> Geographical</a></li>
<li><a href="{{ url('fullscreenmap') }}"><i class="fa fa-expand fa-fw fa-lg"
aria-hidden="true"></i> @lang('Geographical')
</a></li>
</ul>
</li>
@if(auth()->user()->isAdmin() || \LibreNMS\Plugins::count())
<li class="dropdown-submenu">
<a><i class="fa fa-plug fa-fw fa-lg" aria-hidden="true"></i> Plugins</a>
<a><i class="fa fa-plug fa-fw fa-lg" aria-hidden="true"></i> @lang('Plugins')</a>
<ul class="dropdown-menu">
{!! \LibreNMS\Plugins::call('menu') !!}
@admin
@ -50,65 +63,93 @@
<li role="presentation" class="divider"></li>
@endif
<li><a href="{{ url('plugin/view=admin') }}"> <i class="fa fa-lock fa-fw fa-lg"
aria-hidden="true"></i>Plugin Admin</a>
aria-hidden="true"></i>@lang('Plugin Admin')
</a>
</li>
@endadmin
</ul>
</li>
@endif
<li class="dropdown-submenu">
<a href="{{ url('overview') }}"><i class="fa fa-wrench fa-fw fa-lg" aria-hidden="true"></i> Tools</a>
<a href="{{ url('overview') }}"><i class="fa fa-wrench fa-fw fa-lg"
aria-hidden="true"></i> @lang('Tools')</a>
<ul class="dropdown-menu">
<li><a href="{{ url('ripenccapi') }}"><i class="fa fa-star fa-fw fa-lg" aria-hidden="true"></i> RIPE NCC API</a></li>
<li><a href="{{ url('ripenccapi') }}"><i class="fa fa-star fa-fw fa-lg"
aria-hidden="true"></i> @lang('RIPE NCC API')
</a></li>
@config('oxidized.enabled')
<li><a href="{{ url('oxidized') }}"><i class="fa fa-stack-overflow fa-fw fa-lg" aria-hidden="true"></i> Oxidized</a></li>
<li><a href="{{ url('oxidized') }}"><i class="fa fa-stack-overflow fa-fw fa-lg"
aria-hidden="true"></i> @lang('Oxidized')</a>
</li>
@endconfig
</ul>
</li>
<li role="presentation" class="divider"></li>
<li><a href="{{ url('eventlog') }}"><i class="fa fa-bookmark fa-fw fa-lg" aria-hidden="true"></i> Eventlog</a></li>
<li><a href="{{ url('eventlog') }}"><i class="fa fa-bookmark fa-fw fa-lg"
aria-hidden="true"></i> @lang('Eventlog')</a></li>
@config('enable_syslog')
<li><a href="{{ url('syslog') }}"><i class="fa fa-clone fa-fw fa-lg" aria-hidden="true"></i> Syslog</a></li>
<li><a href="{{ url('syslog') }}"><i class="fa fa-clone fa-fw fa-lg"
aria-hidden="true"></i> @lang('Syslog')</a></li>
@endconfig
@config('graylog.server')
<li><a href="{{ url('graylog') }}"><i class="fa fa-clone fa-fw fa-lg" aria-hidden="true"></i> Graylog</a></li>
<li><a href="{{ url('graylog') }}"><i class="fa fa-clone fa-fw fa-lg"
aria-hidden="true"></i> @lang('Graylog')</a></li>
@endconfig
<li><a href="{{ url('inventory') }}"><i class="fa fa-cube fa-fw fa-lg" aria-hidden="true"></i> Inventory</a></li>
<li><a href="{{ url('inventory') }}"><i class="fa fa-cube fa-fw fa-lg"
aria-hidden="true"></i> @lang('Inventory')</a></li>
@if($package_count)
<li><a href="{{ url('search/search=packages') }}"><i class="fa fa-archive fa-fw fa-lg" aria-hidden="true"></i> Packages</a></li>
<li><a href="{{ url('search/search=packages') }}"><i class="fa fa-archive fa-fw fa-lg"
aria-hidden="true"></i> @lang('Packages')
</a></li>
@endif
<li role="presentation" class="divider"></li>
<li><a href="{{ url('search/search=ipv4') }}"><i class="fa fa-search fa-fw fa-lg" aria-hidden="true"></i> IPv4 Address</a></li>
<li><a href="{{ url('search/search=ipv6') }}"><i class="fa fa-search fa-fw fa-lg" aria-hidden="true"></i> IPv6 Address</a></li>
<li><a href="{{ url('search/search=mac') }}"><i class="fa fa-search fa-fw fa-lg" aria-hidden="true"></i> MAC Address</a></li>
<li><a href="{{ url('search/search=arp') }}"><i class="fa fa-search fa-fw fa-lg" aria-hidden="true"></i> ARP Tables</a></li>
<li><a href="{{ url('search/search=fdb') }}"><i class="fa fa-search fa-fw fa-lg" aria-hidden="true"></i> FDB Tables</a></li>
<li><a href="{{ url('search/search=ipv4') }}"><i class="fa fa-search fa-fw fa-lg"
aria-hidden="true"></i> @lang('IPv4 Address')
</a></li>
<li><a href="{{ url('search/search=ipv6') }}"><i class="fa fa-search fa-fw fa-lg"
aria-hidden="true"></i> @lang('IPv6 Address')
</a></li>
<li><a href="{{ url('search/search=mac') }}"><i class="fa fa-search fa-fw fa-lg"
aria-hidden="true"></i> @lang('MAC Address')</a>
</li>
<li><a href="{{ url('search/search=arp') }}"><i class="fa fa-search fa-fw fa-lg"
aria-hidden="true"></i> @lang('ARP Tables')</a>
</li>
<li><a href="{{ url('search/search=fdb') }}"><i class="fa fa-search fa-fw fa-lg"
aria-hidden="true"></i> @lang('FDB Tables')</a>
</li>
@config('poller_modules.mib')
<li role="presentation" class="divider"></li>
<li><a href="{{ url('mibs') }}"><i class="fa fa-file-text-o fa-fw fa-lg" aria-hidden="true"></i> MIB definitions</a></li>
<li><a href="{{ url('mibs') }}"><i class="fa fa-file-text-o fa-fw fa-lg"
aria-hidden="true"></i> @lang('MIB definitions')</a></li>
@endconfig
</ul>
</li>
{{-- Devices --}}
<li class="dropdown">
<a href="{{ url('devices/') }}" class="dropdown-toggle" data-hover="dropdown" data-toggle="dropdown"><i class="fa fa-server fa-fw fa-lg fa-nav-icons hidden-md" aria-hidden="true"></i> <span class="hidden-sm">Devices</span></a>
<a href="{{ url('devices/') }}" class="dropdown-toggle" data-hover="dropdown"
data-toggle="dropdown"><i class="fa fa-server fa-fw fa-lg fa-nav-icons hidden-md"
aria-hidden="true"></i> <span class="hidden-sm">@lang('Devices')</span></a>
<ul class="dropdown-menu">
@if($device_types->isNotEmpty())
<li class="dropdown-submenu">
<a href="{{ url('devices') }}"><i class="fa fa-server fa-fw fa-lg" aria-hidden="true"></i> All Devices</a>
<a href="{{ url('devices') }}"><i class="fa fa-server fa-fw fa-lg"
aria-hidden="true"></i> @lang('All Devices')</a>
<ul class="dropdown-menu scrollable-menu">
@foreach($device_types as $type)
<li><a href="{{ url("devices/type=$type") }}"><i class="fa fa-angle-double-right fa-fw fa-lg" aria-hidden="true"></i> {{ ucfirst($type) }}</a></li>
@endforeach
</ul></li>
@else
<li class="dropdown-submenu"><a href="#">No devices</a></li>
<li class="dropdown-submenu"><a href="#">@lang('No devices')</a></li>
@endif
@if($device_groups->isNotEmpty())
<li class="dropdown-submenu"><a href="#"><i class="fa fa-th fa-fw fa-lg" aria-hidden="true"></i> Device Groups</a>
<li class="dropdown-submenu"><a href="#"><i class="fa fa-th fa-fw fa-lg"
aria-hidden="true"></i> @lang('Device Groups')
</a>
<ul class="dropdown-menu scrollable-menu">
@foreach($device_groups as $group)
<li><a href="{{ url("devices/group=$group->id") }}" title="{{ $group->desc }}"><i class="fa fa-th fa-fw fa-lg" aria-hidden="true"></i> {{ ucfirst($group->name) }}</a></li>
@ -132,21 +173,27 @@
@admin
<li role="presentation" class="divider"></li>
@config('poller_modules.mib')
<li><a href="{{ url('mib_assoc') }}"><i class="fa fa-file-text-o fa-fw fa-lg" aria-hidden="true"></i> MIB associations</a></li>
<li><a href="{{ url('mib_assoc') }}"><i class="fa fa-file-text-o fa-fw fa-lg"
aria-hidden="true"></i> @lang('MIB associations')</a>
</li>
<li role="presentation" class="divider"></li>
@endconfig
@notconfig('navbar.manage_groups.hide')
<li><a href="{{ url('device-groups') }}"><i class="fa fa-th fa-fw fa-lg" aria-hidden="true"></i> Manage Groups</a></li>
<li><a href="{{ url('device-groups') }}"><i class="fa fa-th fa-fw fa-lg"
aria-hidden="true"></i> @lang('Manage Groups')</a>
</li>
@endconfig
<li><a href="{{ url('device-dependencies') }}"><i class="fa fa-group fa-fw fa-lg"></i> Device Dependencies</a></li>
<li><a href="{{ url('device-dependencies') }}"><i class="fa fa-group fa-fw fa-lg"></i> @lang('Device Dependencies')</a></li>
@if($show_vmwinfo)
<li><a href="{{ url('vminfo') }}"><i
class="fa fa-cog fa-fw fa-lg"></i> @lang('Virtual Machines')</a></li>
@endif
<li role="presentation" class="divider"></li>
<li><a href="{{ url('addhost') }}"><i class="fa fa-plus fa-fw fa-lg" aria-hidden="true"></i> Add Device</a></li>
<li><a href="{{ url('delhost') }}"><i class="fa fa-trash fa-fw fa-lg" aria-hidden="true"></i> Delete Device</a></li>
<li><a href="{{ url('addhost') }}"><i class="fa fa-plus fa-fw fa-lg"
aria-hidden="true"></i> @lang('Add Device')</a></li>
<li><a href="{{ url('delhost') }}"><i class="fa fa-trash fa-fw fa-lg"
aria-hidden="true"></i> @lang('Delete Device')</a></li>
@endadmin
</ul>
@ -154,67 +201,101 @@
{{-- Services --}}
@config('show_services')
<li class="dropdown">
<a href="{{ url('services') }}" class="dropdown-toggle" data-hover="dropdown" data-toggle="dropdown"><i class="fa fa-cogs fa-fw fa-lg fa-nav-icons hidden-md" aria-hidden="true"></i> <span class="hidden-sm">Services</span></a>
<a href="{{ url('services') }}" class="dropdown-toggle" data-hover="dropdown"
data-toggle="dropdown"><i class="fa fa-cogs fa-fw fa-lg fa-nav-icons hidden-md"
aria-hidden="true"></i> <span
class="hidden-sm">@lang('Services')</span></a>
<ul class="dropdown-menu">
<li><a href="{{ url('services') }}"><i class="fa fa-cogs fa-fw fa-lg" aria-hidden="true"></i> All Services </a></li>
<li><a href="{{ url('services') }}"><i class="fa fa-cogs fa-fw fa-lg"
aria-hidden="true"></i> @lang('All Services')</a>
</li>
@if($service_counts['warning'] || $service_counts['critical'])
<li role="presentation" class="divider"></li>
@if($service_counts['warning'])
<li><a href="{{ url('services/state=warning') }}"><i class="fa fa-bell fa-col-warning fa-fw fa-lg" aria-hidden="true"></i> Warning ({{ $service_counts['warning'] }})</a></li>
<li><a href="{{ url('services/state=warning') }}"><i
class="fa fa-bell fa-col-warning fa-fw fa-lg"
aria-hidden="true"></i> @lang('Warning :service_count', ['service_count' => $service_counts['warning']])
</a></li>
@endif
@if($service_counts['critical'])
<li><a href="{{ url('services/state=critical') }}"><i class="fa fa-bell fa-col-danger fa-fw fa-lg" aria-hidden="true"></i> Critical ({{ $service_counts['critical'] }})</a></li>
<li><a href="{{ url('services/state=critical') }}"><i
class="fa fa-bell fa-col-danger fa-fw fa-lg"
aria-hidden="true"></i> @lang('Critical :service_count', ['service_count' => $service_counts['critical']])
</a></li>
@endif
@endif
@admin
<li role="presentation" class="divider"></li>
<li><a href="{{ url('addsrv') }}"><i class="fa fa-plus fa-fw fa-lg" aria-hidden="true"></i> Add Service</a></li>
<li><a href="{{ url('addsrv') }}"><i class="fa fa-plus fa-fw fa-lg"
aria-hidden="true"></i> @lang('Add Service')</a></li>
@endadmin
</ul>
</li>
@endconfig
{{-- Ports --}}
<li class="dropdown">
<a href="{{ url('ports') }}" class="dropdown-toggle" data-hover="dropdown" data-toggle="dropdown"><i class="fa fa-link fa-fw fa-lg fa-nav-icons hidden-md" aria-hidden="true"></i> <span class="hidden-sm">Ports</span></a>
<a href="{{ url('ports') }}" class="dropdown-toggle" data-hover="dropdown" data-toggle="dropdown"><i
class="fa fa-link fa-fw fa-lg fa-nav-icons hidden-md" aria-hidden="true"></i> <span
class="hidden-sm">@lang('Ports')</span></a>
<ul class="dropdown-menu">
<li><a href="{{ url('ports') }}"><i class="fa fa-link fa-fw fa-lg" aria-hidden="true"></i> All Ports</a></li>
<li><a href="{{ url('ports') }}"><i class="fa fa-link fa-fw fa-lg"
aria-hidden="true"></i> @lang('All Ports')</a></li>
@if($port_counts['errored'] > 0)
<li><a href="{{ url('ports/errors=yes') }}"><i class="fa fa-exclamation-circle fa-fw fa-lg" aria-hidden="true"></i> Errored ({{ $port_counts['errored'] }})</a></li>
<li><a href="{{ url('ports/errors=yes') }}"><i class="fa fa-exclamation-circle fa-fw fa-lg"
aria-hidden="true"></i> @lang('Errored :port_count', ['port_count' => $port_counts['errored']])
</a></li>
@endif
@if($port_counts['ignored'] > 0)
<li><a href="{{ url('ports/ignore=yes') }}"><i class="fa fa-question-circle fa-fw fa-lg" aria-hidden="true"></i> Ignored ({{ $port_counts['ignored'] }})</a></li>
<li><a href="{{ url('ports/ignore=yes') }}"><i class="fa fa-question-circle fa-fw fa-lg"
aria-hidden="true"></i> @lang('Ignored :port_count', ['port_count' => $port_counts['ignored']])
</a></li>
@endif
@config('enable_billing')
<li><a href="{{ url('bills') }}"><i class="fa fa-money fa-fw fa-lg" aria-hidden="true"></i> Traffic Bills</a></li>
<li><a href="{{ url('bills') }}"><i class="fa fa-money fa-fw fa-lg"
aria-hidden="true"></i> @lang('Traffic Bills')</a></li>
@endconfig
@if($port_counts['pseudowire'] > 0)
<li><a href="{{ url('pseudowires') }}"><i class="fa fa-arrows-alt fa-fw fa-lg" aria-hidden="true"></i> Pseudowires</a></li>
<li><a href="{{ url('pseudowires') }}"><i class="fa fa-arrows-alt fa-fw fa-lg"
aria-hidden="true"></i> @lang('Pseudowires')</a>
</li>
@endif
@if(auth()->user()->hasGlobalRead())
@if($port_groups_exist)
<li role="presentation" class="divider"></li>
@config('int_customers')
<li><a href="{{ url('customers') }}"><i class="fa fa-users fa-fw fa-lg" aria-hidden="true"></i> Customers</a></li>
<li><a href="{{ url('customers') }}"><i class="fa fa-users fa-fw fa-lg"
aria-hidden="true"></i> @lang('Customers')</a>
</li>
@endconfig
@config('int_l2tp')
<li><a href="{{ url('iftype/type=l2tp') }}"><i class="fa fa-link fa-fw fa-lg" aria-hidden="true"></i> L2TP</a></li>
<li><a href="{{ url('iftype/type=l2tp') }}"><i class="fa fa-link fa-fw fa-lg"
aria-hidden="true"></i> @lang('L2TP')</a>
</li>
@endconfig
@config('int_transit')
<li><a href="{{ url('iftype/type=transit') }}"><i class="fa fa-truck fa-fw fa-lg" aria-hidden="true"></i> Transit</a></li>
<li><a href="{{ url('iftype/type=transit') }}"><i class="fa fa-truck fa-fw fa-lg"
aria-hidden="true"></i> @lang('Transit')
</a></li>
@endconfig
@config('int_peering')
<li><a href="{{ url('iftype/type=peering') }}"><i class="fa fa-handshake-o fa-fw fa-lg" aria-hidden="true"></i> Peering</a></li>
<li><a href="{{ url('iftype/type=peering') }}"><i class="fa fa-handshake-o fa-fw fa-lg"
aria-hidden="true"></i> @lang('Peering')
</a></li>
@endconfig
@if(\LibreNMS\Config::get('int_peering') && \LibreNMS\Config::get('int_transit'))
<li><a href="{{ url('iftype/type=peering,transit') }}"><i class="fa fa-rocket fa-fw fa-lg" aria-hidden="true"></i> Peering + Transit</a></li>
<li><a href="{{ url('iftype/type=peering,transit') }}"><i
class="fa fa-rocket fa-fw fa-lg"
aria-hidden="true"></i> @lang('Peering + Transit')</a></li>
@endif
@config('int_core')
<li><a href="{{ url('iftype/type=core') }}"><i class="fa fa-code-fork fa-fw fa-lg" aria-hidden="true"></i> Core</a></li>
<li><a href="{{ url('iftype/type=core') }}"><i class="fa fa-code-fork fa-fw fa-lg"
aria-hidden="true"></i> @lang('Core')</a>
</li>
@endconfig
@foreach($custom_port_descr as $custom_descr)
<li><a href="{{ url('iftype/type=' . urlencode($custom_descr)) }}"><i class="fa fa-connectdevelop fa-fw fa-lg" aria-hidden="true"></i> {{ ucwords($custom_descr) }}</a></li>
@ -224,25 +305,43 @@
<li role="presentation" class="divider"></li>
@if($port_counts['alerted'])
<li><a href="{{ url('ports/alerted=yes') }}"><i class="fa fa-exclamation-circle fa-fw fa-lg" aria-hidden="true"></i> Alerts ({{ $port_counts['alerted'] }})</a></li>
<li><a href="{{ url('ports/alerted=yes') }}"><i
class="fa fa-exclamation-circle fa-fw fa-lg"
aria-hidden="true"></i> @lang('Alerts :port_count', ['port_count' => $port_counts['alerted']])
</a></li>
@endif
<li><a href="{{ url('ports/state=down') }}"><i class="fa fa-arrow-circle-down fa-fw fa-lg" aria-hidden="true"></i> Down ({{ $port_counts['down'] }})</a></li>
<li><a href="{{ url('ports/state=admindown') }}"><i class="fa fa-arrow-circle-o-down fa-fw fa-lg" aria-hidden="true"></i> Disabled ({{ $port_counts['shutdown'] }})</a></li>
<li><a href="{{ url('ports/state=down') }}"><i class="fa fa-arrow-circle-down fa-fw fa-lg"
aria-hidden="true"></i> @lang('Down :port_count', ['port_count' => $port_counts['down']])
</a></li>
<li><a href="{{ url('ports/state=admindown') }}"><i
class="fa fa-arrow-circle-o-down fa-fw fa-lg"
aria-hidden="true"></i> @lang('Disabled :port_count', ['port_count' => $port_counts['shutdown']])
</a></li>
@if($port_counts['deleted'])
<li><a href="{{ url('ports/deleted=yes') }}"><i class="fa fa-minus-circle fa-fw fa-lg" aria-hidden="true"></i> Deleted ({{ $port_counts['deleted'] }})</a></li>
<li><a href="{{ url('ports/deleted=yes') }}"><i class="fa fa-minus-circle fa-fw fa-lg"
aria-hidden="true"></i> @lang('Deleted :port_count', ['port_count' => $port_counts['deleted']])
</a></li>
@endif
@endif
</ul>
</li>
{{-- Sensors --}}
<li class="dropdown">
<a href="{{ url('health') }}" class="dropdown-toggle" data-hover="dropdown" data-toggle="dropdown"><i class="fa fa-heartbeat fa-fw fa-lg fa-nav-icons hidden-md" aria-hidden="true"></i> <span class="hidden-sm">Health</span></a>
<a href="{{ url('health') }}" class="dropdown-toggle" data-hover="dropdown"
data-toggle="dropdown"><i class="fa fa-heartbeat fa-fw fa-lg fa-nav-icons hidden-md"
aria-hidden="true"></i> <span class="hidden-sm">@lang('Health')</span></a>
<ul class="dropdown-menu">
<li><a href="{{ url('health/metric=mempool') }}"><i class="fa fa-braille fa-fw fa-lg" aria-hidden="true"></i> Memory</a></li>
<li><a href="{{ url('health/metric=processor') }}"><i class="fa fa-microchip fa-fw fa-lg" aria-hidden="true"></i> Processor</a></li>
<li><a href="{{ url('health/metric=storage') }}"><i class="fa fa-database fa-fw fa-lg" aria-hidden="true"></i> Storage</a></li>
<li><a href="{{ url('health/metric=mempool') }}"><i class="fa fa-braille fa-fw fa-lg"
aria-hidden="true"></i> @lang('Memory')</a>
</li>
<li><a href="{{ url('health/metric=processor') }}"><i class="fa fa-microchip fa-fw fa-lg"
aria-hidden="true"></i> @lang('Processor')
</a></li>
<li><a href="{{ url('health/metric=storage') }}"><i class="fa fa-database fa-fw fa-lg"
aria-hidden="true"></i> @lang('Storage')</a>
</li>
@foreach($sensor_menu as $sensor_menu_group)
@foreach($sensor_menu_group as $sensor_menu_entry)
@ -258,7 +357,10 @@
{{-- Wireless --}}
@if($wireless_menu->isNotEmpty())
<li class="dropdown">
<a href="{{ url('wireless') }}" class="dropdown-toggle" data-hover="dropdown" data-toggle="dropdown"><i class="fa fa-wifi fa-fw fa-lg fa-nav-icons hidden-md" aria-hidden="true"></i> <span class="hidden-sm">Wireless</span></a>
<a href="{{ url('wireless') }}" class="dropdown-toggle" data-hover="dropdown"
data-toggle="dropdown"><i class="fa fa-wifi fa-fw fa-lg fa-nav-icons hidden-md"
aria-hidden="true"></i> <span
class="hidden-sm">@lang('Wireless')</span></a>
<ul class="dropdown-menu">
@foreach($wireless_menu as $wireless_menu_entry)
<li><a href="{{ url('wireless/metric=' . $wireless_menu_entry->sensor_class) }}"><i class="fa fa-{{ $wireless_menu_entry->icon() }} fa-fw fa-lg" aria-hidden="true"></i> {{ $wireless_menu_entry->classDescr() }}</a></li>
@ -269,9 +371,13 @@
{{-- App --}}
@if($app_menu->isNotEmpty())
<li class="dropdown">
<a href="{{ url('apps') }}" class="dropdown-toggle" data-hover="dropdown" data-toggle="dropdown"><i class="fa fa-tasks fa-fw fa-lg fa-nav-icons hidden-md" aria-hidden="true"></i> <span class="hidden-sm">Apps</span></a>
<a href="{{ url('apps') }}" class="dropdown-toggle" data-hover="dropdown"
data-toggle="dropdown"><i class="fa fa-tasks fa-fw fa-lg fa-nav-icons hidden-md"
aria-hidden="true"></i> <span
class="hidden-sm">@lang('Apps')</span></a>
<ul class="dropdown-menu">
<li><a href="{{ url('apps') }}"><i class="fa fa-object-group fa-fw fa-lg" aria-hidden="true"></i> Overview</a></li>
<li><a href="{{ url('apps') }}"><i class="fa fa-object-group fa-fw fa-lg"
aria-hidden="true"></i> @lang('Overview')</a></li>
@foreach($app_menu as $app_type => $app_instances)
@if($app_instances->filter->app_instance->isNotEmpty())
<li class="dropdown-submenu">
@ -292,7 +398,10 @@
{{-- Routing --}}
@if($routing_menu)
<li class="dropdown">
<a href="{{ url('routing') }}" class="dropdown-toggle" data-hover="dropdown" data-toggle="dropdown"><i class="fa fa-random fa-fw fa-lg fa-nav-icons hidden-md" aria-hidden="true"></i> <span class="hidden-sm">Routing</span></a>
<a href="{{ url('routing') }}" class="dropdown-toggle" data-hover="dropdown"
data-toggle="dropdown"><i class="fa fa-random fa-fw fa-lg fa-nav-icons hidden-md"
aria-hidden="true"></i> <span
class="hidden-sm">@lang('Routing')</span></a>
<ul class="dropdown-menu">
@foreach($routing_menu as $routing_menu_group)
@if(!$loop->first)
@ -305,12 +414,17 @@
@if($bgp_alerts)
<li role="presentation" class="divider"></li>
<li><a href="{{ url('routing/protocol=bgp/adminstatus=start/state=down') }}"><i class="fa fa-exclamation-circle fa-fw fa-lg" aria-hidden="true"></i> Alerted BGP ({{ $bgp_alerts }})</a></li>
<li><a href="{{ url('routing/protocol=bgp/adminstatus=start/state=down') }}"><i
class="fa fa-exclamation-circle fa-fw fa-lg"
aria-hidden="true"></i> @lang('Alerted BGP :alert_count', ['alert_count' => $bgp_alerts])
</a></li>
@endif
@admin
@if($show_peeringdb)
<li role="presentation" class="divider"></li>
<li><a href="{{ url('peering') }}"><i class="fa fa-hand-o-right fa-fw fa-lg" aria-hidden="true"></i> PeeringDB</a></li>
<li><a href="{{ url('peering') }}"><i class="fa fa-hand-o-right fa-fw fa-lg"
aria-hidden="true"></i> @lang('PeeringDB')</a>
</li>
@endif
@endadmin
</ul>
@ -318,17 +432,29 @@
@endif
{{-- Alerts --}}
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-hover="dropdown" data-toggle="dropdown"><i class="fa fa-exclamation-circle fa-col-{{ $alert_menu_class }} fa-fw fa-lg fa-nav-icons hidden-md" aria-hidden="true"></i> <span class="hidden-sm">Alerts</span></a>
<a href="#" class="dropdown-toggle" data-hover="dropdown" data-toggle="dropdown"><i
class="fa fa-exclamation-circle fa-col-{{ $alert_menu_class }} fa-fw fa-lg fa-nav-icons hidden-md"
aria-hidden="true"></i> <span class="hidden-sm">@lang('Alerts')</span></a>
<ul class="dropdown-menu">
<li><a href="{{ url('alerts') }}"><i class="fa fa-bell fa-fw fa-lg" aria-hidden="true"></i> Notifications</a></li>
<li><a href="{{ url('alert-log') }}"><i class="fa fa-file-text fa-fw fa-lg" aria-hidden="true"></i> Alert History</a></li>
<li><a href="{{ url('alert-stats') }}"><i class="fa fa-bar-chart fa-fw fa-lg" aria-hidden="true"></i> Statistics</a></li>
<li><a href="{{ url('alerts') }}"><i class="fa fa-bell fa-fw fa-lg"
aria-hidden="true"></i> @lang('Notifications')</a></li>
<li><a href="{{ url('alert-log') }}"><i class="fa fa-file-text fa-fw fa-lg"
aria-hidden="true"></i> @lang('Alert History')</a></li>
<li><a href="{{ url('alert-stats') }}"><i class="fa fa-bar-chart fa-fw fa-lg"
aria-hidden="true"></i> @lang('Statistics')</a></li>
@admin
<li role="presentation" class="divider"></li>
<li><a href="{{ url('alert-rules') }}"><i class="fa fa-list fa-fw fa-lg" aria-hidden="true"></i> Alert Rules</a></li>
<li><a href="{{ url('alert-schedule') }}"><i class="fa fa-calendar fa-fw fa-lg" aria-hidden="true"></i> Scheduled Maintenance</a></li>
<li><a href="{{ url('templates') }}"><i class="fa fa-file fa-fw fa-lg" aria-hidden="true"></i> Alert Templates</a></li>
<li><a href="{{ url('alert-transports') }}"><i class="fa fa-bus fa-fw fa-lg" aria-hidden="true"></i> Alert Transports</a></li>
<li><a href="{{ url('alert-rules') }}"><i class="fa fa-list fa-fw fa-lg"
aria-hidden="true"></i> @lang('Alert Rules')</a></li>
<li><a href="{{ url('alert-schedule') }}"><i class="fa fa-calendar fa-fw fa-lg"
aria-hidden="true"></i> @lang('Scheduled Maintenance')
</a></li>
<li><a href="{{ url('templates') }}"><i class="fa fa-file fa-fw fa-lg"
aria-hidden="true"></i> @lang('Alert Templates')</a>
</li>
<li><a href="{{ url('alert-transports') }}"><i class="fa fa-bus fa-fw fa-lg"
aria-hidden="true"></i> @lang('Alert Transports')
</a></li>
@endadmin
</ul>
</li>
@ -345,10 +471,14 @@
<ul class="nav navbar-nav navbar-right">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-hover="dropdown" data-toggle="dropdown"><i class="fa fa-user fa-fw fa-lg fa-nav-icons" aria-hidden="true"></i>
<span class="visible-xs-inline-block">User</span><span class="badge badge-navbar-user count-notif {{ $notification_count ? 'badge-danger' : 'badge-default' }}">{{ $notification_count }}</span></a>
<span class="visible-xs-inline-block">@lang('User')</span><span
class="badge badge-navbar-user count-notif {{ $notification_count ? 'badge-danger' : 'badge-default' }}">{{ $notification_count }}</span></a>
<ul class="dropdown-menu">
<li><a href="{{ url('preferences') }}"><i class="fa fa-cog fa-fw fa-lg" aria-hidden="true"></i> My Settings</a></li>
<li><a href="{{ url('notifications') }}"><span class="badge count-notif">{{ $notification_count }}</span> Notifications</a></li>
<li><a href="{{ url('preferences') }}"><i class="fa fa-cog fa-fw fa-lg"
aria-hidden="true"></i> @lang('My Settings')</a></li>
<li><a href="{{ url('notifications') }}"><span
class="badge count-notif">{{ $notification_count }}</span> @lang('Notifications')
</a></li>
<li role="presentation" class="divider"></li>
<li>
<a href="{{ route('logout') }}" onclick="event.preventDefault(); document.getElementById('logout-form').submit();">
@ -362,14 +492,21 @@
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-hover="dropdown" data-toggle="dropdown" style="margin-left:5px"><i class="fa fa-cog fa-fw fa-lg fa-nav-icons" aria-hidden="true"></i> <span class="visible-xs-inline-block">Settings</span></a>
<a href="#" class="dropdown-toggle" data-hover="dropdown" data-toggle="dropdown"
style="margin-left:5px"><i class="fa fa-cog fa-fw fa-lg fa-nav-icons" aria-hidden="true"></i>
<span class="visible-xs-inline-block">@lang('Settings')</span></a>
<ul class="dropdown-menu">
@admin
<li><a href="{{ url('settings') }}"><i class="fa fa-cogs fa-fw fa-lg" aria-hidden="true"></i> Global Settings</a></li>
<li><a href="{{ url('validate') }}"><i class="fa fa-check-circle fa-fw fa-lg" aria-hidden="true"></i> Validate Config</a></li>
<li><a href="{{ url('settings') }}"><i class="fa fa-cogs fa-fw fa-lg"
aria-hidden="true"></i> @lang('Global Settings')</a></li>
<li><a href="{{ url('validate') }}"><i class="fa fa-check-circle fa-fw fa-lg"
aria-hidden="true"></i> @lang('Validate Config')</a></li>
<li role="presentation" class="divider"></li>
<li><a href="{{ route('users.index') }}"><i class="fa fa-user-circle-o fa-fw fa-lg" aria-hidden="true"></i> Manage Users</a></li>
<li><a href="{{ url('authlog') }}"><i class="fa fa-shield fa-fw fa-lg" aria-hidden="true"></i> Auth History</a></li>
<li><a href="{{ route('users.index') }}"><i class="fa fa-user-circle-o fa-fw fa-lg"
aria-hidden="true"></i> @lang('Manage Users')</a>
</li>
<li><a href="{{ url('authlog') }}"><i class="fa fa-shield fa-fw fa-lg"
aria-hidden="true"></i> @lang('Auth History')</a></li>
<li role="presentation" class="divider"></li>
<li class="dropdown-submenu">
<a href="{{ url('pollers') }}"><i class="fa fa-th-large fa-fw fa-lg" aria-hidden="true"></i> @lang('Pollers')</a>
@ -384,10 +521,14 @@
</li>
<li role="presentation" class="divider"></li>
<li class="dropdown-submenu">
<a href="#"><i class="fa fa-code fa-fw fa-lg" aria-hidden="true"></i> API</a>
<a href="#"><i class="fa fa-code fa-fw fa-lg" aria-hidden="true"></i> @lang('API')</a>
<ul class="dropdown-menu">
<li><a href="{{ url('api-access') }}"><i class="fa fa-cog fa-fw fa-lg" aria-hidden="true"></i> API Settings</a></li>
<li><a href="https://docs.librenms.org/API/" target="_blank" rel="noopener"><i class="fa fa-book fa-fw fa-lg" aria-hidden="true"></i> API Docs</a></li>
<li><a href="{{ url('api-access') }}"><i class="fa fa-cog fa-fw fa-lg"
aria-hidden="true"></i> @lang('API Settings')
</a></li>
<li><a href="https://docs.librenms.org/API/" target="_blank" rel="noopener"><i
class="fa fa-book fa-fw fa-lg" aria-hidden="true"></i> @lang('API Docs')</a>
</li>
</ul>
</li>
<li role="presentation" class="divider"></li>
@ -401,7 +542,9 @@
</li>
<li role="presentation" class="divider"></li>
@endif
<li><a href="{{ url('about') }}"><i class="fa fa-info-circle fa-fw fa-lg" aria-hidden="true"></i> About&nbsp;{{ \LibreNMS\Config::get('project_name') }}</a></li>
<li><a href="{{ url('about') }}"><i class="fa fa-info-circle fa-fw fa-lg"
aria-hidden="true"></i> @lang('About :project_name', ['project_name' => \LibreNMS\Config::get('project_name')])
</a></li>
</ul>
</li>
</ul>