create Createlanguage popup, changes in LanguageController

This commit is contained in:
Milos Holba
2021-03-08 12:55:17 +01:00
parent 1536af7a5b
commit 33fa77cd73
12 changed files with 1916 additions and 777 deletions

View File

@@ -15,6 +15,7 @@ use App\Services\StripeService;
use App\Setting;
use App\User;
use App\UserSettings;
use App\Language;
use Artisan;
use Cartalyst\Stripe\Exception\UnauthorizedException;
use Doctrine\DBAL\Driver\PDOException;
@@ -477,6 +478,29 @@ class SetupWizardController extends Controller
Page::updateOrCreate($page);
});
// Create languages & strings
$language = Language::updateOrCreate([
'name' => 'English',
'locale' => 'en'
]);
$license = get_setting('license') === 'Extended' ? 'extended' : 'regular';
$language_strings = collect(config('language_strings.' . $license));
$strings = $language_strings->map(function ($value , $key) use($language) {
return [
'language_id' => $language->id,
'key' => $key,
'lang' => $language->locale,
'value' => $value
];
})->toArray();
DB::table('language_strings')->insert($strings);
// Retrieve access token
$response = Route::dispatch(self::make_login_request($request));

View File

@@ -2,22 +2,24 @@
namespace App\Http\Controllers\Language;
use App\Http\Requests\Languages\UpdateLanguageRequest;
use App\Http\Requests\Languages\UpdateStringRequest;
use App\Http\Requests\Languages\CreateLanguageRequest;
use App\Language;
use App\LanguageString;
use App\Http\Tools\Demo;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
use App\Http\Requests\Languages\UpdateStringRequest;
use App\Http\Requests\Languages\CreateLanguageRequest;
use App\Http\Requests\Languages\UpdateLanguageRequest;
class LanguageController extends Controller
{
/**
* Get all languages
*
*
* @return string
*/
public function get_languages ()
@@ -28,12 +30,23 @@ class LanguageController extends Controller
/**
* Get all language strings
*
* @param $language
* @param Language $language
* @return string
*/
public function get_language_strings($locale)
public function get_language_strings(Language $language)
{
return Language::where('locale', $locale)->with('languageStrings')->first();
// $lang = Language::whereId($language->id);
$strings = $language->with('languageStrings')->first();
// dd($strings);
$license = get_setting('license') === 'Extended' ? 'extended' : 'regular';
$default_strings = collect(config('language_strings.' . $license));
return collect(['translated_strings' => $strings, 'default_strings' => $default_strings]);
}
/**
@@ -49,7 +62,7 @@ class LanguageController extends Controller
return Demo::response_204();
}
// Create new language
// Create languages & strings
$language = Language::create([
'name' => $request->name,
'locale' => $request->locale
@@ -63,18 +76,15 @@ class LanguageController extends Controller
* Update language
*
* @param UpdateLanguageRequest $request
* @param $id
* @param Language $language
* @return $language
*/
public function update_language(UpdateLanguageRequest $request, $id)
public function update_language(UpdateLanguageRequest $request, Language $language)
{
// Check if is demo
if (env('APP_DEMO')) {
return Demo::response_204();
}
// Get language
$language = Language::findOrFail($id);
// Update language
$language->update(make_single_input($request));
@@ -87,30 +97,41 @@ class LanguageController extends Controller
* Update strings for language
*
* @param UpdateStringRequest $request
* @param Language $language
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function update_string(UpdateStringRequest $request)
public function update_string(UpdateStringRequest $request,Language $language)
{
// Check if is demo
if (env('APP_DEMO')) {
return Demo::response_204();
}
// Get language
$lang = Language::where('locale', $request->input('locale'))->first();
foreach($request->input('language') as $language)
{
// If key with lang already exist update, if no crate
LanguageString::updateOrCreate([
'language_id' => $lang->id,
'key' => $language['key'],
'lang' => $lang->locale,
],[
'value' => $language['value']
LanguageString::whereLanguageIdAndKey($language->id, $request->name)
->update([
'language_id' => $language->id,
'key' => $request->name,
'lang' => $language->locale,
'value' => $request->value
]);
return response('Done', 204);
}
/**
* Delete the language with all children strings
*
* @param Language $language
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function delete_language(Language $language)
{
// Check if is demo
if (env('APP_DEMO')) {
return Demo::response_204();
}
$language->delete();
return response('Done', 204);
}

View File

@@ -24,10 +24,8 @@ class UpdateStringRequest extends FormRequest
public function rules()
{
return [
'locale' => 'required|string',
'language' => 'required|array',
'language.*.key' => 'required|string',
'language.*.value' => 'required|string'
'name' => 'required|string',
'value' => 'required|string'
];
}
}

View File

@@ -4,6 +4,7 @@ namespace App;
use App\LanguageString;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\DB;
use Illuminate\Database\Eloquent\Model;
class Language extends Model
@@ -13,14 +14,44 @@ class Language extends Model
protected $keyType = 'string';
protected $primaryKey = 'id';
public $incrementing = false ;
public $timestamps = false;
protected static function booted()
protected static function boot()
{
static::creating(function($model) {
$model->id = Str::uuid();
parent::boot();
static::creating(function ($language) {
$language->id = Str::uuid();
});
static::deleting(function ($language) {
$language->languageStrings()->delete();
});
static::created(function ($language) {
$license = get_setting('license') === 'Extended' ? 'extended' : 'regular';
$language_strings = collect(config('language_strings.' . $license));
$strings = $language_strings->map(function ($value , $key) use($language) {
return [
'language_id' => $language->id,
'key' => $key,
'lang' => $language->locale,
'value' => $value
];
})->toArray();
DB::table('language_strings')->insert($strings);
});
}

File diff suppressed because it is too large Load Diff

View File

@@ -13,7 +13,7 @@
"/chunks/app-billings.js": "/chunks/app-billings.js?id=aac5bd51067578358164",
"/chunks/app-email.js": "/chunks/app-email.js?id=9d1631b19f6492b8cae4",
"/chunks/app-index.js": "/chunks/app-index.js?id=2dcbe307133d780b6472",
"/chunks/app-language.js": "/chunks/app-language.js?id=6a19e4970a78281f045f",
"/chunks/app-language.js": "/chunks/app-language.js?id=9203f328c3fc4f8bf0f4",
"/chunks/app-others.js": "/chunks/app-others.js?id=44efcfb317747ff3b508",
"/chunks/app-payments.js": "/chunks/app-payments.js?id=187ecc16f9f7fbc4ccac",
"/chunks/app-settings.js": "/chunks/app-settings.js?id=b6b0eba13665133c0a19",
@@ -75,5 +75,16 @@
"/chunks/user-password.js": "/chunks/user-password.js?id=ac51d17a4aa7ae50bc88",
"/chunks/user-storage.js": "/chunks/user-storage.js?id=5cfec8a8f8a8aef24ef2",
"/chunks/user-subscription.js": "/chunks/user-subscription.js?id=10b3a108059d62d206c8",
"/chunks/users.js": "/chunks/users.js?id=6e68cb068f69fba3199c"
"/chunks/users.js": "/chunks/users.js?id=6e68cb068f69fba3199c",
"/chunks/app-language.75a8d0f493b84cc978b0.hot-update.js": "/chunks/app-language.75a8d0f493b84cc978b0.hot-update.js",
"/chunks/app-language.11f2328701d7d1eca870.hot-update.js": "/chunks/app-language.11f2328701d7d1eca870.hot-update.js",
"/chunks/app-language.777221bd2497f08011d9.hot-update.js": "/chunks/app-language.777221bd2497f08011d9.hot-update.js",
"/chunks/app-language.bc81b9e7ca698d87c551.hot-update.js": "/chunks/app-language.bc81b9e7ca698d87c551.hot-update.js",
"/chunks/app-language.a4ed495733086633616b.hot-update.js": "/chunks/app-language.a4ed495733086633616b.hot-update.js",
"/chunks/app-language.621d2d3bfd5b566ca6fd.hot-update.js": "/chunks/app-language.621d2d3bfd5b566ca6fd.hot-update.js",
"/chunks/app-language.d798bdfce2bf9e140bac.hot-update.js": "/chunks/app-language.d798bdfce2bf9e140bac.hot-update.js",
"/chunks/app-language.24a27e086d82daca8ee6.hot-update.js": "/chunks/app-language.24a27e086d82daca8ee6.hot-update.js",
"/chunks/app-language.51bb5abc36798fbf4971.hot-update.js": "/chunks/app-language.51bb5abc36798fbf4971.hot-update.js",
"/chunks/app-language.c1e9e509fd5d55e2364a.hot-update.js": "/chunks/app-language.c1e9e509fd5d55e2364a.hot-update.js",
"/chunks/app-language.089db7aa0e313057463e.hot-update.js": "/chunks/app-language.089db7aa0e313057463e.hot-update.js"
}

View File

@@ -28,6 +28,9 @@
<!--Create folder in mobile version-->
<CreateFolder/>
<!-- Create language popup -->
<CreateLanguage/>
<!--Move item setup-->
<MoveItem/>
@@ -71,6 +74,7 @@ import ProcessingPopup from '@/components/FilesView/ProcessingPopup'
import FileFullPreview from '@/components/FilesView/FileFullPreview'
import MobileNavigation from '@/components/Others/MobileNavigation'
import CookieDisclaimer from '@/components/Others/CookieDisclaimer'
import CreateLanguage from '@/components/Others/CreateLanguage'
import CreateFolder from '@/components/Others/CreateFolder'
import MobileMenu from '@/components/FilesView/MobileMenu'
import ShareCreate from '@/components/Others/ShareCreate'
@@ -95,6 +99,7 @@ export default {
CookieDisclaimer,
FileFullPreview,
ProcessingPopup,
CreateLanguage,
ToastrWrapper,
CreateFolder,
ShareCreate,

View File

@@ -0,0 +1,867 @@
<template>
<PopupWrapper name="create-language">
<!--Title-->
<PopupHeader :title="'Create Language'" icon="edit" />
<!--Content-->
<PopupContent>
<!--Form to set sharing-->
<ValidationObserver @submit.prevent="createFolder" ref="createForm" v-slot="{ invalid }" tag="form" class="form-wrapper">
<!--Set password-->
<ValidationProvider tag="div" mode="passive" class="input-wrapper password" name="Language Name" rules="required" v-slot="{ errors }">
<label class="input-label">Type Name:</label>
<input v-model="name" :class="{'is-error': errors[0]}" type="text" ref="input" placeholder="Type Language Name">
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
<!--Set password-->
<ValidationProvider tag="div" mode="passive" class="input-wrapper password" name="Language Locale" rules="required" v-slot="{ errors }">
<label class="input-label">Select Locale:</label>
<SelectInput v-model="locale" :options="allLocals" placeholder="Select Language Locale" :isError="errors[0]"/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</ValidationObserver>
</PopupContent>
<!--Actions-->
<PopupActions>
<ButtonBase
class="popup-button"
@click.native="$closePopup()"
button-style="secondary"
>Cancel
</ButtonBase>
<ButtonBase
class="popup-button"
@click.native="createLanguage"
button-style="theme"
:loading="isLoading"
:disabled="isLoading"
>Create Language
</ButtonBase>
</PopupActions>
</PopupWrapper>
</template>
<script>
import {ValidationProvider, ValidationObserver} from 'vee-validate/dist/vee-validate.full'
import PopupWrapper from '@/components/Others/Popup/PopupWrapper'
import PopupActions from '@/components/Others/Popup/PopupActions'
import PopupContent from '@/components/Others/Popup/PopupContent'
import PopupHeader from '@/components/Others/Popup/PopupHeader'
import SelectInput from '@/components/Others/Forms/SelectInput'
import ButtonBase from '@/components/FilesView/ButtonBase'
import {required} from 'vee-validate/dist/rules'
import {events} from '@/bus'
import axios from 'axios'
export default {
name: 'CreateLanguage',
components: {
ValidationProvider,
ValidationObserver,
PopupWrapper,
PopupActions,
PopupContent,
PopupHeader,
SelectInput,
ButtonBase,
required,
},
data() {
return {
name: undefined,
locale: undefined,
isLoading: false,
allLocals: [
{
value: "ab",
label: "Abkhaz"
},
{
value: "aa",
label: "Afar"
},
{
value: "af",
label: "Afrikaans"
},
{
value: "ak",
label: "Akan"
},
{
value: "sq",
label: "Albanian"
},
{
value: "am",
label: "Amharic"
},
{
value: "ar",
label: "Arabic"
},
{
value: "an",
label: "Aragonese"
},
{
value: "hy",
label: "Armenian"
},
{
value: "as",
label: "Assamese"
},
{
value: "av",
label: "Avaric"
},
{
value: "ae",
label: "Avestan"
},
{
value: "ay",
label: "Aymara"
},
{
value: "az",
label: "Azerbaijani"
},
{
value: "bm",
label: "Bambara"
},
{
value: "ba",
label: "Bashkir"
},
{
value: "eu",
label: "Basque"
},
{
value: "be",
label: "Belarusian"
},
{
value: "bn",
label: "Bengali; Bangla"
},
{
value: "bh",
label: "Bihari"
},
{
value: "bi",
label: "Bislama"
},
{
value: "bs",
label: "Bosnian"
},
{
value: "br",
label: "Breton"
},
{
value: "bg",
label: "Bulgarian"
},
{
value: "my",
label: "Burmese"
},
{
value: "ca",
label: "Catalan; Valencian"
},
{
value: "ch",
label: "Chamorro"
},
{
value: "ce",
label: "Chechen"
},
{
value: "ny",
label: "Chichewa; Chewa; Nyanja"
},
{
value: "zh",
label: "Chinese"
},
{
value: "cv",
label: "Chuvash"
},
{
value: "kw",
label: "Cornish"
},
{
value: "co",
label: "Corsican"
},
{
value: "cr",
label: "Cree"
},
{
value: "hr",
label: "Croatian"
},
{
value: "cs",
label: "Czech"
},
{
value: "da",
label: "Danish"
},
{
value: "dv",
label: "Divehi; Dhivehi; Maldivian;"
},
{
value: "nl",
label: "Dutch"
},
{
value: "dz",
label: "Dzongkha"
},
{
value: "en",
label: "English"
},
{
value: "eo",
label: "Esperanto"
},
{
value: "et",
label: "Estonian"
},
{
value: "ee",
label: "Ewe"
},
{
value: "fo",
label: "Faroese"
},
{
value: "fj",
label: "Fijian"
},
{
value: "fi",
label: "Finnish"
},
{
value: "fr",
label: "French"
},
{
value: "ff",
label: "Fula; Fulah; Pulaar; Pular"
},
{
value: "gl",
label: "Galician"
},
{
value: "lg",
label: "Ganda"
},
{
value: "ka",
label: "Georgian"
},
{
value: "de",
label: "German"
},
{
value: "el",
label: "Greek, Modern"
},
{
value: "gn",
label: "Guaraní"
},
{
value: "gu",
label: "Gujarati"
},
{
value: "ht",
label: "Haitian; Haitian Creole"
},
{
value: "ha",
label: "Hausa"
},
{
value: "he",
label: "Hebrew (modern)"
},
{
value: "hz",
label: "Herero"
},
{
value: "hi",
label: "Hindi"
},
{
value: "ho",
label: "Hiri Motu"
},
{
value: "hu",
label: "Hungarian"
},
{
value: "ia",
label: "Interlingua"
},
{
value: "id",
label: "Indonesian"
},
{
value: "ie",
label: "Interlingue"
},
{
value: "ga",
label: "Irish"
},
{
value: "ig",
label: "Igbo"
},
{
value: "ik",
label: "Inupiaq"
},
{
value: "io",
label: "Ido"
},
{
value: "is",
label: "Icelandic"
},
{
value: "it",
label: "Italian"
},
{
value: "iu",
label: "Inuktitut"
},
{
value: "ja",
label: "Japanese"
},
{
value: "jv",
label: "Javanese"
},
{
value: "kl",
label: "Kalaallisut, Greenlandic"
},
{
value: "kn",
label: "Kannada"
},
{
value: "kr",
label: "Kanuri"
},
{
value: "ks",
label: "Kashmiri"
},
{
value: "kk",
label: "Kazakh"
},
{
value: "km",
label: "Khmer"
},
{
value: "ki",
label: "Kikuyu, Gikuyu"
},
{
value: "rw",
label: "Kinyarwanda"
},
{
value: "rn",
label: "Kirundi"
},
{
value: "ky",
label: "Kyrgyz"
},
{
value: "kv",
label: "Komi"
},
{
value: "kg",
label: "Kongo"
},
{
value: "ko",
label: "Korean"
},
{
value: "ku",
label: "Kurdish"
},
{
value: "kj",
label: "Kwanyama, Kuanyama"
},
{
value: "la",
label: "Latin"
},
{
value: "lb",
label: "Luxembourgish, Letzeburgesch"
},
{
value: "li",
label: "Limburgish, Limburgan, Limburger"
},
{
value: "ln",
label: "Lingala"
},
{
value: "lo",
label: "Lao"
},
{
value: "lt",
label: "Lithuanian"
},
{
value: "lu",
label: "Luba-Katanga"
},
{
value: "lv",
label: "Latvian"
},
{
value: "gv",
label: "Manx"
},
{
value: "mk",
label: "Macedonian"
},
{
value: "mg",
label: "Malagasy"
},
{
value: "ms",
label: "Malay"
},
{
value: "ml",
label: "Malayalam"
},
{
value: "mt",
label: "Maltese"
},
{
value: "mi",
label: "MÄori"
},
{
value: "mr",
label: "Marathi"
},
{
value: "mh",
label: "Marshallese"
},
{
value: "mn",
label: "Mongolian"
},
{
value: "na",
label: "Nauru"
},
{
value: "nv",
label: "Navajo, Navaho"
},
{
value: "nb",
label: "Norwegian"
},
{
value: "nd",
label: "North Ndebele"
},
{
value: "ne",
label: "Nepali"
},
{
value: "ng",
label: "Ndonga"
},
{
value: "nn",
label: "Norwegian Nynorsk"
},
{
value: "no",
label: "Norwegian"
},
{
value: "ii",
label: "Nuosu"
},
{
value: "oc",
label: "Occitan"
},
{
value: "oj",
label: "Ojibwe, Ojibwa"
},
{
value: "cu",
label: "Old Church Slavonic, Church Slavic, Church Slavonic, Old Bulgarian, Old Slavonic"
},
{
value: "om",
label: "Oromo"
},
{
value: "or",
label: "Oriya"
},
{
value: "os",
label: "Ossetian, Ossetic"
},
{
value: "pa",
label: "Panjabi, Punjabi"
},
{
value: "pi",
label: "Pali"
},
{
value: "fa",
label: "Persian (Farsi)"
},
{
value: "pl",
label: "Polish"
},
{
value: "ps",
label: "Pashto, Pushto"
},
{
value: "pt",
label: "Portuguese"
},
{
value: "qu",
label: "Quechua"
},
{
value: "rm",
label: "Romansh"
},
{
value: "ro",
label: "Romanian"
},
{
value: "ru",
label: "Russian"
},
{
value: "sa",
label: "Sanskrit"
},
{
value: "sc",
label: "Sardinian"
},
{
value: "sd",
label: "Sindhi"
},
{
value: "se",
label: "Northern Sami"
},
{
value: "sm",
label: "Samoan"
},
{
value: "sg",
label: "Sango"
},
{
value: "sr",
label: "Serbian"
},
{
value: "gd",
label: "Scottish Gaelic"
},
{
value: "sn",
label: "Shona"
},
{
value: "si",
label: "Sinhala, Sinhalese"
},
{
value: "sk",
label: "Slovak"
},
{
value: "sl",
label: "Slovene"
},
{
value: "so",
label: "Somali"
},
{
value: "st",
label: "Southern Sotho"
},
{
value: "az",
label: "South Azerbaijani"
},
{
value: "nr",
label: "South Ndebele"
},
{
value: "es",
label: "Spanish; Castilian"
},
{
value: "su",
label: "Sundanese"
},
{
value: "sw",
label: "Swahili"
},
{
value: "ss",
label: "Swati"
},
{
value: "sv",
label: "Swedish"
},
{
value: "ta",
label: "Tamil"
},
{
value: "te",
label: "Telugu"
},
{
value: "tg",
label: "Tajik"
},
{
value: "th",
label: "Thai"
},
{
value: "ti",
label: "Tigrinya"
},
{
value: "bo",
label: "Tibetan Standard, Tibetan, Central"
},
{
value: "tk",
label: "Turkmen"
},
{
value: "tl",
label: "Tagalog"
},
{
value: "tn",
label: "Tswana"
},
{
value: "to",
label: "Tonga (Tonga Islands)"
},
{
value: "tr",
label: "Turkish"
},
{
value: "ts",
label: "Tsonga"
},
{
value: "tt",
label: "Tatar"
},
{
value: "tw",
label: "Twi"
},
{
value: "ty",
label: "Tahitian"
},
{
value: "ug",
label: "Uyghur, Uighur"
},
{
value: "uk",
label: "Ukrainian"
},
{
value: "ur",
label: "Urdu"
},
{
value: "uz",
label: "Uzbek"
},
{
value: "ve",
label: "Venda"
},
{
value: "vi",
label: "Vielabele"
},
{
value: "vo",
label: "Volapük"
},
{
value: "wa",
label: "Walloon"
},
{
value: "cy",
label: "Welsh"
},
{
value: "wo",
label: "Wolof"
},
{
value: "fy",
label: "Western Frisian"
},
{
value: "xh",
label: "Xhosa"
},
{
value: "yi",
label: "Yiddish"
},
{
value: "yo",
label: "Yoruba"
},
{
value: "za",
label: "Zhuang, Chuang"
},
{
value: "zu",
label: "Zulu"
}
]
}
},
methods: {
async createLanguage() {
// Validate fields
const isValid = await this.$refs.createForm.validate();
if (isValid) {
this.isLoading = true
axios.post('/api/languages', {
name: this.name,
locale: this.locale
})
.then((response) => {
events.$emit('add-language', response.data)
})
.catch(() => Vue.prototype.$isSomethingWrong())
.finally(() => {
this.name = undefined
this.locale = undefined
this.isLoading = false
this.$closePopup()
})
}
},
},
mounted () {
this.name = undefined,
this.locale = undefined
}
}
</script>
<style scoped lang="scss">
@import "@assets/vue-file-manager/_inapp-forms.scss";
@import '@assets/vue-file-manager/_forms';
.item-thumbnail {
margin-bottom: 20px;
}
</style>

View File

@@ -10,10 +10,6 @@ const defaultState = {
homeDirectory: undefined,
requestedPlan: undefined,
emojis: undefined,
languages: {
allLanguages: undefined,
strings: undefined,
},
sorting: {
sort: localStorage.getItem('sorting') ? JSON.parse(localStorage.getItem('sorting')).sort : 'DESC',
field: localStorage.getItem('sorting') ? JSON.parse(localStorage.getItem('sorting')).field : 'created_at',
@@ -970,7 +966,7 @@ const defaultState = {
value: "12.0",
label: "(GMT +12:00) Auckland, Wellington, Fiji, Kamchatka"
}
]
],
}
const actions = {
getEmojisList: ({commit}) => {
@@ -988,36 +984,6 @@ const actions = {
})
},
getLanguages: ({commit, state}) => {
return new Promise((resolve, reject) => {
axios
.get('/api/language/get')
.then((response) => {
commit('LOAD_LANGUAGES', response.data)
})
.catch(() => Vue.prototype.$isSomethingWrong())
.finally(() => {
resolve(true)
})
})
},
getLanguageStrings: ({ commit }, language) => {
return new Promise((resolve, reject) => {
axios
.get(`/api/language/${language.locale}/strings`)
.then(response => {
commit('LOAD_LANGUAGE_STRINGS', response.data)
})
.catch(() => Vue.prototype.$isSomethingWrong())
.finally(() => {
resolve(true)
})
})
},
changePreviewType: ({commit, state}, preview) => {
// Get preview type
@@ -1045,12 +1011,6 @@ const mutations = {
LOAD_EMOJIS_LIST(state, data) {
state.emojis = data
},
LOAD_LANGUAGE_STRINGS (state, data) {
state.languages.strings = data
},
LOAD_LANGUAGES(state, data) {
state.languages.allLanguages = data
},
UPDATE_SORTING(state) {
state.sorting.field = JSON.parse(localStorage.getItem('sorting')).field
state.sorting.sort = JSON.parse(localStorage.getItem('sorting')).sort
@@ -1092,8 +1052,7 @@ const getters = {
requestedPlan: state => state.requestedPlan,
currencyList: state => state.currencyList,
countries: state => state.countries,
timezones: state=> state.timezones,
languages: state => state.languages,
timezones: state => state.timezones,
api: state => state.config.api,
config: state => state.config,
emojis: state => state.emojis,

View File

@@ -9,17 +9,29 @@
<PageHeader :can-back="true" :title="$router.currentRoute.meta.title"/>
<div class="languages-wrapper">
<label class="language-label">Langueages</label>
<div class="language-label-wrapper">
<label class="language-label">Languages</label>
</div>
<div class="all-language-wrapper">
<div @click="getLanguageStrings(language)" class="language" :class="{'active' :active === language.name}" v-for="language in languages.allLanguages" :key="language.id">
{{language.name}}
<div @click="getLanguageStrings(language)" v-for="language in languages" :key="language.id">
<div class="language" >
<label class="name" :class="{'active' :active === language.locale}">{{language.name}}</label>
<x-icon v-if="language.locale !== 'en'" @click.stop="deleteLanguageConfirm(language)" class="icon" size="17"/>
</div>
</div>
</div>
</div>
<ButtonBase
@click.native="createLanguage"
class="button-add-language">
<plus-icon class="icon" size="14"/>
Add Language
</ButtonBase>
</div>
<Spinner v-if="! loadedStrings"/>
<LanguageStrings v-if="loadedStrings"/>
<LanguageStrings v-if="loadedStrings" :language-strings="languagesStrings" />
</div>
</div>
</div>
@@ -28,45 +40,103 @@
<script>
import LanguageStrings from '@/views/Admin/Languages/LanguageStrings'
import MobileHeader from '@/components/Mobile/MobileHeader'
import ButtonBase from '@/components/FilesView/ButtonBase'
import PageHeader from '@/components/Others/PageHeader'
import Spinner from '@/components/FilesView/Spinner'
import { mapGetters } from 'vuex'
import { PlusIcon, XIcon } from 'vue-feather-icons'
import { events } from '@/bus'
export default {
name: 'Language',
components: {
LanguageStrings,
MobileHeader,
ButtonBase,
PageHeader,
Spinner
},
computed: {
...mapGetters(['languages'])
PlusIcon,
Spinner,
XIcon
},
data () {
return {
active: undefined,
languages:undefined,
languagesStrings:undefined,
loadedLanguages: false,
loadedStrings:false
}
},
methods: {
getLanguageStrings (language) {
this.active = language.name
deleteLanguageConfirm(language) {
events.$emit('confirm:open', {
title: `Delete ${language.name} language?`,
message: 'Your language will be permanently deleted.',
buttonColor: 'danger-solid',
action: language
})
},
deleteLanguage(language) {
axios.delete(`/api/languages/${language.id}`)
.then(() => { this.getLanguages() })
},
createLanguage() {
events.$emit('popup:open', {name: 'create-language'})
},
getLanguages() {
this.loadedStrings = false
this.$store.dispatch('getLanguageStrings', language).then((loaded) => this.loadedStrings = loaded)
axios
.get('/api/languages')
.then((response) => {
this.languages = response.data
this.active = response.data[0].locale
})
.catch(() => Vue.prototype.$isSomethingWrong())
.finally(() => {
this.loadedLanguages = true
this.getLanguageStrings(this.languages[0])
})
},
getLanguageStrings (language) {
this.active = language.locale
this.loadedStrings = false
axios
.get(`/api/languages/${language.id}/strings`)
.then(response => {
this.languagesStrings = response.data
})
.catch(() => Vue.prototype.$isSomethingWrong())
.finally(() => {
this.loadedStrings = true
})
}
},
mounted () {
this.$store.dispatch('getLanguages').then((loaded) => {
this.getLanguages()
this.loadedLanguages = loaded
this.getLanguageStrings(this.languages.allLanguages[0])
events.$on('add-language', () => {
this.getLanguages()
})
}
events.$on('action:confirmed', language => {
this.deleteLanguage(language)
})
events.$on('language-name:update', (language) => {
let index = _.findIndex(this.languages, function(item) { return item.id === language.id })
this.languages[index].name = language.name
})
},
destroyed () {
events.$off('action:confirmed')
},
}
</script>
@@ -74,33 +144,99 @@ export default {
@import '@assets/vue-file-manager/_variables';
@import '@assets/vue-file-manager/_mixins';
#single-page {
height: 100%;
#page-content {
height: 100%;
}
}
.wrapper {
display: flex;
height: 100%;
}
.side-content{
width: 225px;
flex: 0 0 225px;
.button-add-language {
margin-top: 30px;
/deep/.content {
display: flex;
align-items: center;
@include font-size(14);
font-weight: 700;
.icon {
margin-right: 10px;
}
}
}
.languages-wrapper {
margin-top: 70px;
.language-label {
color: $text-muted;
font-weight: 700;
@include font-size(12);
.language-label-wrapper {
margin-bottom: 5px;
.language-label {
color: $text-muted;
font-weight: 700;
@include font-size(12);
margin-top: 20px;
}
}
.all-language-wrapper {
.language {
color: $text;
font-weight: 700;
@include font-size(13);
margin-top: 20px;
}
.active {
color: $theme;
display: flex;
align-items: center;
padding: 12px 25px 12px 0px;
cursor: pointer;
&:hover {
.icon {
display: block;
}
.name {
color: $theme;
}
}
.name {
color: $text;
font-weight: 700;
@include font-size(13);
}
.icon {
display: none;
margin-left: auto;
cursor: pointer;
}
.active {
color: $theme !important;
}
}
}
}
}
@media only screen and (max-width: 1024px) {
.side-content {
flex: 0 0 205px;
}
}
@media only screen and (max-width: 690px) {
.side-content {
display: none;
}
}
</style>

View File

@@ -1,5 +1,5 @@
<template>
<div class="language-strings-wrapper">
<div v-if="strings" class="language-strings-wrapper">
<div class="search-bar-wrapper">
<div class="search-bar">
<div class="icon" >
@@ -9,7 +9,8 @@
<x-icon class="pointer" size="19"></x-icon>
</div> -->
<input
v-model="searchInput"
@input="searchStrings"
class="query"
type="text"
name="query"
@@ -18,57 +19,50 @@
</div>
</div>
<div class="form block-form">
<div>
<FormLabel class="mt-70" icon="settings">Language Settings</FormLabel>
<div class="block-wrapper">
<div class="input-wrapper">
<div class="inline-wrapper">
<div class="switch-label">
<label class="input-label">
Set as Default Language:
</label>
</div>
<SwitchInput
class="switch"
/>
<FormLabel class="mt-70" icon="settings">Language Settings</FormLabel>
<div class="block-wrapper">
<div class="input-wrapper">
<div class="inline-wrapper">
<div class="switch-label">
<label class="input-label">
Set as Default Language:
</label>
</div>
<SwitchInput
class="switch"
/>
</div>
</div>
<div class="block-wrapper">
<label> Language Name:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="Language Name" rules="required" v-slot="{ errors }">
<input type="text"
:class="{'is-error': errors[0]}"
/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<div class="block-wrapper">
<label> Language Slug:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="Language Slug" rules="required" v-slot="{ errors }">
<input type="text"
:class="{'is-error': errors[0]}"
/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
</div>
<div>
<FormLabel class="mt-70">Language Strings</FormLabel>
<div class="block-wrapper" v-for="(string, index) in languages.strings.language_strings" :key="string.id">
<label> {{string.value}}:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="Language string" rules="required" v-slot="{ errors }">
<input type="text"
@input="updateString(string.value)"
v-model="languages.strings.language_strings[index].value"
:class="{'is-error': errors[0]}"
/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
<div v-if="language.name" class="block-wrapper">
<label> Language Name:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="Language Name" rules="required" v-slot="{ errors }">
<input type="text"
v-model="language.name"
@input="updateName"
:class="{'is-error': errors[0]}"
/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<FormLabel class="mt-70">Language Strings</FormLabel>
<div class="block-wrapper">
<Spinner v-if="!loadedStrings"/>
<div v-if="loadedStrings" >
<div class="block-wrapper" v-for="(string,index) in filteredStrings" :key="index">
<label> {{string.value}}:</label>
<ValidationProvider tag="div" class="input-wrapper" name="Language string" rules="required" v-slot="{ errors }">
<input type="text"
:class="{'is-error': errors[0]}"
@input="updateString(string.key)"
v-model="strings[getIndex(string.key)].value"
/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
</div>
</div>
</div>
@@ -81,24 +75,88 @@ import { ValidationProvider, ValidationObserver } from 'vee-validate/dist/vee-va
import SwitchInput from '@/components/Others/Forms/SwitchInput'
import FormLabel from '@/components/Others/Forms/FormLabel'
import { SearchIcon, XIcon } from 'vue-feather-icons'
import { mapGetters } from 'vuex'
import Spinner from '@/components/FilesView/Spinner'
import { events } from '@/bus'
import lodash from 'lodash'
export default {
name: 'LanguageStrings',
props: [ 'languageStrings' ],
components: {
ValidationProvider,
ValidationObserver,
SwitchInput,
FormLabel,
SearchIcon,
FormLabel,
Spinner,
XIcon,
},
computed: {
...mapGetters(['languages'])
data () {
return {
defaultStrings: [],
filteredStrings: [],
loadedStrings: false,
strings: undefined,
language: undefined,
searchInput: '',
}
},
methods: {
updateString (value) {
console.log(value)
getIndex(key){
if(this.strings)
return _.findIndex(this.strings, function(string) { return string.key === key })
},
updateName() {
this.$updateText(`/languages/${this.language.id}`, 'name', this.language.name)
events.$emit('language-name:update', this.language)
},
updateString (key) {
if(! this.strings[this.getIndex(key)].value) return
this.$updateText(
`/languages/${this.languageStrings.translated_strings.id}/string`, `${key}`, this.strings[this.getIndex(key)].value,
)
},
searchStrings() {
this.loadedStrings = false
this.filteredStrings = []
this.filterStrings()
},
filterStrings: _.debounce(function () {
this.filteredStrings = this.defaultStrings.filter(string => string.value.toLowerCase().includes( this.searchInput.toLowerCase() ))
this.loadedStrings = true
}, 200)
},
mounted () {
if(this.languageStrings.translated_strings) {
this.strings = this.languageStrings.translated_strings.language_strings
// Make from JSON object array of objects
for (const [key, value] of Object.entries(this.languageStrings.default_strings)) {
this.defaultStrings.push({
'key': key,
'value': value,
})
}
this.filterStrings()
this.language = {
'id': this.languageStrings.translated_strings.id,
'name': this.languageStrings.translated_strings.name
}
}
}
}
@@ -113,8 +171,15 @@ export default {
.language-strings-wrapper {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
flex-direction: column;
.block-form{
min-width: 100%;
overflow-y: scroll;
overflow-x: hidden;
}
}
.search-bar-wrapper {

View File

@@ -171,12 +171,17 @@ Route::group(['middleware' => ['auth:api', 'auth.master', 'auth.admin', 'scope:m
Route::get('/settings', 'SettingController@show');
Route::get('/flush-cache', 'AppFunctionsController@flush_cache');
Route::group(['prefix' => 'languages'], function () {
Route::get('/{language}/strings', 'Language\LanguageController@get_language_strings');
Route::patch('/{language}/string', 'Language\LanguageController@update_string');
Route::delete('/{language}', 'Language\LanguageController@delete_language');
Route::patch('/{language}', 'Language\LanguageController@update_language');
Route::post('/', 'Language\LanguageController@create_language');
Route::get('/', 'Language\LanguageController@get_languages');
});
// Language
Route::post('/language/create', 'Language\LanguageController@create_language');
Route::patch('/language/{id}/update', 'Language\LanguageController@update_language');
Route::patch('/language/update-string', 'Language\LanguageController@update_string');
Route::get('/language/get', 'Language\LanguageController@get_languages');
Route::get('/language/{locale}/strings', 'Language\LanguageController@get_language_strings');
});
// Protected sharing routes for authenticated user