diff --git a/CHANGELOG.md b/CHANGELOG.md
index 889ab507..b38d942b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,15 @@
# Release Notes
+## v1.1.2 (2018-02-05)
+
+### Added
+- Translation support
+- Supported applications
+
+### Changed
+- Icon used to put tiles into config mode
+
+
## v1.1.0 (2018-02-05)
### Added
diff --git a/app/Http/Controllers/ItemController.php b/app/Http/Controllers/ItemController.php
index fe8dc8c7..5cd2d5d1 100644
--- a/app/Http/Controllers/ItemController.php
+++ b/app/Http/Controllers/ItemController.php
@@ -151,7 +151,7 @@ class ItemController extends Controller
Item::create($request->all());
return redirect()->route('dash')
- ->with('success','Item created successfully');
+ ->with('success', __('alert.success.item_created'));
}
/**
@@ -206,7 +206,7 @@ class ItemController extends Controller
Item::find($id)->update($request->all());
return redirect()->route('dash')
- ->with('success','Item updated successfully');
+ ->with('success',__('alert.success.item_updated'));
}
/**
@@ -228,7 +228,7 @@ class ItemController extends Controller
}
return redirect()->route('items.index')
- ->with('success','Item deleted successfully');
+ ->with('success',__('alert.success.item_deleted'));
}
/**
@@ -244,7 +244,7 @@ class ItemController extends Controller
->where('id', $id)
->restore();
return redirect()->route('items.index')
- ->with('success','Item restored successfully');
+ ->with('success',__('alert.success.item_restored'));
}
/**
diff --git a/app/Http/Controllers/SettingsController.php b/app/Http/Controllers/SettingsController.php
index 7fa0e21b..3da34556 100644
--- a/app/Http/Controllers/SettingsController.php
+++ b/app/Http/Controllers/SettingsController.php
@@ -40,7 +40,7 @@ class SettingsController extends Controller
]);
} else {
return redirect()->route('settings.list')->with([
- 'error' => 'This Setting does not exist.',
+ 'error' => __('app.alert.error.not_exist'),
]);
}
}
@@ -74,11 +74,11 @@ class SettingsController extends Controller
$setting->save();
return redirect()->route('settings.index')->with([
- 'success' => 'You have successfully edited this Setting!',
+ 'success' => __('app.alert.success.setting_updated'),
]);
} else {
return redirect()->route('settings.index')->with([
- 'error' => 'This Setting does not exist.',
+ 'error' => __('app.alert.error.not_exist'),
]);
}
}
@@ -95,7 +95,7 @@ class SettingsController extends Controller
$setting->save();
}
return redirect()->route('settings.index')->with([
- 'success' => 'You have successfully edited this Setting!',
+ 'success' => __('app.alert.success.setting_updated'),
]);
}
diff --git a/app/Item.php b/app/Item.php
index 01033269..3c306363 100644
--- a/app/Item.php
+++ b/app/Item.php
@@ -26,8 +26,14 @@ class Item extends Model
public static function supportedList()
{
return [
+ 'Duplicati' => \App\SupportedApps\Duplicati::class,
+ 'Emby' => \App\SupportedApps\Emby::class,
'NZBGet' => \App\SupportedApps\Nzbget::class,
+ 'pFsense' => \App\SupportedApps\Pfsense::class,
+ 'Pihole' => \App\SupportedApps\Pihole::class,
'Plex' => \App\SupportedApps\Plex::class,
+ 'UniFi' => \App\SupportedApps\Unifi::class,
+ 'Portainer' => \App\SupportedApps\Portainer::class,
];
}
public static function supportedOptions()
diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php
index 254fdf24..502b28f3 100644
--- a/app/Providers/AppServiceProvider.php
+++ b/app/Providers/AppServiceProvider.php
@@ -18,16 +18,20 @@ class AppServiceProvider extends ServiceProvider
{
$alt_bg = '';
- if(!is_file(database_path(env('DB_DATABASE')))) {
+ if(!is_file(base_path('.env'))) {
+ touch(base_path('.env'));
+ Artisan::call('key:generate');
+ }
+ if(!is_file(database_path('app.sqlite'))) {
// first time setup
- touch(database_path(env('DB_DATABASE')));
+ touch(database_path('app.sqlite'));
Artisan::call('migrate', array('--path' => 'database/migrations', '--force' => true, '--seed' => true));
Artisan::call('storage:link');
//Cache
//Artisan::call('config:cache');
//Artisan::call('route:cache');
}
- if(is_file(database_path(env('DB_DATABASE')))) {
+ if(is_file(database_path('app.sqlite'))) {
if(Schema::hasTable('settings')) {
if($bg_image = Setting::fetch('background_image')) {
$alt_bg = ' style="background-image: url('.asset('storage/'.$bg_image).')"';
@@ -42,6 +46,9 @@ class AppServiceProvider extends ServiceProvider
} else {
Artisan::call('migrate', array('--path' => 'database/migrations', '--force' => true, '--seed' => true));
}
+ $lang = Setting::fetch('language');
+ \App::setLocale($lang);
+
}
view()->share('alt_bg', $alt_bg);
diff --git a/app/Setting.php b/app/Setting.php
index d734f6ef..8eae80dd 100644
--- a/app/Setting.php
+++ b/app/Setting.php
@@ -15,6 +15,10 @@ class Setting extends Model
*/
protected $table = 'settings';
+ protected $fillable = [
+ 'id', 'group_id', 'key', 'type', 'options', 'label', 'value', 'order', 'system'
+ ];
+
/**
* Tell the Model this Table doesn't support timestamps.
*
@@ -45,28 +49,28 @@ class Setting extends Model
switch($this->type) {
case 'image':
if(!empty($this->value)) {
- $value = 'View';
+ $value = ''.__('app.settings.view').'';
} else {
- $value = '- not set -';
+ $value = __('app.options.none');
}
break;
case 'boolean':
if((bool)$this->value === true) {
- $value = 'Yes';
+ $value = __('app.options.yes');
} else {
- $value = 'No';
+ $value = __('app.options.no');
}
break;
case 'select':
if(!empty($this->value) && $this->value !== 'none') {
$options = (array)json_decode($this->options);
- $value = $options[$this->value];
+ $value = __($options[$this->value]);
} else {
- $value = '- not set -';
+ $value = __('app.options.none');
}
break;
default:
- $value = $this->value;
+ $value = __($this->value);
break;
}
@@ -80,11 +84,11 @@ class Setting extends Model
case 'image':
$value = '';
if(isset($this->value) && !empty($this->value)) {
- $value .= '
';
+ $value .= '
';
}
$value .= Form::file('value', ['class' => 'form-control']);
if(isset($this->value) && !empty($this->value)) {
- $value .= 'Reset back to default';
+ $value .= ''.__('app.settings.reset').'';
}
break;
@@ -102,6 +106,9 @@ class Setting extends Model
break;
case 'select':
$options = json_decode($this->options);
+ foreach($options as $key => $opt) {
+ $options->$key = __($opt);
+ }
$value = Form::select('value', $options, null, ['class' => 'form-control']);
break;
default:
@@ -199,8 +206,8 @@ class Setting extends Model
$output .= '
';
diff --git a/app/SupportedApps/Duplicati.php b/app/SupportedApps/Duplicati.php
new file mode 100644
index 00000000..34de49e1
--- /dev/null
+++ b/app/SupportedApps/Duplicati.php
@@ -0,0 +1,16 @@
+ env('APP_KEY'),
+ 'key' => env('APP_KEY', 'base64:I206O8ibx+GQyRE7BeOxDobn04Mfmyyc5Ptzns/C0mY='),
'cipher' => 'AES-256-CBC',
diff --git a/config/database.php b/config/database.php
index f2f0ab1d..8f7573f6 100644
--- a/config/database.php
+++ b/config/database.php
@@ -13,7 +13,7 @@ return [
|
*/
- 'default' => env('DB_CONNECTION', 'mysql'),
+ 'default' => env('DB_CONNECTION', 'sqlite'),
/*
|--------------------------------------------------------------------------
@@ -36,7 +36,7 @@ return [
'sqlite' => [
'driver' => 'sqlite',
//'database' => env('DB_DATABASE', database_path('database.sqlite')),
- 'database' => database_path(env('DB_DATABASE')),
+ 'database' => database_path(env('DB_DATABASE', 'app.sqlite')),
'prefix' => '',
],
diff --git a/database/seeds/SettingsSeeder.php b/database/seeds/SettingsSeeder.php
index d6ad7157..850fe8a4 100644
--- a/database/seeds/SettingsSeeder.php
+++ b/database/seeds/SettingsSeeder.php
@@ -14,29 +14,39 @@ class SettingsSeeder extends Seeder
public function run()
{
// Groups
- if(!SettingGroup::find(1)) {
+ if(!$setting_group = SettingGroup::find(1)) {
$setting_group = new SettingGroup;
$setting_group->id = 1;
- $setting_group->title = 'System';
+ $setting_group->title = 'app.settings.system';
$setting_group->order = 0;
$setting_group->save();
+ } else {
+ $setting_group->title = 'app.settings.system';
+ $setting_group->save();
}
- if(!SettingGroup::find(2)) {
+ if(!$setting_group = SettingGroup::find(2)) {
$setting_group = new SettingGroup;
$setting_group->id = 2;
- $setting_group->title = 'Appearance';
+ $setting_group->title = 'app.settings.appearance';
$setting_group->order = 1;
$setting_group->save();
+ } else {
+ $setting_group->title = 'app.settings.appearance';
+ $setting_group->save();
}
- if(!SettingGroup::find(3)) {
+ if(!$setting_group = SettingGroup::find(3)) {
$setting_group = new SettingGroup;
$setting_group->id = 3;
- $setting_group->title = 'Miscellaneous';
+ $setting_group->title = 'app.settings.miscellaneous';
$setting_group->order = 2;
$setting_group->save();
+ } else {
+ $setting_group->title = 'app.settings.miscellaneous';
+ $setting_group->save();
}
if($version = Setting::find(1)) {
+ $version->label = 'app.settings.version';
$version->value = config('app.version');
$version->save();
} else {
@@ -45,37 +55,45 @@ class SettingsSeeder extends Seeder
$setting->group_id = 1;
$setting->key = 'version';
$setting->type = 'text';
- $setting->label = 'Version';
+ $setting->label = 'app.settings.version';
$setting->value = config('app.version');
$setting->system = true;
$setting->save();
}
- if(!Setting::find(2)) {
+ if(!$setting = Setting::find(2)) {
$setting = new Setting;
$setting->id = 2;
$setting->group_id = 2;
$setting->key = 'background_image';
$setting->type = 'image';
- $setting->label = 'Background Image';
+ $setting->label = 'app.settings.background_image';
+ $setting->save();
+ } else {
+ $setting->label = 'app.settings.background_image';
$setting->save();
}
- if(!Setting::find(3)) {
+ if(!$setting = Setting::find(3)) {
$setting = new Setting;
$setting->id = 3;
$setting->group_id = 3;
$setting->key = 'homepage_search';
$setting->type = 'boolean';
- $setting->label = 'Homepage Search';
+ $setting->label = 'app.settings.homepage_search';
+ $setting->save();
+ } else {
+ $setting->label = 'app.settings.homepage_search';
$setting->save();
}
- if(!Setting::find(4)) {
- $options = json_encode([
- 'none' => '- not set -',
- 'google' => 'Google',
- 'ddg' => 'DuckDuckGo',
- 'bing' => 'Bing'
- ]);
+
+ $options = json_encode([
+ 'none' => 'app.options.none',
+ 'google' => 'app.options.google',
+ 'ddg' => 'app.options.ddg',
+ 'bing' => 'app.options.bing'
+ ]);
+
+ if(!$setting = Setting::find(4)) {
$setting = new Setting;
$setting->id = 4;
@@ -83,9 +101,38 @@ class SettingsSeeder extends Seeder
$setting->key = 'search_provider';
$setting->type = 'select';
$setting->options = $options;
- $setting->label = 'Search Provider';
+ $setting->label = 'app.settings.search_provider';
+ $setting->save();
+ } else {
+ $setting->options = $options;
+ $setting->label = 'app.settings.search_provider';
+ $setting->save();
+ }
+
+
+ $language_options = json_encode([
+ 'de' => 'Deutsch (German)',
+ 'en' => 'English',
+ 'fi' => 'Suomi (Finnish)',
+ 'fr' => 'Français (French)',
+ 'sv' => 'Svenska (Swedish)',
+ 'es' => 'Español (Spanish)',
+ ]);
+ if($languages = Setting::find(5)) {
+ $languages->options = $language_options;
+ $languages->save();
+ } else {
+ $setting = new Setting;
+ $setting->id = 5;
+ $setting->group_id = 1;
+ $setting->key = 'language';
+ $setting->type = 'select';
+ $setting->label = 'app.settings.language';
+ $setting->options = $language_options;
+ $setting->value = 'en';
$setting->save();
}
+
}
}
diff --git a/resources/lang/de/app.php b/resources/lang/de/app.php
new file mode 100644
index 00000000..adaeb1e4
--- /dev/null
+++ b/resources/lang/de/app.php
@@ -0,0 +1,58 @@
+ 'System',
+ 'settings.appearance' => 'Aussehen',
+ 'settings.miscellaneous' => 'Sonstiges',
+ 'settings.version' => 'Ausführung',
+ 'settings.background_image' => 'Hintergrundbild',
+ 'settings.homepage_search' => 'Homepage Suchen',
+ 'settings.search_provider' => 'Suchanbieter',
+ 'settings.language' => 'Sprache',
+ 'settings.reset' => 'Zurücksetzen auf Standard zurück',
+ 'settings.remove' => 'Entfernen',
+ 'settings.search' => 'suche',
+ 'settings.no_items' => 'Keine Elemente gefunden',
+ 'settings.label' => 'Etikett',
+ 'settings.value' => 'Wert',
+ 'settings.edit' => 'Bearbeiten',
+ 'settings.view' => 'Ansicht',
+ 'options.none' => '- nicht festgelegt -',
+ 'options.google' => 'Google',
+ 'options.ddg' => 'DuckDuckGo',
+ 'options.bing' => 'Bing',
+ 'options.yes' => 'Ja',
+ 'options.no' => 'Nein',
+ 'buttons.save' => 'Speichern',
+ 'buttons.cancel' => 'Abbrechen',
+ 'buttons.add' => 'Hinzufügen',
+ 'buttons.upload' => 'Hochladen einer Datei',
+ 'dash.pin_item' => 'Element auf dem Dashboard anheften',
+ 'dash.no_apps' => 'Derzeit gibt es keine angeheftete Anwendungen :link1 oder :link2',
+ 'dash.link1' => 'Hinzufügen einer Anwendung hier',
+ 'dash.link2' => 'Heften Sie ein Element auf dem Armaturenbrett',
+ 'dash.pinned_items' => 'Angeheftete Elemente',
+ 'apps.app_list' => 'Anwendungsliste',
+ 'apps.view_trash' => 'Ansicht Papierkorb',
+ 'apps.add_application' => 'Anwendung hinzufügen',
+ 'apps.application_name' => 'Anwendungsname',
+ 'apps.colour' => 'Farbe',
+ 'apps.icon' => 'Symbol',
+ 'apps.pinned' => 'Festgesteckt',
+ 'apps.title' => 'Titel',
+ 'apps.hex' => 'Hex-Farbe',
+ 'apps.username' => 'Benutzername',
+ 'apps.password' => 'Passwort',
+ 'apps.config' => 'Konfig',
+ 'url' => 'Url',
+ 'title' => 'Titel',
+ 'delete' => 'Löschen',
+ 'optional' => 'Wahlweise',
+ 'restore' => 'Wiederherstellen',
+ 'alert.success.item_created' => 'Element erfolgreich erstellt',
+ 'alert.success.item_updated' => 'Artikel erfolgreich aktualisiert',
+ 'alert.success.item_deleted' => 'Element erfolgreich gelöscht',
+ 'alert.success.item_restored' => 'Element erfolgreich wiederhergestellt',
+ 'alert.success.setting_updated' => 'Sie haben diese Einstellung erfolgreich bearbeitet',
+ 'alert.error.not_exist' => 'Diese Einstellung existiert nicht.',
+);
\ No newline at end of file
diff --git a/resources/lang/en/app.php b/resources/lang/en/app.php
new file mode 100644
index 00000000..6379cbe6
--- /dev/null
+++ b/resources/lang/en/app.php
@@ -0,0 +1,78 @@
+ 'System',
+ 'settings.appearance' => 'Appearance',
+ 'settings.miscellaneous' => 'Miscellaneous',
+
+ 'settings.version' => 'Version',
+ 'settings.background_image' => 'Background Image',
+ 'settings.homepage_search' => 'Homepage Search',
+ 'settings.search_provider' => 'Search Provider',
+ 'settings.language' => 'Language',
+ 'settings.reset' => 'Reset back to default',
+ 'settings.remove' => 'Remove',
+ 'settings.search' => 'search',
+ 'settings.no_items' => 'No items found',
+
+
+ 'settings.label' => 'Label',
+ 'settings.value' => 'Value',
+ 'settings.edit' => 'Edit',
+ 'settings.view' => 'View',
+
+ 'options.none' => '- not set -',
+ 'options.google' => 'Google',
+ 'options.ddg' => 'DuckDuckGo',
+ 'options.bing' => 'Bing',
+ 'options.yes' => 'Yes',
+ 'options.no' => 'No',
+
+ 'buttons.save' => 'Save',
+ 'buttons.cancel' => 'Cancel',
+ 'buttons.add' => 'Add',
+ 'buttons.upload' => 'Upload a file',
+
+ 'dash.pin_item' => 'Pin item to dashboard',
+ 'dash.no_apps' => 'There are currently no pinned applications, :link1 or :link2',
+ 'dash.link1' => 'Add an application here',
+ 'dash.link2' => 'Pin an item to the dash',
+ 'dash.pinned_items' => 'Pinned Items',
+
+ 'apps.app_list' => 'Application list',
+ 'apps.view_trash' => 'View trash',
+ 'apps.add_application' => 'Add application',
+ 'apps.application_name' => 'Application name',
+ 'apps.colour' => 'Colour',
+ 'apps.icon' => 'Icon',
+ 'apps.pinned' => 'Pinned',
+ 'apps.title' => 'Title',
+ 'apps.hex' => 'Hex colour',
+ 'apps.username' => 'Username',
+ 'apps.password' => 'Password',
+ 'apps.config' => 'Config',
+
+ 'url' => 'Url',
+ 'title' => 'Title',
+ 'delete' => 'Delete',
+ 'optional' => 'Optional',
+ 'restore' => 'Restore',
+
+ 'alert.success.item_created' => 'Item created successfully',
+ 'alert.success.item_updated' => 'Item updated successfully',
+ 'alert.success.item_deleted' => 'Item deleted successfully',
+ 'alert.success.item_restored' => 'Item restored successfully',
+
+ 'alert.success.setting_updated' => 'You have successfully edited this Setting',
+ 'alert.error.not_exist' => 'This Setting does not exist.',
+
+
+];
diff --git a/resources/lang/es/app.php b/resources/lang/es/app.php
new file mode 100644
index 00000000..dd7c632a
--- /dev/null
+++ b/resources/lang/es/app.php
@@ -0,0 +1,58 @@
+ 'Sistema',
+ 'settings.appearance' => 'Apariencia',
+ 'settings.miscellaneous' => 'Miscelánea',
+ 'settings.version' => 'Versión',
+ 'settings.background_image' => 'Imagen De Fondo',
+ 'settings.homepage_search' => 'Página De Inicio De Búsqueda',
+ 'settings.search_provider' => 'Proveedor de búsqueda',
+ 'settings.language' => 'Idioma',
+ 'settings.reset' => 'Restablecer a predeterminado',
+ 'settings.remove' => 'Quitar',
+ 'settings.search' => 'búsqueda',
+ 'settings.no_items' => 'No se encontraron elementos',
+ 'settings.label' => 'Etiqueta',
+ 'settings.value' => 'Valor',
+ 'settings.edit' => 'Editar',
+ 'settings.view' => 'Ver',
+ 'options.none' => '- no establecido -',
+ 'options.google' => 'Google',
+ 'options.ddg' => 'DuckDuckGo',
+ 'options.bing' => 'Bing',
+ 'options.yes' => 'Sí',
+ 'options.no' => 'No',
+ 'buttons.save' => 'Guardar',
+ 'buttons.cancel' => 'Cancelar',
+ 'buttons.add' => 'Añadir',
+ 'buttons.upload' => 'Cargar un archivo',
+ 'dash.pin_item' => 'Pin elemento al tablero',
+ 'dash.no_apps' => 'Actualmente no hay anclados aplicaciones :link1 o :link2',
+ 'dash.link1' => 'Agregue una aplicación aquí',
+ 'dash.link2' => 'Pin de un elemento en el tablero',
+ 'dash.pinned_items' => 'Elementos Anclados',
+ 'apps.app_list' => 'Lista de aplicaciones',
+ 'apps.view_trash' => 'Vista de la basura',
+ 'apps.add_application' => 'Agregar aplicación',
+ 'apps.application_name' => 'Nombre de la aplicación',
+ 'apps.colour' => 'Color',
+ 'apps.icon' => 'Icono',
+ 'apps.pinned' => 'Fijado',
+ 'apps.title' => 'Título',
+ 'apps.hex' => 'Hexagonal de color',
+ 'apps.username' => 'Nombre de usuario',
+ 'apps.password' => 'Contraseña',
+ 'apps.config' => 'Config',
+ 'url' => 'Url',
+ 'title' => 'Título',
+ 'delete' => 'Borrar',
+ 'optional' => 'Opcional',
+ 'restore' => 'Restaurar',
+ 'alert.success.item_created' => 'Elemento creado con éxito',
+ 'alert.success.item_updated' => 'Artículo actualizado con éxito',
+ 'alert.success.item_deleted' => 'Elemento eliminado correctamente',
+ 'alert.success.item_restored' => 'Elemento restaurado con éxito',
+ 'alert.success.setting_updated' => 'Ha editado con éxito esta configuración',
+ 'alert.error.not_exist' => 'Esta configuración no existe.',
+);
\ No newline at end of file
diff --git a/resources/lang/fi/app.php b/resources/lang/fi/app.php
new file mode 100644
index 00000000..478591e5
--- /dev/null
+++ b/resources/lang/fi/app.php
@@ -0,0 +1,58 @@
+ 'Järjestelmä',
+ 'settings.appearance' => 'Ulkonäkö',
+ 'settings.miscellaneous' => 'Sekalainen',
+ 'settings.version' => 'Versio',
+ 'settings.background_image' => 'Tausta Kuva',
+ 'settings.homepage_search' => 'Kotisivu Haku',
+ 'settings.search_provider' => 'Hakupalvelu',
+ 'settings.language' => 'Kieli',
+ 'settings.reset' => 'Palauta takaisin default',
+ 'settings.remove' => 'Poista',
+ 'settings.search' => 'haku',
+ 'settings.no_items' => 'Kohteita ei löytynyt',
+ 'settings.label' => 'Etiketti',
+ 'settings.value' => 'Arvo',
+ 'settings.edit' => 'Muokkaa',
+ 'settings.view' => 'Näkymä',
+ 'options.none' => '- ole asetettu -',
+ 'options.google' => 'Google',
+ 'options.ddg' => 'DuckDuckGo',
+ 'options.bing' => 'Bing',
+ 'options.yes' => 'Kyllä',
+ 'options.no' => 'Ei',
+ 'buttons.save' => 'Tallenna',
+ 'buttons.cancel' => 'Peruuta',
+ 'buttons.add' => 'Lisää',
+ 'buttons.upload' => 'Lataa tiedosto',
+ 'dash.pin_item' => 'Kiinnitä kohde kojelautaan',
+ 'dash.no_apps' => 'Tällä hetkellä ei ole kiinnitettyjä sovelluksia :link1 tai :link2',
+ 'dash.link1' => 'Lisää sovellus tähän',
+ 'dash.link2' => 'Kiinnitä kohde kojelautaan',
+ 'dash.pinned_items' => 'Kiinnitetyt Kohteet',
+ 'apps.app_list' => 'Sovellus luettelosta',
+ 'apps.view_trash' => 'Näytä roskakori',
+ 'apps.add_application' => 'Lisää sovellus',
+ 'apps.application_name' => 'Sovelluksen nimi',
+ 'apps.colour' => 'Väri',
+ 'apps.icon' => 'Kuvake',
+ 'apps.pinned' => 'Puristuksiin',
+ 'apps.title' => 'Otsikko',
+ 'apps.hex' => 'Hex väri',
+ 'apps.username' => 'Käyttäjätunnus',
+ 'apps.password' => 'Salasana',
+ 'apps.config' => 'Config',
+ 'url' => 'Url',
+ 'title' => 'Otsikko',
+ 'delete' => 'Poistaa',
+ 'optional' => 'Valinnainen',
+ 'restore' => 'Palauttaa',
+ 'alert.success.item_created' => 'Tuote luotiin onnistuneesti',
+ 'alert.success.item_updated' => 'Kohde on päivitetty onnistuneesti',
+ 'alert.success.item_deleted' => 'Kohde poistettu onnistuneesti',
+ 'alert.success.item_restored' => 'Tuote palautettiin onnistuneesti',
+ 'alert.success.setting_updated' => 'Olet muokannut tätä asetusta',
+ 'alert.error.not_exist' => 'Tätä asetusta ei ole olemassa.',
+);
\ No newline at end of file
diff --git a/resources/lang/fr/app.php b/resources/lang/fr/app.php
new file mode 100644
index 00000000..639b24b3
--- /dev/null
+++ b/resources/lang/fr/app.php
@@ -0,0 +1,58 @@
+ 'Système',
+ 'settings.appearance' => 'Apparence',
+ 'settings.miscellaneous' => 'Divers',
+ 'settings.version' => 'Version',
+ 'settings.background_image' => 'Image D\'Arrière-Plan',
+ 'settings.homepage_search' => 'La Page D\'Accueil De Recherche',
+ 'settings.search_provider' => 'Fournisseur de recherche',
+ 'settings.language' => 'Langue',
+ 'settings.reset' => 'Réinitialiser aux valeurs par défaut',
+ 'settings.remove' => 'Supprimer',
+ 'settings.search' => 'chercher',
+ 'settings.no_items' => 'Pas d\'articles trouvés',
+ 'settings.label' => 'Étiquette',
+ 'settings.value' => 'Valeur',
+ 'settings.edit' => 'Modifier',
+ 'settings.view' => 'Vue',
+ 'options.none' => '- non défini -',
+ 'options.google' => 'Google',
+ 'options.ddg' => 'DuckDuckGo',
+ 'options.bing' => 'Bing',
+ 'options.yes' => 'Oui',
+ 'options.no' => 'Non',
+ 'buttons.save' => 'Enregistrer',
+ 'buttons.cancel' => 'Annuler',
+ 'buttons.add' => 'Ajouter',
+ 'buttons.upload' => 'Télécharger un fichier',
+ 'dash.pin_item' => 'Épingler l\'élément au tableau de bord',
+ 'dash.no_apps' => 'Il n\'existe actuellement aucun épinglé applications :link1 ou :link2',
+ 'dash.link1' => 'Ajouter une application ici',
+ 'dash.link2' => 'Pin un élément au tableau de bord',
+ 'dash.pinned_items' => 'Éléments épinglés',
+ 'apps.app_list' => 'Liste des applications',
+ 'apps.view_trash' => 'Voir la corbeille',
+ 'apps.add_application' => 'Ajouter une application',
+ 'apps.application_name' => 'Nom de l\'application',
+ 'apps.colour' => 'Couleur',
+ 'apps.icon' => 'Icône',
+ 'apps.pinned' => 'Épinglé',
+ 'apps.title' => 'Titre',
+ 'apps.hex' => 'Hexadécimal de la couleur',
+ 'apps.username' => 'Nom d\'utilisateur',
+ 'apps.password' => 'Mot de passe',
+ 'apps.config' => 'Config',
+ 'url' => 'Url',
+ 'title' => 'Titre',
+ 'delete' => 'Effacer',
+ 'optional' => 'Optionnel',
+ 'restore' => 'Restaurer',
+ 'alert.success.item_created' => 'Élément créé avec succès',
+ 'alert.success.item_updated' => 'Article mis à jour avec succès',
+ 'alert.success.item_deleted' => 'Élément supprimé avec succès',
+ 'alert.success.item_restored' => 'Élément à restaurer avec succès',
+ 'alert.success.setting_updated' => 'Vous avez modifié ce paramètre avec succès',
+ 'alert.error.not_exist' => 'Ce paramètre n\'existe pas.',
+);
\ No newline at end of file
diff --git a/resources/lang/sv/app.php b/resources/lang/sv/app.php
new file mode 100644
index 00000000..44bfbc81
--- /dev/null
+++ b/resources/lang/sv/app.php
@@ -0,0 +1,58 @@
+ 'Systemet',
+ 'settings.appearance' => 'Utseende',
+ 'settings.miscellaneous' => 'Övrigt',
+ 'settings.version' => 'Version',
+ 'settings.background_image' => 'Bakgrundsbild',
+ 'settings.homepage_search' => 'Startsida Sök',
+ 'settings.search_provider' => 'Sök Leverantör',
+ 'settings.language' => 'Språk',
+ 'settings.reset' => 'Återställ tillbaka till standard',
+ 'settings.remove' => 'Avlägsna',
+ 'settings.search' => 'sök',
+ 'settings.no_items' => 'Inga poster hittades',
+ 'settings.label' => 'Etikett',
+ 'settings.value' => 'Värde',
+ 'settings.edit' => 'Ändra',
+ 'settings.view' => 'Visa',
+ 'options.none' => '- inte sätta -',
+ 'options.google' => 'Google',
+ 'options.ddg' => 'DuckDuckGo',
+ 'options.bing' => 'Bing',
+ 'options.yes' => 'Ja',
+ 'options.no' => 'Nej',
+ 'buttons.save' => 'Spara',
+ 'buttons.cancel' => 'Avbryt',
+ 'buttons.add' => 'Lägg till',
+ 'buttons.upload' => 'Ladda upp en fil',
+ 'dash.pin_item' => 'Pin objekt till instrumentpanelen',
+ 'dash.no_apps' => 'Det finns för närvarande inga fästa applikationer, :link1 eller :link2',
+ 'dash.link1' => 'Lägg till en ansökan här',
+ 'dash.link2' => 'Pin-ett objekt till dash',
+ 'dash.pinned_items' => 'Fasta Objekt',
+ 'apps.app_list' => 'Applikationslista',
+ 'apps.view_trash' => 'Visa papperskorgen',
+ 'apps.add_application' => 'Lägg till applikation',
+ 'apps.application_name' => 'Ansökan namn',
+ 'apps.colour' => 'Färg',
+ 'apps.icon' => 'Ikonen',
+ 'apps.pinned' => 'Nålas',
+ 'apps.title' => 'Titel',
+ 'apps.hex' => 'Hex-färg',
+ 'apps.username' => 'Användarnamn',
+ 'apps.password' => 'Lösenord',
+ 'apps.config' => 'Config',
+ 'url' => 'Url',
+ 'title' => 'Titel',
+ 'delete' => 'Radera',
+ 'optional' => 'Frivillig',
+ 'restore' => 'Återställa',
+ 'alert.success.item_created' => 'Objekt som skapats',
+ 'alert.success.item_updated' => 'Föremålet uppdaterades framgångsrikt',
+ 'alert.success.item_deleted' => 'Objekt som har tagits bort',
+ 'alert.success.item_restored' => 'Artikeln återställdes framgångsrikt',
+ 'alert.success.setting_updated' => 'Du har framgångsrikt redigerat denna inställning',
+ 'alert.error.not_exist' => 'Denna inställning existerar inte.',
+);
\ No newline at end of file
diff --git a/resources/views/add.blade.php b/resources/views/add.blade.php
index 13ad4b65..ce3e2764 100644
--- a/resources/views/add.blade.php
+++ b/resources/views/add.blade.php
@@ -1,4 +1,4 @@
diff --git a/resources/views/app.blade.php b/resources/views/app.blade.php
index f5ffc722..42aa603e 100644
--- a/resources/views/app.blade.php
+++ b/resources/views/app.blade.php
@@ -15,7 +15,7 @@