mirror of
https://github.com/Einundzwanzig-Podcast/einundzwanzig-portal.git
synced 2025-12-11 06:46:47 +00:00
huge Laravel 10 upgrade
This commit is contained in:
262
support/laravel-translation/resources/assets/css/main.css
Normal file
262
support/laravel-translation/resources/assets/css/main.css
Normal file
@@ -0,0 +1,262 @@
|
||||
/**
|
||||
* This injects Tailwind's base styles, which is a combination of
|
||||
* Normalize.css and some additional base styles.
|
||||
*
|
||||
* You can see the styles here:
|
||||
* https://github.com/tailwindcss/tailwindcss/blob/master/css/preflight.css
|
||||
*
|
||||
* If using `postcss-import`, use this import instead:
|
||||
*
|
||||
* @import "tailwindcss/preflight";
|
||||
*/
|
||||
|
||||
@tailwind preflight;
|
||||
/**
|
||||
* This injects any component classes registered by plugins.
|
||||
*
|
||||
* If using `postcss-import`, use this import instead:
|
||||
*
|
||||
* @import "tailwindcss/components";
|
||||
*/
|
||||
|
||||
@tailwind components;
|
||||
/**
|
||||
* Here you would add any of your custom component classes; stuff that you'd
|
||||
* want loaded *before* the utilities so that the utilities could still
|
||||
* override them.
|
||||
*
|
||||
* Example:
|
||||
*
|
||||
* .btn { ... }
|
||||
* .form-input { ... }
|
||||
*
|
||||
* Or if using a preprocessor or `postcss-import`:
|
||||
*
|
||||
* @import "components/buttons";
|
||||
* @import "components/forms";
|
||||
*/
|
||||
|
||||
/**
|
||||
* This injects all of Tailwind's utility classes, generated based on your
|
||||
* config file.
|
||||
*
|
||||
* If using `postcss-import`, use this import instead:
|
||||
*
|
||||
* @import "tailwindcss/utilities";
|
||||
*/
|
||||
|
||||
@tailwind utilities;
|
||||
/**
|
||||
* Here you would add any custom utilities you need that don't come out of the
|
||||
* box with Tailwind.
|
||||
*
|
||||
* Example :
|
||||
*
|
||||
* .bg-pattern-graph-paper { ... }
|
||||
* .skew-45 { ... }
|
||||
*
|
||||
* Or if using a preprocessor or `postcss-import`:
|
||||
*
|
||||
* @import "utilities/background-patterns";
|
||||
* @import "utilities/skew-transforms";
|
||||
*/
|
||||
|
||||
body {
|
||||
@apply bg-grey-lighter text-grey-darkest
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style-type: none;
|
||||
@apply flex;
|
||||
}
|
||||
|
||||
li {
|
||||
@apply px-4;
|
||||
}
|
||||
|
||||
a {
|
||||
@apply text-blue;
|
||||
}
|
||||
|
||||
nav.header {
|
||||
background: linear-gradient(90deg, #125b93, #2891c4);
|
||||
@apply border-b flex items-center h-16 text-white w-full
|
||||
}
|
||||
|
||||
nav a {
|
||||
@apply .opacity-75 text-white no-underline flex items-center
|
||||
}
|
||||
|
||||
nav a.active {
|
||||
@apply opacity-100
|
||||
}
|
||||
|
||||
nav a:hover {
|
||||
@apply opacity-100 underline
|
||||
}
|
||||
|
||||
.panel {
|
||||
@apply bg-white rounded m-6 shadow text-grey-dark
|
||||
}
|
||||
|
||||
.panel-header {
|
||||
@apply p-4 text-lg border-b flex items-center font-thin
|
||||
}
|
||||
|
||||
.panel-footer {
|
||||
@apply border-t bg-grey-lighter p-4
|
||||
}
|
||||
|
||||
.panel-body table {
|
||||
@apply w-full table-fixed;
|
||||
}
|
||||
|
||||
.panel-body th,
|
||||
.panel-body td {
|
||||
@apply text-left p-4 overflow-x-auto
|
||||
}
|
||||
|
||||
.panel-body th {
|
||||
@apply text-grey-darker
|
||||
}
|
||||
|
||||
.panel-body td {
|
||||
@apply font-thin align-top
|
||||
}
|
||||
|
||||
.panel-body tr {
|
||||
@apply border-b
|
||||
}
|
||||
|
||||
.panel-body thead tr {
|
||||
@apply bg-grey-lighter
|
||||
}
|
||||
|
||||
.panel-body tbody tr:nth-child(even) {
|
||||
@apply bg-grey-lighter
|
||||
}
|
||||
|
||||
.panel-body tbody tr:hover,
|
||||
.panel-body tbody tr:nth-child(even):hover {
|
||||
@apply bg-blue-lightest
|
||||
}
|
||||
|
||||
.panel-body tbody tr:last-child {
|
||||
@apply border-none
|
||||
}
|
||||
|
||||
.panel-body td textarea {
|
||||
overflow-wrap: inherit;
|
||||
@apply border-none resize-none bg-transparent text-grey-darker w-full font-thin h-auto p-0
|
||||
}
|
||||
|
||||
.panel-body td textarea.active {
|
||||
@apply w-full rounded h-32 p-2 border border-solid border-grey
|
||||
}
|
||||
|
||||
.panel-body td textarea:focus {
|
||||
@apply outline-none;
|
||||
}
|
||||
|
||||
.button {
|
||||
@apply bg-transparent text-grey-darker py-2 px-4 border border-grey rounded text-sm font-bold no-underline
|
||||
}
|
||||
|
||||
.button:hover {
|
||||
@apply text-blue
|
||||
}
|
||||
|
||||
.button-blue {
|
||||
@apply bg-blue text-white border-blue
|
||||
}
|
||||
|
||||
.button-blue:hover {
|
||||
@apply text-white bg-blue-dark
|
||||
}
|
||||
|
||||
.input-group {
|
||||
@apply w-full mb-6
|
||||
}
|
||||
|
||||
.input-group label {
|
||||
@apply block uppercase tracking-wide text-grey-darker text-xs font-bold mb-2
|
||||
}
|
||||
|
||||
.input-group input {
|
||||
@apply appearance-none block w-full bg-grey-lighter text-grey-darker border rounded py-3 px-4 mb-3 leading-tight
|
||||
}
|
||||
|
||||
.input-group:last-child {
|
||||
@apply mb-0
|
||||
}
|
||||
|
||||
.input-group input.error {
|
||||
@apply border-red
|
||||
}
|
||||
|
||||
.input-group .error-text {
|
||||
@apply text-red text-xs italic
|
||||
}
|
||||
|
||||
.select-group {
|
||||
@apply relative mr-2
|
||||
}
|
||||
|
||||
.select-group:last-child {
|
||||
@apply m-0
|
||||
}
|
||||
|
||||
.select-group select {
|
||||
@apply text-base block appearance-none bg-white border text-grey-darker uppercase py-2 px-4 pr-8 rounded leading-tight max-w-xs font-thin
|
||||
}
|
||||
|
||||
.select-group select:focus {
|
||||
@apply outline-none border-grey
|
||||
}
|
||||
|
||||
.select-group .caret {
|
||||
@apply pointer-events-none absolute pin-y pin-r flex items-center px-2 text-grey-darker
|
||||
}
|
||||
|
||||
.select-group .caret svg {
|
||||
@apply fill-current h-4 w-4
|
||||
}
|
||||
|
||||
.w-1\/10 {
|
||||
width: 10%;
|
||||
}
|
||||
|
||||
.search-input {
|
||||
background: url('data:image/svg+xml;charset=utf8,<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" xmlns:bx="https://boxy-svg.com"><path d="M 11.732 12.439 C 9.047 14.525 5.109 12.921 4.645 9.553 C 4.181 6.183 7.538 3.575 10.689 4.858 C 13.399 5.962 14.306 9.349 12.512 11.66 L 15.466 14.603 L 14.682 15.388 L 11.738 12.439 Z M 9.027 12.263 C 11.577 12.263 13.172 9.5 11.897 7.291 C 11.304 6.267 10.21 5.634 9.027 5.634 C 6.476 5.634 4.88 8.397 6.157 10.606 C 6.749 11.63 7.842 12.263 9.027 12.263 Z" style="fill: rgb(96, 111, 123);"/></svg>');
|
||||
@apply bg-grey-lighter rounded pl-10 py-2 pr-4 bg-no-repeat bg-contain transition border text-grey-darker font-thin w-full
|
||||
}
|
||||
|
||||
.search-input:focus {
|
||||
@apply outline-none bg-white border border-grey-light
|
||||
}
|
||||
|
||||
.transition {
|
||||
transition: all .1s ease-in;
|
||||
}
|
||||
|
||||
.search {
|
||||
max-width: 500px;
|
||||
@apply mx-2 relative flex-1
|
||||
}
|
||||
|
||||
ul.search-results {
|
||||
max-height: 300px;
|
||||
@apply font-thin pl-0 block absolute w-full bg-grey-lighter border border-t-0 rounded rounded-t-none overflow-x-hidden overflow-y-scroll
|
||||
}
|
||||
|
||||
ul.search-results li {
|
||||
@apply px-4 py-2 border-b pl-10;
|
||||
}
|
||||
|
||||
ul.search-results li:last-child {
|
||||
@apply border-b-0;
|
||||
}
|
||||
|
||||
.search.has-results .search-input {
|
||||
@apply border-b-0 rounded-b-none bg-white
|
||||
}
|
||||
63
support/laravel-translation/resources/assets/js/app.js
Normal file
63
support/laravel-translation/resources/assets/js/app.js
Normal file
@@ -0,0 +1,63 @@
|
||||
|
||||
/**
|
||||
* First we will load all of this project's JavaScript dependencies which
|
||||
* includes Vue and other libraries. It is a great starting point when
|
||||
* building robust, powerful web applications using Vue and Laravel.
|
||||
*/
|
||||
|
||||
// require('./bootstrap');
|
||||
|
||||
/**
|
||||
* We'll load the axios HTTP library which allows us to easily issue requests
|
||||
* to our Laravel back-end. This library automatically handles sending the
|
||||
* CSRF token as a header based on the value of the "XSRF" token cookie.
|
||||
*/
|
||||
|
||||
window.axios = require('axios');
|
||||
|
||||
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
|
||||
|
||||
/**
|
||||
* Next we will register the CSRF Token as a common header with Axios so that
|
||||
* all outgoing HTTP requests automatically have it attached. This is just
|
||||
* a simple convenience so we don't have to attach every token manually.
|
||||
*/
|
||||
|
||||
let token = document.head.querySelector('meta[name="csrf-token"]');
|
||||
|
||||
if (token) {
|
||||
window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
|
||||
} else {
|
||||
console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
|
||||
}
|
||||
|
||||
window.Vue = require('vue');
|
||||
|
||||
/**
|
||||
* Next, we will create a fresh Vue application instance and attach it to
|
||||
* the page. Then, you may begin adding components to this application
|
||||
* or customize the JavaScript scaffolding to fit your unique needs.
|
||||
*/
|
||||
|
||||
Vue.component('translation-input', require('./components/TranslationInput.vue').default);
|
||||
|
||||
const app = new Vue({
|
||||
el: '#app',
|
||||
|
||||
data: function () {
|
||||
return {
|
||||
showAdvancedOptions: false,
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
submit: function(event) {
|
||||
event.target.form.submit();
|
||||
},
|
||||
|
||||
toggleAdvancedOptions(event) {
|
||||
event.preventDefault();
|
||||
this.showAdvancedOptions = !this.showAdvancedOptions;
|
||||
}
|
||||
}
|
||||
});
|
||||
56
support/laravel-translation/resources/assets/js/bootstrap.js
vendored
Normal file
56
support/laravel-translation/resources/assets/js/bootstrap.js
vendored
Normal file
@@ -0,0 +1,56 @@
|
||||
|
||||
window._ = require('lodash');
|
||||
window.Popper = require('popper.js').default;
|
||||
|
||||
/**
|
||||
* We'll load jQuery and the Bootstrap jQuery plugin which provides support
|
||||
* for JavaScript based Bootstrap features such as modals and tabs. This
|
||||
* code may be modified to fit the specific needs of your application.
|
||||
*/
|
||||
|
||||
try {
|
||||
window.$ = window.jQuery = require('jquery');
|
||||
|
||||
require('bootstrap');
|
||||
} catch (e) {}
|
||||
|
||||
/**
|
||||
* We'll load the axios HTTP library which allows us to easily issue requests
|
||||
* to our Laravel back-end. This library automatically handles sending the
|
||||
* CSRF token as a header based on the value of the "XSRF" token cookie.
|
||||
*/
|
||||
|
||||
window.axios = require('axios');
|
||||
|
||||
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
|
||||
|
||||
/**
|
||||
* Next we will register the CSRF Token as a common header with Axios so that
|
||||
* all outgoing HTTP requests automatically have it attached. This is just
|
||||
* a simple convenience so we don't have to attach every token manually.
|
||||
*/
|
||||
|
||||
let token = document.head.querySelector('meta[name="csrf-token"]');
|
||||
|
||||
if (token) {
|
||||
window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
|
||||
} else {
|
||||
console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
|
||||
}
|
||||
|
||||
/**
|
||||
* Echo exposes an expressive API for subscribing to channels and listening
|
||||
* for events that are broadcast by Laravel. Echo and event broadcasting
|
||||
* allows your team to easily build robust real-time web applications.
|
||||
*/
|
||||
|
||||
// import Echo from 'laravel-echo'
|
||||
|
||||
// window.Pusher = require('pusher-js');
|
||||
|
||||
// window.Echo = new Echo({
|
||||
// broadcaster: 'pusher',
|
||||
// key: process.env.MIX_PUSHER_APP_KEY,
|
||||
// cluster: process.env.MIX_PUSHER_APP_CLUSTER,
|
||||
// encrypted: true
|
||||
// });
|
||||
@@ -0,0 +1,78 @@
|
||||
<template>
|
||||
<div class="flex">
|
||||
<svg v-show="!isActive && isLoading" v-on:click="setActive" class="cursor-pointer fill-current w-5 h-5 mr-2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M0 2C0 .9.9 0 2 0h14l4 4v14a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2zm5 0v6h10V2H5zm6 1h3v4h-3V3z"/></svg>
|
||||
<svg v-show="!isActive && hasSaved" v-on:click="setActive" class="cursor-pointer fill-current text-green w-5 h-5 mr-2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M2.93 17.07A10 10 0 1 1 17.07 2.93 10 10 0 0 1 2.93 17.07zm12.73-1.41A8 8 0 1 0 4.34 4.34a8 8 0 0 0 11.32 11.32zM6.7 9.29L9 11.6l4.3-4.3 1.4 1.42L9 14.4l-3.7-3.7 1.4-1.42z"/></svg>
|
||||
<svg v-show="!isActive && hasErrored" v-on:click="setActive" class="cursor-pointer fill-current text-red w-5 h-5 mr-2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M2.93 17.07A10 10 0 1 1 17.07 2.93 10 10 0 0 1 2.93 17.07zm1.41-1.41A8 8 0 1 0 15.66 4.34 8 8 0 0 0 4.34 15.66zm9.9-8.49L11.41 10l2.83 2.83-1.41 1.41L10 11.41l-2.83 2.83-1.41-1.41L8.59 10 5.76 7.17l1.41-1.41L10 8.59l2.83-2.83 1.41 1.41z"/></svg>
|
||||
<svg v-show="!isActive && !hasSaved && !hasErrored && !isLoading" v-on:click="setActive" class="cursor-pointer fill-current w-4 h-4 mr-2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M12.3 3.7l4 4L4 20H0v-4L12.3 3.7zm1.4-1.4L16 0l4 4-2.3 2.3-4-4z"/></svg>
|
||||
<textarea
|
||||
rows="1"
|
||||
v-model="translation"
|
||||
v-bind:class="{ active: isActive }"
|
||||
v-on:focus="setActive"
|
||||
v-on:blur="storeTranslation"
|
||||
ref="trans"
|
||||
></textarea>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ['initialTranslation', 'language', 'group', 'translationKey', 'route'],
|
||||
|
||||
data: function() {
|
||||
return {
|
||||
isActive: false,
|
||||
hasSaved: false,
|
||||
hasErrored: false,
|
||||
isLoading: false,
|
||||
hasChanged: false,
|
||||
translation: this.initialTranslation
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
setActive: function() {
|
||||
this.isActive = true;
|
||||
this.$refs.trans.focus();
|
||||
},
|
||||
storeTranslation: function() {
|
||||
this.isActive = false;
|
||||
if(!this.hasChanged) {
|
||||
return;
|
||||
}
|
||||
this.isLoading = true;
|
||||
window.axios.post(`/${this.route}/${this.language}`, {
|
||||
language: this.language,
|
||||
group: this.group,
|
||||
key: this.translationKey,
|
||||
value: this.translation
|
||||
}).then((response) => {
|
||||
this.hasSaved = true;
|
||||
this.isLoading = false;
|
||||
this.hasChanged = false;
|
||||
})
|
||||
.catch((error) => {
|
||||
this.hasErrored = true;
|
||||
this.isLoading = false;
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
watch: {
|
||||
hasSaved: function(hasSaved) {
|
||||
if(hasSaved) {
|
||||
setTimeout(() => { this.hasSaved = false }, 3000)
|
||||
}
|
||||
},
|
||||
hasErrored: function(hasErrored) {
|
||||
if(hasErrored) {
|
||||
setTimeout(() => { this.hasErrored = false }, 3000)
|
||||
}
|
||||
},
|
||||
translation: function(translation)
|
||||
{
|
||||
this.hasChanged = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
113
support/laravel-translation/resources/helpers.php
Normal file
113
support/laravel-translation/resources/helpers.php
Normal file
@@ -0,0 +1,113 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
if (! function_exists('set_active')) {
|
||||
/**
|
||||
* Determine if a route is the currently active route.
|
||||
*
|
||||
* @param string $path
|
||||
* @param string $class
|
||||
* @return string
|
||||
*/
|
||||
function set_active($path, $class = 'active')
|
||||
{
|
||||
return Request::is(config('translation.ui_url').$path) ? $class : '';
|
||||
}
|
||||
}
|
||||
|
||||
if (! function_exists('strs_contain')) {
|
||||
/**
|
||||
* Determine whether any of the provided strings in the haystack contain the needle.
|
||||
*
|
||||
* @param array $haystacks
|
||||
* @param string $needle
|
||||
* @return bool
|
||||
*/
|
||||
function strs_contain($haystacks, $needle)
|
||||
{
|
||||
$haystacks = (array) $haystacks;
|
||||
|
||||
foreach ($haystacks as $haystack) {
|
||||
if (is_array($haystack)) {
|
||||
return strs_contain($haystack, $needle);
|
||||
} elseif (Str::contains(strtolower($haystack), strtolower($needle))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (! function_exists('array_diff_assoc_recursive')) {
|
||||
/**
|
||||
* Recursively diff two arrays.
|
||||
*
|
||||
* @param array $arrayOne
|
||||
* @param array $arrayTwo
|
||||
* @return array
|
||||
*/
|
||||
function array_diff_assoc_recursive($arrayOne, $arrayTwo)
|
||||
{
|
||||
$difference = [];
|
||||
foreach ($arrayOne as $key => $value) {
|
||||
if (is_array($value) || $value instanceof Illuminate\Support\Collection) {
|
||||
if (! isset($arrayTwo[$key])) {
|
||||
$difference[$key] = $value;
|
||||
} elseif (! (is_array($arrayTwo[$key]) || $arrayTwo[$key] instanceof Illuminate\Support\Collection)) {
|
||||
$difference[$key] = $value;
|
||||
} else {
|
||||
$new_diff = array_diff_assoc_recursive($value, $arrayTwo[$key]);
|
||||
if ($new_diff != false) {
|
||||
$difference[$key] = $new_diff;
|
||||
}
|
||||
}
|
||||
} elseif (! isset($arrayTwo[$key])) {
|
||||
$difference[$key] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
return $difference;
|
||||
}
|
||||
}
|
||||
|
||||
if (! function_exists('str_before')) {
|
||||
/**
|
||||
* Get the portion of a string before a given value.
|
||||
*
|
||||
* @param string $subject
|
||||
* @param string $search
|
||||
* @return string
|
||||
*/
|
||||
function str_before($subject, $search)
|
||||
{
|
||||
return $search === '' ? $subject : explode($search, $subject)[0];
|
||||
}
|
||||
}
|
||||
|
||||
// Array undot
|
||||
if (! function_exists('array_undot')) {
|
||||
/**
|
||||
* Expands a single level array with dot notation into a multi-dimensional array.
|
||||
*
|
||||
* @param array $dotNotationArray
|
||||
* @return array
|
||||
*/
|
||||
function array_undot(array $dotNotationArray)
|
||||
{
|
||||
$array = [];
|
||||
foreach ($dotNotationArray as $key => $value) {
|
||||
// if there is a space after the dot, this could legitimately be
|
||||
// a single key and not nested.
|
||||
if (count(explode('. ', $key)) > 1) {
|
||||
$array[$key] = $value;
|
||||
} else {
|
||||
Arr::set($array, $key, $value);
|
||||
}
|
||||
}
|
||||
|
||||
return $array;
|
||||
}
|
||||
}
|
||||
6
support/laravel-translation/resources/lang/de/errors.php
Normal file
6
support/laravel-translation/resources/lang/de/errors.php
Normal file
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'language_exists' => 'Die Sprache { :language } ist bereits vorhanden',
|
||||
'key_exists' => 'Der Übersetzungsschlüssel { :key } ist bereits vorhanden',
|
||||
];
|
||||
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'languages' => 'Sprachen',
|
||||
'language' => 'Sprache',
|
||||
'type' => 'Typ',
|
||||
'file' => 'Datei',
|
||||
'key' => 'Schlüssel',
|
||||
'prompt_language' => 'Geben Sie den Sprachcode ein, den Sie hinzufügen möchten (z.B. en).',
|
||||
'language_added' => 'Neue Sprache wurde erfolgreich hinzugefügt 🙌',
|
||||
'prompt_language_for_key' => 'Geben Sie die Sprache für den Schlüssel ein (z.B. en)',
|
||||
'prompt_type' => 'Ist das ein Json- oder Array-Schlüssel?',
|
||||
'prompt_file' => 'In welcher Datei wird das gespeichert?',
|
||||
'prompt_key' => 'Was ist der Schlüssel für diese Übersetzung?',
|
||||
'prompt_value' => 'Was ist der Wert für diese Übersetzung',
|
||||
'type_error' => 'Übersetzungstyp muss json oder ein Array sein',
|
||||
'language_key_added' => 'Neuer Sprachenschlüssel wurde erfolgreich hinzugefügt 👏',
|
||||
'no_missing_keys' => 'Es fehlen keine Übersetzungsschlüssel in der App 🎉',
|
||||
'keys_synced' => 'Fehlende Schlüssel erfolgreich synchronisiert 🎊',
|
||||
'search' => 'Alle Übersetzungen suchen',
|
||||
'translations' => 'Übersetzung',
|
||||
'language_name' => 'Name',
|
||||
'locale' => 'locale',
|
||||
'add' => '+ Hinzufügen',
|
||||
'add_language' => 'Neue Sprache hinzufügen',
|
||||
'save' => 'save',
|
||||
'language_exists' => 'Das :attribute ist bereits vorhanden.',
|
||||
'uh_oh' => 'Etwas ist nicht ganz richtig',
|
||||
'group_single' => 'Gruppe / Single',
|
||||
'Gruppe' => 'Gruppe',
|
||||
'single' => 'single',
|
||||
'value' => 'Wert',
|
||||
'namespace' => 'Namespace',
|
||||
'synchronisieren' => 'Übersetzungen synchronisieren ⏳',
|
||||
'synced' => 'Übersetzungen wurden synchronisiert 😎',
|
||||
'add_translation' => 'Übersetzung hinzufügen',
|
||||
'translation_added' => 'Neue Übersetzung erfolgreich hinzugefügt 🙌',
|
||||
'namespace_label' => 'Namespace (optional)',
|
||||
'group_label' => 'Gruppe (optional)',
|
||||
'key_label' => 'Schlüssel',
|
||||
'value_label' => 'Wert',
|
||||
'namespace_placeholder' => 'z.B. my_package',
|
||||
'group_placeholder' => 'z.B. validation',
|
||||
'key_placeholder' => 'z.B. invalid_key',
|
||||
'value_placeholder' => 'z.B. Schlüssel müssen eine einzige Zeichenfolge sein',
|
||||
'advanced_options' => 'Erweiterte Optionen umschalten',
|
||||
];
|
||||
6
support/laravel-translation/resources/lang/en/errors.php
Normal file
6
support/laravel-translation/resources/lang/en/errors.php
Normal file
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'language_exists' => 'The language { :language } already exists',
|
||||
'key_exists' => 'The translation key { :key } already exists',
|
||||
];
|
||||
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'languages' => 'Languages',
|
||||
'language' => 'Language',
|
||||
'type' => 'Type',
|
||||
'file' => 'File',
|
||||
'key' => 'Key',
|
||||
'prompt_language' => 'Enter the language code you would like to add (e.g. en)',
|
||||
'language_added' => 'New language added successfully 🙌',
|
||||
'prompt_language_for_key' => 'Enter the language for the key (e.g. en)',
|
||||
'prompt_type' => 'Is this a json or array key?',
|
||||
'prompt_file' => 'Which file will this be stored in?',
|
||||
'prompt_key' => 'What is the key for this translation?',
|
||||
'prompt_value' => 'What is the value for this translation',
|
||||
'type_error' => 'Translation type must be json or array',
|
||||
'language_key_added' => 'New language key added successfully 👏',
|
||||
'no_missing_keys' => 'There are no missing translation keys in the app 🎉',
|
||||
'keys_synced' => 'Missing keys synchronised successfully 🎊',
|
||||
'search' => 'Search all translations',
|
||||
'translations' => 'Translation',
|
||||
'language_name' => 'Name',
|
||||
'locale' => 'Locale',
|
||||
'add' => '+ Add',
|
||||
'add_language' => 'Add a new language',
|
||||
'save' => 'Save',
|
||||
'language_exists' => 'The :attribute already exists.',
|
||||
'uh_oh' => 'Something\'s not quite right',
|
||||
'group_single' => 'Group / Single',
|
||||
'group' => 'Group',
|
||||
'single' => 'Single',
|
||||
'value' => 'Value',
|
||||
'namespace' => 'Namespace',
|
||||
'add_translation' => 'Add a translation',
|
||||
'translation_added' => 'New translation added successfull 🙌',
|
||||
'namespace_label' => 'Namespace (Optional)',
|
||||
'group_label' => 'Group (Optional)',
|
||||
'key_label' => 'Key',
|
||||
'value_label' => 'Value',
|
||||
'namespace_placeholder' => 'e.g. my_package',
|
||||
'group_placeholder' => 'e.g. validation',
|
||||
'key_placeholder' => 'e.g. invalid_key',
|
||||
'value_placeholder' => 'e.g. Keys must be a single string',
|
||||
'advanced_options' => 'Toggle advanced options',
|
||||
];
|
||||
6
support/laravel-translation/resources/lang/fr/errors.php
Normal file
6
support/laravel-translation/resources/lang/fr/errors.php
Normal file
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'key_exists' => 'La clé de traduction { :key } existe déjà',
|
||||
'language_exists' => 'La langue { :language } existe déjà',
|
||||
];
|
||||
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'add' => '+ Ajouter',
|
||||
'add_language' => 'Ajouter une nouvelle langue',
|
||||
'add_translation' => 'Ajouter une traduction',
|
||||
'advanced_options' => 'Afficher les options avancées',
|
||||
'file' => 'Fichier',
|
||||
'group' => 'Groupe',
|
||||
'group_label' => 'Groupe (Optionnel)',
|
||||
'group_placeholder' => 'Ex: validation',
|
||||
'group_single' => 'Groupe / Unique',
|
||||
'key' => 'Clé',
|
||||
'key_label' => 'Clé',
|
||||
'key_placeholder' => 'Par exemple : invalid_key',
|
||||
'keys_synced' => 'Clés manquantes synchronisées avec succès 🎊',
|
||||
'language' => 'Langue',
|
||||
'language_added' => 'Nouvelle langue ajoutée avec succés 🙌',
|
||||
'language_exists' => 'Le :attribute existe déjà.',
|
||||
'language_key_added' => 'Nouvelle clé dans la langue ajoutée avec succès 👏',
|
||||
'language_name' => 'Nom',
|
||||
'languages' => 'Langues',
|
||||
'locale' => 'Locale',
|
||||
'namespace' => 'Namespace',
|
||||
'namespace_label' => 'Namespace (Optionnel)',
|
||||
'namespace_placeholder' => 'Par exemple : my_package',
|
||||
'no_missing_keys' => 'Il ne manque aucune clé de traduction dans l\'application 🎉',
|
||||
'prompt_file' => 'Dans quel fichier sera t\'elle stockée ?',
|
||||
'prompt_key' => 'Quelle est la clé de cette traduction ?',
|
||||
'prompt_language' => 'Entrez le code langue que vous aimeriez ajouter (Ex: fr)',
|
||||
'prompt_language_for_key' => 'Entrez la langue pour la clé (Ex: fr)',
|
||||
'prompt_type' => 'Est-ce une clé Json ou Array ?',
|
||||
'prompt_value' => 'Quelle est la valeur de la traduction',
|
||||
'save' => 'Sauvegarder',
|
||||
'search' => 'Rechercher toutes les traductions',
|
||||
'single' => 'Unique',
|
||||
'translation_added' => 'Nouvelle traduction ajoutée avec succès 🙌',
|
||||
'translations' => 'Traduction',
|
||||
'type' => 'Type',
|
||||
'type_error' => 'Le type de traduction doit être en json ou en array',
|
||||
'uh_oh' => 'Quelque chose ne fonctionne pas',
|
||||
'value' => 'Valeur',
|
||||
'value_label' => 'Valeur',
|
||||
'value_placeholder' => 'Par exemple : Les clés doivent être une seule chaîne',
|
||||
];
|
||||
6
support/laravel-translation/resources/lang/nl/errors.php
Normal file
6
support/laravel-translation/resources/lang/nl/errors.php
Normal file
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'language_exists' => 'De taal { :language } bestaat al',
|
||||
'key_exists' => 'De vertaalsleutel { :key } bestaat al',
|
||||
];
|
||||
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'languages' => 'Talen',
|
||||
'language' => 'Taal',
|
||||
'type' => 'Type',
|
||||
'file' => 'Bestand',
|
||||
'key' => 'Sleutel',
|
||||
'prompt_language' => 'Voer de taalcode in die u wilt toevoegen (bijvoorbeeld: en)',
|
||||
'language_added' => 'Nieuwe taal met succes toegevoegd 🙌',
|
||||
'prompt_language_for_key' => 'Voer de taal voor de sleutel in (bijvoorbeeld: en)',
|
||||
'prompt_type' => 'Is dit een json- of arraysleutel?',
|
||||
'prompt_file' => 'In welk bestand wordt dit opgeslagen?',
|
||||
'prompt_key' => 'Wat is de sleutel voor deze vertaling?',
|
||||
'prompt_value' => 'Wat is de text voor deze vertaling',
|
||||
'type_error' => 'Het vertaaltype moet json of array zijn',
|
||||
'language_key_added' => 'Nieuwe taalcode toegevoegd 👏',
|
||||
'no_missing_keys' => 'Er zijn geen ontbrekende vertaalsleutels in de app 🎉',
|
||||
'keys_synced' => 'Ontbrekende toetsen gesynchroniseerd met succes 🎊',
|
||||
'search' => 'Doorzoek alle vertalingen',
|
||||
'translations' => 'Vertaling',
|
||||
'language_name' => 'Naam',
|
||||
'locale' => 'locale',
|
||||
'add' => '+ Toevoegen',
|
||||
'add_language' => 'Voeg een nieuwe taal toe',
|
||||
'save' => 'Opslaan',
|
||||
'language_exists' => 'Het kenmerk :attribute bestaat al.',
|
||||
'uh_oh' => 'Er klopt iets niet helemaal',
|
||||
'group_single' => 'Groep / Enkelvoudig',
|
||||
'group' => 'Groep',
|
||||
'single' => 'Enkelvoudig',
|
||||
'value' => 'Waarde',
|
||||
'namespace' => 'Namespace',
|
||||
'add_translation' => 'Voeg een vertaling toe',
|
||||
'translation_added' => 'Nieuwe vertaling succesvol toegevoegd 🙌',
|
||||
'namespace_label' => 'Namespace (optioneel)',
|
||||
'group_label' => 'Groep (optioneel)',
|
||||
'key_label' => 'Sleutel',
|
||||
'value_label' => 'Waarde',
|
||||
'namespace_placeholder' => 'bijv. Mijn_pakket',
|
||||
'group_placeholder' => 'bijv. bevestiging',
|
||||
'key_placeholder' => 'bijv. ongeldige sleutel',
|
||||
'value_placeholder' => 'bijv. Sleutels mogen geen spaties bevatten',
|
||||
'advanced_options' => 'Schakel geavanceerde opties in',
|
||||
];
|
||||
@@ -0,0 +1,3 @@
|
||||
<div class="search">
|
||||
<input type="text" class="search-input" placeholder="{{ __('translation::translation.search') }}" name="{{ $name }}" value="{{ $value }}">
|
||||
</div>
|
||||
@@ -0,0 +1,18 @@
|
||||
<div class="select-group">
|
||||
|
||||
<select name="{{ $name }}" @if(isset($submit) && $submit) v-on:change="submit" @endif>
|
||||
@if(isset($optional) && $optional)<option value> ----- </option>@endif
|
||||
@foreach($items as $key => $value)
|
||||
@if(is_numeric($key))
|
||||
<option value="{{ $value }}" @if(isset($selected) && $selected === $value) selected="selected" @endif>{{ $value }}</option>
|
||||
@else
|
||||
<option value="{{ $key }}" @if(isset($selected) && $selected === $key) selected="selected" @endif>{{ $value }}</option>
|
||||
@endif
|
||||
@endforeach
|
||||
</select>
|
||||
|
||||
<div class="caret">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M9.293 12.95l.707.707L15.657 8l-1.414-1.414L10 10.828 5.757 6.586 4.343 8z"/></svg>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -0,0 +1,18 @@
|
||||
<div class="input-group">
|
||||
<label for="{{ $field }}">
|
||||
{{ $label }}
|
||||
</label>
|
||||
<input
|
||||
class="@if($errors->has($field)) error @endif"
|
||||
name="{{ $field }}"
|
||||
id="{{ $field }}"
|
||||
type="text"
|
||||
placeholder="{{ isset($placeholder) ? $placeholder : '' }}"
|
||||
value="{{ old($field) }}"
|
||||
{{ isset($required) ? 'required' : '' }}>
|
||||
@if($errors->has($field))
|
||||
@foreach($errors->get($field) as $error)
|
||||
<p class="error-text">{!! $error !!}</p>
|
||||
@endforeach
|
||||
@endif
|
||||
</div>
|
||||
@@ -0,0 +1 @@
|
||||
<svg class="{{ isset($class) ? $class : 'fill-current w-4 h-4 mr-2' }}" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M10 20a10 10 0 1 1 0-20 10 10 0 0 1 0 20zm2-2.25a8 8 0 0 0 4-2.46V9a2 2 0 0 1-2-2V3.07a7.95 7.95 0 0 0-3-1V3a2 2 0 0 1-2 2v1a2 2 0 0 1-2 2v2h3a2 2 0 0 1 2 2v5.75zm-4 0V15a2 2 0 0 1-2-2v-1h-.5A1.5 1.5 0 0 1 4 10.5V8H2.25A8.01 8.01 0 0 0 8 17.75z"/></svg>
|
||||
|
After Width: | Height: | Size: 389 B |
@@ -0,0 +1 @@
|
||||
<svg class="{{ isset($class) ? $class : 'fill-current w-4 h-4 mr-2' }}" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M7.41 9l2.24 2.24-.83 2L6 10.4l-3.3 3.3-1.4-1.42L4.58 9l-.88-.88c-.53-.53-1-1.3-1.3-2.12h2.2c.15.28.33.53.51.7l.89.9.88-.88C7.48 6.1 8 4.84 8 4H0V2h5V0h2v2h5v2h-2c0 1.37-.74 3.15-1.7 4.12L7.4 9zm3.84 8L10 20H8l5-12h2l5 12h-2l-1.25-3h-5.5zm.83-2h3.84L14 10.4 12.08 15z"/></svg>
|
||||
|
After Width: | Height: | Size: 412 B |
@@ -0,0 +1,41 @@
|
||||
@extends('translation::layout')
|
||||
|
||||
@section('body')
|
||||
|
||||
<div class="panel w-1/2">
|
||||
|
||||
<div class="panel-header">
|
||||
|
||||
{{ __('translation::translation.add_language') }}
|
||||
|
||||
</div>
|
||||
|
||||
<form action="{{ route('languages.store') }}" method="POST">
|
||||
|
||||
<fieldset>
|
||||
|
||||
<input type="hidden" name="_token" value="{{ csrf_token() }}">
|
||||
|
||||
<div class="panel-body p-4">
|
||||
|
||||
@include('translation::forms.text', ['field' => 'name', 'label' => __('translation::translation.language_name'), ])
|
||||
|
||||
@include('translation::forms.text', ['field' => 'locale', 'label' => __('translation::translation.locale'), ])
|
||||
|
||||
</div>
|
||||
|
||||
</fieldset>
|
||||
|
||||
<div class="panel-footer flex flex-row-reverse">
|
||||
|
||||
<button class="button button-blue">
|
||||
{{ __('translation::translation.save') }}
|
||||
</button>
|
||||
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
||||
@endsection
|
||||
@@ -0,0 +1,56 @@
|
||||
@extends('translation::layout')
|
||||
|
||||
@section('body')
|
||||
|
||||
@if(count($languages))
|
||||
|
||||
<div class="panel w-1/2">
|
||||
|
||||
<div class="panel-header">
|
||||
|
||||
{{ __('translation::translation.languages') }}
|
||||
|
||||
<div class="flex flex-grow justify-end items-center">
|
||||
|
||||
<a href="{{ route('languages.create') }}" class="button">
|
||||
{{ __('translation::translation.add') }}
|
||||
</a>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="panel-body">
|
||||
|
||||
<table>
|
||||
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{ __('translation::translation.language_name') }}</th>
|
||||
<th>{{ __('translation::translation.locale') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
@foreach($languages as $language => $name)
|
||||
<tr>
|
||||
<td>
|
||||
{{ $name }}
|
||||
</td>
|
||||
<td>
|
||||
<a href="{{ route('languages.translations.index', $language) }}">
|
||||
{{ $language }}
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
@endif
|
||||
|
||||
@endsection
|
||||
@@ -0,0 +1,56 @@
|
||||
@extends('translation::layout')
|
||||
|
||||
@section('body')
|
||||
|
||||
<div class="panel w-1/2">
|
||||
|
||||
<div class="panel-header">
|
||||
|
||||
{{ __('translation::translation.add_translation') }}
|
||||
|
||||
</div>
|
||||
|
||||
<form action="{{ route('languages.translations.store', $language) }}" method="POST">
|
||||
|
||||
<fieldset>
|
||||
|
||||
<input type="hidden" name="_token" value="{{ csrf_token() }}">
|
||||
|
||||
<div class="panel-body p-4">
|
||||
|
||||
@include('translation::forms.text', ['field' => 'group', 'label' => __('translation::translation.group_label'), 'placeholder' => __('translation::translation.group_placeholder')])
|
||||
|
||||
@include('translation::forms.text', ['field' => 'key', 'label' => __('translation::translation.key_label'), 'placeholder' => __('translation::translation.key_placeholder')])
|
||||
|
||||
@include('translation::forms.text', ['field' => 'value', 'label' => __('translation::translation.value_label'), 'placeholder' => __('translation::translation.value_placeholder')])
|
||||
|
||||
<div class="input-group">
|
||||
|
||||
<button v-on:click="toggleAdvancedOptions" class="text-blue">{{ __('translation::translation.advanced_options') }}</button>
|
||||
|
||||
</div>
|
||||
|
||||
<div v-show="showAdvancedOptions">
|
||||
|
||||
@include('translation::forms.text', ['field' => 'namespace', 'label' => __('translation::translation.namespace_label'), 'placeholder' => __('translation::translation.namespace_placeholder')])
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</fieldset>
|
||||
|
||||
<div class="panel-footer flex flex-row-reverse">
|
||||
|
||||
<button class="button button-blue">
|
||||
{{ __('translation::translation.save') }}
|
||||
</button>
|
||||
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
||||
@endsection
|
||||
@@ -0,0 +1,89 @@
|
||||
@extends('translation::layout')
|
||||
|
||||
@section('body')
|
||||
|
||||
<form action="{{ route('languages.translations.index', ['language' => $language]) }}" method="get">
|
||||
|
||||
<div class="panel">
|
||||
|
||||
<div class="panel-header">
|
||||
|
||||
{{ __('translation::translation.translations') }}
|
||||
|
||||
<div class="flex flex-grow justify-end items-center">
|
||||
|
||||
@include('translation::forms.search', ['name' => 'filter', 'value' => Request::get('filter')])
|
||||
|
||||
@include('translation::forms.select', ['name' => 'language', 'items' => $languages, 'submit' => true, 'selected' => $language])
|
||||
|
||||
<div class="sm:hidden lg:flex items-center">
|
||||
|
||||
@include('translation::forms.select', ['name' => 'group', 'items' => $groups, 'submit' => true, 'selected' => Request::get('group'), 'optional' => true])
|
||||
|
||||
<a href="{{ route('languages.translations.create', $language) }}" class="button">
|
||||
{{ __('translation::translation.add') }}
|
||||
</a>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="panel-body">
|
||||
|
||||
@if(count($translations))
|
||||
|
||||
<table>
|
||||
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="w-1/5 uppercase font-thin">{{ __('translation::translation.group_single') }}</th>
|
||||
<th class="w-1/5 uppercase font-thin">{{ __('translation::translation.key') }}</th>
|
||||
<th class="uppercase font-thin">{{ config('app.locale') }}</th>
|
||||
<th class="uppercase font-thin">{{ $language }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
@foreach($translations as $type => $items)
|
||||
|
||||
@foreach($items as $group => $translations)
|
||||
|
||||
@foreach($translations as $key => $value)
|
||||
|
||||
@if(!is_array($value[config('app.locale')]))
|
||||
<tr>
|
||||
<td>{{ $group }}</td>
|
||||
<td>{{ $key }}</td>
|
||||
<td>{{ $value[config('app.locale')] }}</td>
|
||||
<td>
|
||||
<translation-input
|
||||
initial-translation="{{ $value[$language] }}"
|
||||
language="{{ $language }}"
|
||||
group="{{ $group }}"
|
||||
translation-key="{{ $key }}"
|
||||
route="{{ config('translation.ui_url') }}">
|
||||
</translation-input>
|
||||
</td>
|
||||
</tr>
|
||||
@endif
|
||||
|
||||
@endforeach
|
||||
|
||||
@endforeach
|
||||
|
||||
@endforeach
|
||||
</tbody>
|
||||
|
||||
</table>
|
||||
|
||||
@endif
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
@endsection
|
||||
24
support/laravel-translation/resources/views/layout.blade.php
Normal file
24
support/laravel-translation/resources/views/layout.blade.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||||
<title>{{ config('app.name') }}</title>
|
||||
<link rel="stylesheet" href="{{ asset('/vendor/translation/css/main.css') }}">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="app">
|
||||
|
||||
@include('translation::nav')
|
||||
@include('translation::notifications')
|
||||
|
||||
@yield('body')
|
||||
|
||||
</div>
|
||||
|
||||
<script src="{{ asset('/vendor/translation/js/app.js') }}"></script>
|
||||
</body>
|
||||
</html>
|
||||
20
support/laravel-translation/resources/views/nav.blade.php
Normal file
20
support/laravel-translation/resources/views/nav.blade.php
Normal file
@@ -0,0 +1,20 @@
|
||||
<nav class="header">
|
||||
|
||||
<h1 class="text-lg px-6">{{ config('app.name') }}</h1>
|
||||
|
||||
<ul class="flex-grow justify-end pr-2">
|
||||
<li>
|
||||
<a href="{{ route('languages.index') }}" class="{{ set_active('') }}{{ set_active('/create') }}">
|
||||
@include('translation::icons.globe')
|
||||
{{ __('translation::translation.languages') }}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{{ route('languages.translations.index', config('app.locale')) }}" class="{{ set_active('*/translations') }}">
|
||||
@include('translation::icons.translate')
|
||||
{{ __('translation::translation.translations') }}
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</nav>
|
||||
@@ -0,0 +1,15 @@
|
||||
@if(Session::has('success'))
|
||||
<div class="bg-green-lightest text-green-darker p-6 shadow-md" role="alert">
|
||||
<div class="flex justify-center">
|
||||
<p>{{ Session::get('success') }}</p>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if(Session::has('error'))
|
||||
<div class="bg-red-lightest text-red-darker p-6 shadow-md" role="alert">
|
||||
<div class="flex justify-center">
|
||||
<p>{!! Session::get('error') !!}</p>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
Reference in New Issue
Block a user