Merge branch 'master' of https://github.com/bagisto/bagisto into development
This commit is contained in:
commit
15592aa8b1
|
|
@ -25,8 +25,9 @@
|
|||
"vue-template-compiler": "^2.6.11"
|
||||
},
|
||||
"dependencies": {
|
||||
"opencollective": "^1.0.3",
|
||||
"opencollective-postinstall": "^2.0.1",
|
||||
"opencollective": "^1.0.3"
|
||||
"vee-validate": "^3.3.0"
|
||||
},
|
||||
"collective": {
|
||||
"type": "opencollective",
|
||||
|
|
|
|||
|
|
@ -206,10 +206,68 @@ return [
|
|||
'channel_based' => true,
|
||||
],
|
||||
],
|
||||
], [
|
||||
'key' => 'catalog.rich_snippets',
|
||||
'name' => 'admin::app.admin.system.rich-snippets',
|
||||
'sort' => 3,
|
||||
], [
|
||||
'key' => 'catalog.rich_snippets.products',
|
||||
'name' => 'admin::app.admin.system.products',
|
||||
'sort' => 1,
|
||||
'fields' => [
|
||||
[
|
||||
'name' => 'enable',
|
||||
'title' => 'admin::app.admin.system.enable',
|
||||
'type' => 'boolean',
|
||||
], [
|
||||
'name' => 'show_sku',
|
||||
'title' => 'admin::app.admin.system.show-sku',
|
||||
'type' => 'boolean',
|
||||
], [
|
||||
'name' => 'show_weight',
|
||||
'title' => 'admin::app.admin.system.show-weight',
|
||||
'type' => 'boolean',
|
||||
], [
|
||||
'name' => 'show_categories',
|
||||
'title' => 'admin::app.admin.system.show-categories',
|
||||
'type' => 'boolean',
|
||||
], [
|
||||
'name' => 'show_images',
|
||||
'title' => 'admin::app.admin.system.show-images',
|
||||
'type' => 'boolean',
|
||||
], [
|
||||
'name' => 'show_reviews',
|
||||
'title' => 'admin::app.admin.system.show-reviews',
|
||||
'type' => 'boolean',
|
||||
], [
|
||||
'name' => 'show_ratings',
|
||||
'title' => 'admin::app.admin.system.show-ratings',
|
||||
'type' => 'boolean',
|
||||
], [
|
||||
'name' => 'show_offers',
|
||||
'title' => 'admin::app.admin.system.show-offers',
|
||||
'type' => 'boolean',
|
||||
],
|
||||
],
|
||||
], [
|
||||
'key' => 'catalog.rich_snippets.categories',
|
||||
'name' => 'admin::app.admin.system.categories',
|
||||
'sort' => 1,
|
||||
'fields' => [
|
||||
[
|
||||
'name' => 'enable',
|
||||
'title' => 'admin::app.admin.system.enable',
|
||||
'type' => 'boolean',
|
||||
], [
|
||||
'name' => 'show_search_input_field',
|
||||
'title' => 'admin::app.admin.system.show-search-input-field',
|
||||
'type' => 'boolean',
|
||||
]
|
||||
]
|
||||
], [
|
||||
'key' => 'customer',
|
||||
'name' => 'admin::app.admin.system.customer',
|
||||
'sort' => 3,
|
||||
'sort' => 4,
|
||||
], [
|
||||
'key' => 'customer.settings',
|
||||
'name' => 'admin::app.admin.system.settings',
|
||||
|
|
@ -252,7 +310,7 @@ return [
|
|||
], [
|
||||
'key' => 'emails',
|
||||
'name' => 'admin::app.admin.emails.email',
|
||||
'sort' => 1,
|
||||
'sort' => 5,
|
||||
], [
|
||||
'key' => 'emails.general',
|
||||
'name' => 'admin::app.admin.emails.notification_label',
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
import Vue from 'vue';
|
||||
import VeeValidate from 'vee-validate';
|
||||
import VeeValidate, { Validator } from 'vee-validate';
|
||||
import de from 'vee-validate/dist/locale/de';
|
||||
import ar from 'vee-validate/dist/locale/ar';
|
||||
|
||||
import './bootstrap';
|
||||
|
||||
|
|
@ -7,6 +9,10 @@ window.Vue = Vue;
|
|||
window.VeeValidate = VeeValidate;
|
||||
|
||||
Vue.use(VeeValidate, {
|
||||
dictionary: {
|
||||
ar: ar,
|
||||
de: de,
|
||||
},
|
||||
events: 'input|change|blur',
|
||||
});
|
||||
Vue.prototype.$http = axios
|
||||
|
|
@ -30,6 +36,8 @@ $(document).ready(function () {
|
|||
mounted() {
|
||||
this.addServerErrors();
|
||||
this.addFlashMessages();
|
||||
|
||||
this.$validator.localize(document.documentElement.lang);
|
||||
},
|
||||
|
||||
methods: {
|
||||
|
|
@ -90,7 +98,7 @@ $(document).ready(function () {
|
|||
if (typeof flashMessages == 'undefined') {
|
||||
return;
|
||||
};
|
||||
|
||||
|
||||
const flashes = this.$refs.flashes;
|
||||
|
||||
flashMessages.forEach(function(flash) {
|
||||
|
|
|
|||
|
|
@ -1323,7 +1323,21 @@ return [
|
|||
'cheapest-first' => 'Cheapest First',
|
||||
'expensive-first' => 'Expensive First',
|
||||
'comma-seperated' => 'Comma Seperated',
|
||||
'favicon' => 'Favicon'
|
||||
'favicon' => 'Favicon',
|
||||
'seo' => 'SEO',
|
||||
'rich-snippets' => 'Rich Snippets',
|
||||
'products' => 'Products',
|
||||
'enable' => 'Enable',
|
||||
'show-weight' => 'Show Weight',
|
||||
'show-categories' => 'Show Categories',
|
||||
'show-images' => 'Show Images',
|
||||
'show-reviews' => 'Show Reviews',
|
||||
'show-ratings' => 'Show Ratings',
|
||||
'show-offers' => 'Show Offers',
|
||||
'show-sku' => 'Show SKU',
|
||||
'categories' => 'Categories',
|
||||
'show-sku' => 'Show SKU',
|
||||
'show-search-input-field' => 'Show Search Input Field'
|
||||
]
|
||||
]
|
||||
];
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -1331,7 +1331,21 @@ return [
|
|||
'cheapest-first' => 'Cheapest First',
|
||||
'expensive-first' => 'Expensive First',
|
||||
'comma-seperated' => 'Comma Seperated',
|
||||
'favicon' => 'Favicon'
|
||||
'favicon' => 'Favicon',
|
||||
'seo' => 'SEO',
|
||||
'rich-snippets' => 'Rich Snippets',
|
||||
'products' => 'Products',
|
||||
'enable' => 'Enable',
|
||||
'show-weight' => 'Show Weight',
|
||||
'show-categories' => 'Show Categories',
|
||||
'show-images' => 'Show Images',
|
||||
'show-reviews' => 'Show Reviews',
|
||||
'show-ratings' => 'Show Ratings',
|
||||
'show-offers' => 'Show Offers',
|
||||
'show-sku' => 'Show SKU',
|
||||
'categories' => 'Categories',
|
||||
'show-sku' => 'Show SKU',
|
||||
'show-search-input-field' => 'Show Search Input Field'
|
||||
]
|
||||
]
|
||||
];
|
||||
|
|
|
|||
|
|
@ -1329,7 +1329,21 @@ return [
|
|||
'cheapest-first' => 'Cheapest First',
|
||||
'expensive-first' => 'Expensive First',
|
||||
'comma-seperated' => 'Comma Seperated',
|
||||
'favicon' => 'Favicon'
|
||||
'favicon' => 'Favicon',
|
||||
'seo' => 'SEO',
|
||||
'rich-snippets' => 'Rich Snippets',
|
||||
'products' => 'Products',
|
||||
'enable' => 'Enable',
|
||||
'show-weight' => 'Show Weight',
|
||||
'show-categories' => 'Show Categories',
|
||||
'show-images' => 'Show Images',
|
||||
'show-reviews' => 'Show Reviews',
|
||||
'show-ratings' => 'Show Ratings',
|
||||
'show-offers' => 'Show Offers',
|
||||
'show-sku' => 'Show SKU',
|
||||
'categories' => 'Categories',
|
||||
'show-sku' => 'Show SKU',
|
||||
'show-search-input-field' => 'Show Search Input Field'
|
||||
]
|
||||
]
|
||||
];
|
||||
|
|
|
|||
|
|
@ -1333,8 +1333,21 @@ return [
|
|||
'cheapest-first' => 'I più convenienti prima',
|
||||
'expensive-first' => 'I più cari prima',
|
||||
'comma-seperated' => 'Separato da virgola',
|
||||
'favicon' => 'Favicon'
|
||||
|
||||
'favicon' => 'Favicon',
|
||||
'seo' => 'SEO',
|
||||
'rich-snippets' => 'Rich Snippets',
|
||||
'products' => 'Products',
|
||||
'enable' => 'Enable',
|
||||
'show-weight' => 'Show Weight',
|
||||
'show-categories' => 'Show Categories',
|
||||
'show-images' => 'Show Images',
|
||||
'show-reviews' => 'Show Reviews',
|
||||
'show-ratings' => 'Show Ratings',
|
||||
'show-offers' => 'Show Offers',
|
||||
'show-sku' => 'Show SKU',
|
||||
'categories' => 'Categories',
|
||||
'show-sku' => 'Show SKU',
|
||||
'show-search-input-field' => 'Show Search Input Field'
|
||||
]
|
||||
]
|
||||
];
|
||||
|
|
|
|||
|
|
@ -1328,7 +1328,21 @@ return [
|
|||
'cheapest-first' => 'Cheapest First',
|
||||
'expensive-first' => 'Expensive First',
|
||||
'comma-seperated' => 'Comma Seperated',
|
||||
'favicon' => 'Favicon'
|
||||
'favicon' => 'Favicon',
|
||||
'seo' => 'SEO',
|
||||
'rich-snippets' => 'Rich Snippets',
|
||||
'products' => 'Products',
|
||||
'enable' => 'Enable',
|
||||
'show-weight' => 'Show Weight',
|
||||
'show-categories' => 'Show Categories',
|
||||
'show-images' => 'Show Images',
|
||||
'show-reviews' => 'Show Reviews',
|
||||
'show-ratings' => 'Show Ratings',
|
||||
'show-offers' => 'Show Offers',
|
||||
'show-sku' => 'Show SKU',
|
||||
'categories' => 'Categories',
|
||||
'show-sku' => 'Show SKU',
|
||||
'show-search-input-field' => 'Show Search Input Field'
|
||||
]
|
||||
]
|
||||
];
|
||||
|
|
|
|||
|
|
@ -1002,7 +1002,7 @@ return [
|
|||
'specific-coupon' => 'Konkretny kupon',
|
||||
'auto-generate-coupon' => 'Automatyczniegeneruj kupon',
|
||||
'no' => 'Nie',
|
||||
'yes' => 'Tak,
|
||||
'yes' => 'Tak',
|
||||
'coupon-code' => 'Kod kuponu',
|
||||
'uses-per-coupon' => 'Wartość wykorzystania na kupon',
|
||||
'uses-per-customer' => 'Wartość wykorzystania na klienta',
|
||||
|
|
@ -1318,7 +1318,21 @@ return [
|
|||
'all-customer-groups' => 'Wszystkie grupy klientów',
|
||||
'invoice-slip-design' => 'Wzór wydruku faktury',
|
||||
'logo' => 'Logo',
|
||||
'favicon' => 'Favicon'
|
||||
'favicon' => 'Favicon',
|
||||
'seo' => 'SEO',
|
||||
'rich-snippets' => 'Rich Snippets',
|
||||
'products' => 'Products',
|
||||
'enable' => 'Enable',
|
||||
'show-weight' => 'Show Weight',
|
||||
'show-categories' => 'Show Categories',
|
||||
'show-images' => 'Show Images',
|
||||
'show-reviews' => 'Show Reviews',
|
||||
'show-ratings' => 'Show Ratings',
|
||||
'show-offers' => 'Show Offers',
|
||||
'show-sku' => 'Show SKU',
|
||||
'categories' => 'Categories',
|
||||
'show-sku' => 'Show SKU',
|
||||
'show-search-input-field' => 'Show Search Input Field'
|
||||
]
|
||||
]
|
||||
];
|
||||
|
|
@ -1332,7 +1332,21 @@ return [
|
|||
'cheapest-first' => 'Cheapest First',
|
||||
'expensive-first' => 'Expensive First',
|
||||
'comma-seperated' => 'Comma Seperated',
|
||||
'favicon' => 'Favicon'
|
||||
'favicon' => 'Favicon',
|
||||
'seo' => 'SEO',
|
||||
'rich-snippets' => 'Rich Snippets',
|
||||
'products' => 'Products',
|
||||
'enable' => 'Enable',
|
||||
'show-weight' => 'Show Weight',
|
||||
'show-categories' => 'Show Categories',
|
||||
'show-images' => 'Show Images',
|
||||
'show-reviews' => 'Show Reviews',
|
||||
'show-ratings' => 'Show Ratings',
|
||||
'show-offers' => 'Show Offers',
|
||||
'show-sku' => 'Show SKU',
|
||||
'categories' => 'Categories',
|
||||
'show-sku' => 'Show SKU',
|
||||
'show-search-input-field' => 'Show Search Input Field'
|
||||
]
|
||||
]
|
||||
];
|
||||
|
|
|
|||
|
|
@ -12,6 +12,8 @@ class CategoryTableSeeder extends Seeder
|
|||
{
|
||||
DB::table('categories')->delete();
|
||||
|
||||
DB::table('category_translations')->delete();
|
||||
|
||||
$now = Carbon::now();
|
||||
|
||||
DB::table('categories')->insert([
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@ class CategoryRepository extends Repository
|
|||
{
|
||||
static $categories = [];
|
||||
|
||||
if(array_key_exists($id, $categories)) {
|
||||
if (array_key_exists($id, $categories)) {
|
||||
return $categories[$id];
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -690,7 +690,7 @@ class Cart
|
|||
if ($address === null) {
|
||||
$address = new class() {
|
||||
public $country;
|
||||
|
||||
public $state;
|
||||
public $postcode;
|
||||
|
||||
function __construct()
|
||||
|
|
|
|||
|
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
'wishlist' => [
|
||||
'success' => 'Artikel erfolgreich zur Wunschliste hinzugefügt',
|
||||
'failure' => 'Artikel kann nicht zur Wunschliste hinzugefügt werden',
|
||||
'already' => 'Artikel bereits in Ihrer Wunschliste vorhanden',
|
||||
'removed' => 'Artikel erfolgreich von der Wunschliste entfernt',
|
||||
'remove-fail' => 'Artikel kann nicht von der Wunschliste entfernt werden',
|
||||
'empty' => 'Sie haben keine Artikel auf Ihrer Wunschliste',
|
||||
'select-options' => 'Vor dem Hinzufügen zur Wunschliste müssen Optionen ausgewählt werden',
|
||||
'remove-all-success' => 'Alle Elemente von Ihrer Wunschliste wurden entfernt',
|
||||
],
|
||||
'reviews' => [
|
||||
'empty' => 'Sie haben noch kein Produkt bewertet'
|
||||
],
|
||||
'forget_password' => [
|
||||
'reset_link_sent' => 'Wir haben Ihren Link zum Zurücksetzen des Passworts per E-Mail gesendet.'
|
||||
]
|
||||
];
|
||||
|
|
@ -21,8 +21,9 @@ class ProductImage extends AbstractProduct
|
|||
$images = [];
|
||||
|
||||
foreach ($product->images as $image) {
|
||||
if (! Storage::has($image->path))
|
||||
if (! Storage::has($image->path)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$images[] = [
|
||||
'small_image_url' => url('cache/small/' . $image->path),
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ class Review extends AbstractProduct
|
|||
return $totalRating[$product->id];
|
||||
}
|
||||
|
||||
return $totalRating[$product->id] = $product->reviews()->where('status','approved')->sum('rating');
|
||||
return $totalRating[$product->id] = $product->reviews()->where('status', 'approved')->sum('rating');
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -85,7 +85,7 @@ class Review extends AbstractProduct
|
|||
$reviews = $product->reviews()->where('status', 'approved')
|
||||
->select('rating', DB::raw('count(*) as total'))
|
||||
->groupBy('rating')
|
||||
->orderBy('rating','desc')
|
||||
->orderBy('rating', 'desc')
|
||||
->get();
|
||||
|
||||
$totalReviews = $this->getTotalReviews($product);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,185 @@
|
|||
<?php
|
||||
|
||||
namespace Webkul\Product\Helpers;
|
||||
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
class SEO
|
||||
{
|
||||
/**
|
||||
* Returns product json ld data for product
|
||||
*
|
||||
* @param \Webkul\Product\Contracts\Product|\Webkul\Product\Contracts\ProductFlat $product
|
||||
* @return array
|
||||
*/
|
||||
public function getProductJsonLd($product)
|
||||
{
|
||||
$data = [
|
||||
'@context' => 'https://schema.org/',
|
||||
'@type' => 'Product',
|
||||
'name' => $product->name,
|
||||
'description' => $product->description,
|
||||
'url' => route('shop.productOrCategory.index', $product->url_key),
|
||||
];
|
||||
|
||||
if (core()->getConfigData('catalog.rich_snippets.products.show_sku')) {
|
||||
$data['sku'] = $product->sku;
|
||||
}
|
||||
|
||||
if (core()->getConfigData('catalog.rich_snippets.products.show_weight')) {
|
||||
$data['image'] = $product->weight;
|
||||
}
|
||||
|
||||
if (core()->getConfigData('catalog.rich_snippets.products.show_categories')) {
|
||||
$data['categories'] = $this->getProductCategories($product);
|
||||
}
|
||||
|
||||
if (core()->getConfigData('catalog.rich_snippets.products.show_images')) {
|
||||
$data['image'] = $this->getProductImages($product);
|
||||
}
|
||||
|
||||
if (core()->getConfigData('catalog.rich_snippets.products.show_reviews')) {
|
||||
$data['review'] = $this->getProductReviews($product);
|
||||
}
|
||||
|
||||
if (core()->getConfigData('catalog.rich_snippets.products.show_ratings')) {
|
||||
$data['aggregateRating'] = $this->getProductAggregateRating($product);
|
||||
}
|
||||
|
||||
if (core()->getConfigData('catalog.rich_snippets.products.show_offers')) {
|
||||
$data['offers'] = $this->getProductOffers($product);
|
||||
}
|
||||
|
||||
return json_encode($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns product categories
|
||||
*
|
||||
* @param \Webkul\Product\Contracts\Product|\Webkul\Product\Contracts\ProductFlat $product
|
||||
* @return string
|
||||
*/
|
||||
public function getProductCategories($product)
|
||||
{
|
||||
if ($product instanceof \Webkul\Product\Models\ProductFlat) {
|
||||
$categories = $product->product->categories;
|
||||
} else {
|
||||
$categories = $product->categories;
|
||||
}
|
||||
|
||||
$names = [];
|
||||
|
||||
foreach ($categories as $key => $category) {
|
||||
$names[] = $category->name;
|
||||
}
|
||||
|
||||
return implode(', ', $names);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns product images
|
||||
*
|
||||
* @param \Webkul\Product\Contracts\Product|\Webkul\Product\Contracts\ProductFlat $product
|
||||
* @return array
|
||||
*/
|
||||
public function getProductImages($product)
|
||||
{
|
||||
$images = [];
|
||||
|
||||
foreach ($product->images as $image) {
|
||||
if (! Storage::has($image->path)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$images[] = $image->url;
|
||||
}
|
||||
|
||||
return $images;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns product reviews
|
||||
*
|
||||
* @param \Webkul\Product\Contracts\Product|\Webkul\Product\Contracts\ProductFlat $product
|
||||
* @return array
|
||||
*/
|
||||
public function getProductReviews($product)
|
||||
{
|
||||
$reviews = [];
|
||||
|
||||
foreach ($product->reviews()->where('status', 'approved')->get() as $review) {
|
||||
$reviews[] = [
|
||||
'@type' => 'Review',
|
||||
'reviewRating' => [
|
||||
'@type' => 'Rating',
|
||||
'ratingValue' => $review->rating,
|
||||
'bestRating' => '5',
|
||||
],
|
||||
'author' => [
|
||||
'@type' => 'Person',
|
||||
'name' => $review->name,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
return $reviews;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns product average ratings
|
||||
*
|
||||
* @param \Webkul\Product\Contracts\Product|\Webkul\Product\Contracts\ProductFlat $product
|
||||
* @return array
|
||||
*/
|
||||
public function getProductAggregateRating($product)
|
||||
{
|
||||
$reviewHelper = app('Webkul\Product\Helpers\Review');
|
||||
|
||||
return [
|
||||
'@type' => 'AggregateRating',
|
||||
'ratingValue' => $reviewHelper->getAverageRating($product),
|
||||
'reviewCount' => $reviewHelper->getTotalReviews($product),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns product average ratings
|
||||
*
|
||||
* @param \Webkul\Product\Contracts\Product|\Webkul\Product\Contracts\ProductFlat $product
|
||||
* @return array
|
||||
*/
|
||||
public function getProductOffers($product)
|
||||
{
|
||||
return [
|
||||
'@type' => 'Offer',
|
||||
'priceCurrency' => core()->getCurrentCurrencyCode(),
|
||||
'price' => $product->getTypeInstance()->getMinimalPrice(),
|
||||
'availability' => 'https://schema.org/InStock',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns product json ld data for category
|
||||
*
|
||||
* @param \Webkul\Category\Contracts\Category $category
|
||||
* @return array
|
||||
*/
|
||||
public function getCategoryJsonLd($category)
|
||||
{
|
||||
$data = [
|
||||
'@type' => 'WebSite',
|
||||
'@context' => 'http://schema.org',
|
||||
'url' => config('app.url'),
|
||||
];
|
||||
|
||||
if (core()->getConfigData('catalog.rich_snippets.categories.show_search_input_field')) {
|
||||
$data['potentialAction'] = [
|
||||
'@type' => 'SearchAction',
|
||||
'target' => config('app.url') . '/search/?term={search_term_string}',
|
||||
'query-input' => 'required name=search_term_string',
|
||||
];
|
||||
}
|
||||
|
||||
return json_encode($data);
|
||||
}
|
||||
}
|
||||
|
|
@ -83,8 +83,9 @@ class Toolbar extends AbstractProduct
|
|||
public function isOrderCurrent($key)
|
||||
{
|
||||
$params = request()->input();
|
||||
$orderDirection = $params['order'] ?? 'asc';
|
||||
|
||||
if (isset($params['sort']) && $key == $params['sort'] . '-' . $params['order']) {
|
||||
if (isset($params['sort']) && $key == $params['sort'] . '-' . $orderDirection) {
|
||||
return true;
|
||||
} elseif (! isset($params['sort'])) {
|
||||
$sortBy = core()->getConfigData('catalog.products.storefront.sort_by')
|
||||
|
|
|
|||
|
|
@ -140,18 +140,20 @@ class ProductRepository extends Repository
|
|||
if (isset($params['search']))
|
||||
$qb->where('product_flat.name', 'like', '%' . urldecode($params['search']) . '%');
|
||||
|
||||
# sort direction
|
||||
$orderDirection = 'asc';
|
||||
if( isset($params['order']) && in_array($params['order'], ['desc', 'asc']) ){
|
||||
$orderDirection = $params['order'];
|
||||
}
|
||||
|
||||
if (isset($params['sort'])) {
|
||||
$attribute = $this->attributeRepository->findOneByField('code', $params['sort']);
|
||||
|
||||
if ($attribute) {
|
||||
if ($params['sort'] == 'price') {
|
||||
if ($attribute->code == 'price') {
|
||||
$qb->orderBy('min_price', $params['order']);
|
||||
} else {
|
||||
$qb->orderBy($attribute->code, $params['order']);
|
||||
}
|
||||
if ($attribute->code == 'price') {
|
||||
$qb->orderBy('min_price', $orderDirection);
|
||||
} else {
|
||||
$qb->orderBy($params['sort'] == 'created_at' ? 'product_flat.created_at' : $attribute->code, $params['order']);
|
||||
$qb->orderBy($params['sort'] == 'created_at' ? 'product_flat.created_at' : $attribute->code, $orderDirection);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -542,29 +542,32 @@ class Bundle extends AbstractType
|
|||
{
|
||||
$bundleOptionQuantities = $data['bundle_option_qty'] ?? [];
|
||||
|
||||
foreach ($data['bundle_options'] as $optionId => $optionProductIds) {
|
||||
$option = $this->productBundleOptionRepository->find($optionId);
|
||||
$productBundleOptions = $this->productBundleOptionRepository
|
||||
->whereIn('id', array_keys($data['bundle_options']))
|
||||
->orderBy('sort_order')
|
||||
->get();
|
||||
|
||||
foreach ($productBundleOptions as $option) {
|
||||
$labels = [];
|
||||
|
||||
foreach ($optionProductIds as $optionProductId) {
|
||||
foreach ($data['bundle_options'][$option->id] as $optionProductId) {
|
||||
if (! $optionProductId) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$optionProduct = $this->productBundleOptionProductRepository->find($optionProductId);
|
||||
|
||||
$qty = $data['bundle_option_qty'][$optionId] ?? $optionProduct->qty;
|
||||
$qty = $data['bundle_option_qty'][$option->id] ?? $optionProduct->qty;
|
||||
|
||||
if (! isset($data['bundle_option_qty'][$optionId])) {
|
||||
$bundleOptionQuantities[$optionId] = $qty;
|
||||
if (! isset($data['bundle_option_qty'][$option->id])) {
|
||||
$bundleOptionQuantities[$option->id] = $qty;
|
||||
}
|
||||
|
||||
$labels[] = $qty . ' x ' . $optionProduct->product->name . ' ' . core()->currency($optionProduct->product->getTypeInstance()->getMinimalPrice());
|
||||
}
|
||||
|
||||
if (count($labels)) {
|
||||
$data['attributes'][$option->id] = [
|
||||
$data['attributes'][] = [
|
||||
'attribute_name' => $option->label,
|
||||
'option_id' => $option->id,
|
||||
'option_label' => implode(', ', $labels),
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import $ from 'jquery';
|
||||
import Vue from 'vue';
|
||||
import VeeValidate from 'vee-validate';
|
||||
import VeeValidate, { Validator } from 'vee-validate';
|
||||
import de from 'vee-validate/dist/locale/de';
|
||||
import ar from 'vee-validate/dist/locale/ar';
|
||||
import axios from 'axios';
|
||||
|
|
|
|||
|
|
@ -370,6 +370,7 @@ return [
|
|||
'layered-nav-title' => 'المنتجات',
|
||||
'price-label' => 'أقل من',
|
||||
'remove-filter-link-title' => 'امسح الكل',
|
||||
'filter-to' => 'to',
|
||||
'sort-by' => 'افرز حسب',
|
||||
'from-a-z' => 'من a-z',
|
||||
'from-z-a' => 'من ز-أ',
|
||||
|
|
|
|||
|
|
@ -0,0 +1,675 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
'invalid_vat_format' => 'Die angegebene Umsatzsteuer-ID hat ein falsches Format',
|
||||
'security-warning' => 'Verdächtige Aktivität gefunden!!!',
|
||||
'nothing-to-delete' => 'Nichts zu löschen',
|
||||
|
||||
'layouts' => [
|
||||
'my-account' => 'Mein Konto',
|
||||
'profile' => 'Profil',
|
||||
'address' => 'Adresse',
|
||||
'reviews' => 'Bewertungen',
|
||||
'wishlist' => 'Wunschliste',
|
||||
'orders' => 'Bestellungen',
|
||||
'downloadable-products' => 'Herunterladbare Produkte'
|
||||
],
|
||||
|
||||
'common' => [
|
||||
'error' => 'Es ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut.',
|
||||
'no-result-found' => 'Wir konnten keine Aufzeichnungen finden.'
|
||||
],
|
||||
|
||||
'home' => [
|
||||
'page-title' => config('app.name') . ' - Start',
|
||||
'featured-products' => 'Ausgewählte Produkte',
|
||||
'new-products' => 'Neue Produkte',
|
||||
'verify-email' => 'Bestätigen Sie Ihr E-Mail-Konto',
|
||||
'resend-verify-email' => 'Bestätigungsmail erneut senden'
|
||||
],
|
||||
|
||||
'header' => [
|
||||
'title' => 'Konto',
|
||||
'dropdown-text' => 'Warenkorb, Bestellungen und Wunschliste verwalten',
|
||||
'sign-in' => 'Anmelden',
|
||||
'sign-up' => 'Registrieren',
|
||||
'account' => 'Konto',
|
||||
'cart' => 'Warenkorb',
|
||||
'profile' => 'Profil',
|
||||
'wishlist' => 'Wunschliste',
|
||||
'cart' => 'Warenkorb',
|
||||
'logout' => 'Ausloggen',
|
||||
'search-text' => 'Nach Produkten suchen'
|
||||
],
|
||||
|
||||
'minicart' => [
|
||||
'view-cart' => 'Warenkorb ansehen',
|
||||
'checkout' => 'Bestellen',
|
||||
'cart' => 'Warenkorb',
|
||||
'zero' => '0'
|
||||
],
|
||||
|
||||
'footer' => [
|
||||
'subscribe-newsletter' => 'Newsletter abonnieren',
|
||||
'subscribe' => 'Abonnieren',
|
||||
'locale' => 'Sprache',
|
||||
'currency' => 'Währung',
|
||||
],
|
||||
|
||||
'subscription' => [
|
||||
'unsubscribe' => 'Abmelden',
|
||||
'subscribe' => 'Abonnieren',
|
||||
'subscribed' => 'Sie haben jetzt Abonnement-E-Mails abonniert.',
|
||||
'not-subscribed' => 'Sie können keine Abonnement-E-Mails abonnieren. Versuchen Sie es später erneut.',
|
||||
'already' => 'Sie haben unsere Abonnementliste bereits abonniert.',
|
||||
'unsubscribed' => 'Sie werden von Abonnement-Mails abgemeldet.',
|
||||
'already-unsub' => 'Sie sind bereits abgemeldet.',
|
||||
'not-subscribed' => 'Error! E-Mails können derzeit nicht gesendet werden. Bitte versuchen Sie es später erneut.'
|
||||
],
|
||||
|
||||
'search' => [
|
||||
'no-results' => 'Keine Ergebnisse gefunden',
|
||||
'page-title' => config('app.name') . ' - Suchen',
|
||||
'found-results' => 'Suchergebnisse gefunden',
|
||||
'found-result' => 'Suchergebnis gefunden'
|
||||
],
|
||||
|
||||
'reviews' => [
|
||||
'title' => 'Titel',
|
||||
'add-review-page-title' => 'Bewertung hinzufügen',
|
||||
'write-review' => 'Bewertung schreiben',
|
||||
'review-title' => 'Geben Sie Ihrer Bewertung einen Titel',
|
||||
'product-review-page-title' => 'Produktbewertung',
|
||||
'rating-reviews' => 'Sterne & Bewertungen',
|
||||
'submit' => 'EINREICHEN',
|
||||
'delete-all' => 'Alle Bewertungen wurden erfolgreich gelöscht',
|
||||
'ratingreviews' => ':rating Sterne & :review Bewertungen',
|
||||
'star' => 'Sterne',
|
||||
'percentage' => ':percentage %',
|
||||
'id-star' => 'Sterne',
|
||||
'name' => 'Name',
|
||||
],
|
||||
|
||||
'customer' => [
|
||||
'signup-text' => [
|
||||
'account_exists' => 'Sie haben bereits ein Konto',
|
||||
'title' => 'Anmelden'
|
||||
],
|
||||
|
||||
'signup-form' => [
|
||||
'page-title' => 'Neues Kundenkonto erstellen',
|
||||
'title' => 'Anmelden',
|
||||
'firstname' => 'Vorname',
|
||||
'lastname' => 'Nachname',
|
||||
'email' => 'E-Mail',
|
||||
'password' => 'Passwort',
|
||||
'confirm_pass' => 'Passwort bestätigen',
|
||||
'button_title' => 'Registrieren',
|
||||
'agree' => 'Zustimmen',
|
||||
'terms' => 'Regeln',
|
||||
'conditions' => 'Bedigungen',
|
||||
'using' => 'durch die Nutzung dieser Website',
|
||||
'agreement' => 'Zustimmung',
|
||||
'success' => 'Konto erfolgreich erstellt.',
|
||||
'success-verify' => 'Konto erfolgreich erstellt, eine E-Mail zur Bestätigung wurde versendet.',
|
||||
'success-verify-email-unsent' => 'Das Konto wurde erfolgreich erstellt, aber die Bestätigungs-E-Mail wurde nicht ordnungsgemäß gesendet. Zur Bestätigung wurde eine E-Mail gesendet.',
|
||||
'failed' => 'Error! Sie können Ihr Konto nicht erstellen. Bitte versuchen Sie es später erneut.',
|
||||
'already-verified' => 'Ihr Konto ist bereits verifiziert. Oder versuchen Sie erneut, eine neue Bestätigungs-E-Mail zu senden.',
|
||||
'verification-not-sent' => 'Error! Problem beim Senden einer Bestätigungs-E-Mail, versuchen Sie es später erneut.',
|
||||
'verification-sent' => 'Bestätigungs-E-Mail gesendet',
|
||||
'verified' => 'Ihr Konto wurde verifiziert. Versuchen Sie jetzt, sich anzumelden.',
|
||||
'verify-failed' => 'Wir können Ihr E-Mail-Konto nicht bestätigen.',
|
||||
'dont-have-account' => 'Sie haben kein Konto bei uns.',
|
||||
'customer-registration' => 'Kunde erfolgreich registriert'
|
||||
],
|
||||
|
||||
'login-text' => [
|
||||
'no_account' => 'Sie haben noch keinen Account',
|
||||
'title' => 'Registrieren',
|
||||
],
|
||||
|
||||
'login-form' => [
|
||||
'page-title' => 'Kundenlogin',
|
||||
'title' => 'Anmelden',
|
||||
'email' => 'E-Mail',
|
||||
'password' => 'Passwort',
|
||||
'forgot_pass' => 'Passwort vergessen?',
|
||||
'button_title' => 'Anmelden',
|
||||
'remember' => 'Angemeldet bleiben',
|
||||
'footer' => '© Copyright :year Webkul Software, All rights reserved',
|
||||
'invalid-creds' => 'Bitte überprüfen Sie Ihre Anmeldeinformationen und versuchen Sie es erneut.',
|
||||
'verify-first' => 'Bestätigung Sie zuerst Ihr E-Mail-Konto.',
|
||||
'not-activated' => 'Ihre Aktivierung erfordert die Genehmigung des Administrators',
|
||||
'resend-verification' => 'Senden Sie die Bestätigungsmail erneut'
|
||||
],
|
||||
|
||||
'forgot-password' => [
|
||||
'title' => 'Passwort wiederherstellen',
|
||||
'email' => 'E-Mail',
|
||||
'submit' => 'E-Mail zum Zurücksetzen des Passworts senden',
|
||||
'page_title' => 'Haben Sie Ihr Passwort vergessen ?'
|
||||
],
|
||||
|
||||
'reset-password' => [
|
||||
'title' => 'Passwort zurücksetzen',
|
||||
'email' => 'Registrierte E-Mail',
|
||||
'password' => 'Passwort',
|
||||
'confirm-password' => 'Passwort bestätigen',
|
||||
'back-link-title' => 'Zurück zur Anmeldung',
|
||||
'submit-btn-title' => 'Passwort zurücksetzen'
|
||||
],
|
||||
|
||||
'account' => [
|
||||
'dashboard' => 'Profil bearbeiten',
|
||||
'menu' => 'Menu',
|
||||
|
||||
'profile' => [
|
||||
'index' => [
|
||||
'page-title' => 'Profil',
|
||||
'title' => 'Profil',
|
||||
'edit' => 'Bearbeiten',
|
||||
],
|
||||
|
||||
'edit-success' => 'Profil erfolgreich aktualisiert.',
|
||||
'edit-fail' => 'Error! Das Profil kann nicht aktualisiert werden. Bitte versuchen Sie es später erneut.',
|
||||
'unmatch' => 'Das alte Passwort stimmt nicht überein.',
|
||||
|
||||
'fname' => 'Vorname',
|
||||
'lname' => 'Nachname',
|
||||
'gender' => 'Geschlecht',
|
||||
'other' => 'Andere',
|
||||
'male' => 'Männlich',
|
||||
'female' => 'weiblich',
|
||||
'dob' => 'Geburtsdatum',
|
||||
'phone' => 'Telefon',
|
||||
'email' => 'E-Mail',
|
||||
'opassword' => 'Altes Passwort',
|
||||
'password' => 'Passwort',
|
||||
'cpassword' => 'Passwort bestätigen',
|
||||
'submit' => 'Profil aktualisieren',
|
||||
|
||||
'edit-profile' => [
|
||||
'title' => 'Profil bearbeiten',
|
||||
'page-title' => 'Profilformular bearbeiten'
|
||||
]
|
||||
],
|
||||
|
||||
'address' => [
|
||||
'index' => [
|
||||
'page-title' => 'Adresse',
|
||||
'title' => 'Adresse',
|
||||
'add' => 'Adresse hinzufügen',
|
||||
'edit' => 'Bearbeiten',
|
||||
'empty' => 'Sie haben hier keine gespeicherten Adressen. Bitte versuchen Sie, diese zu erstellen, indem Sie auf den unten stehenden Link klicken',
|
||||
'create' => 'Adresse erstellen',
|
||||
'delete' => 'Löschen',
|
||||
'make-default' => 'Standard hinzufügen',
|
||||
'default' => 'Standard',
|
||||
'contact' => 'Kontakt',
|
||||
'confirm-delete' => 'Möchten Sie diese Adresse wirklich löschen?',
|
||||
'default-delete' => 'Die Standardadresse kann nicht geändert werden.',
|
||||
'enter-password' => 'Geben Sie Ihr Passwort ein.',
|
||||
],
|
||||
|
||||
'create' => [
|
||||
'page-title' => 'Adressformular hinzufügen',
|
||||
'company_name' => 'Name der Firma',
|
||||
'first_name' => 'Vorname',
|
||||
'last_name' => 'Nachname',
|
||||
'vat_id' => 'Umsatzsteuer-ID',
|
||||
'vat_help_note' => '[Hinweis: Verwenden Sie den Ländercode mit der Umsatzsteuer-Identifikationsnummer. Z.B. INV01234567891]',
|
||||
'title' => 'Adresse hinzufügen',
|
||||
'street-address' => 'Straße',
|
||||
'country' => 'Land',
|
||||
'state' => 'Bundesland',
|
||||
'select-state' => 'Wählen Sie eine Region, ein Bundesland oder eine Provinz aus',
|
||||
'city' => 'Stadt',
|
||||
'postcode' => 'Postleitzahl',
|
||||
'phone' => 'Telefon',
|
||||
'submit' => 'Adresse speichern',
|
||||
'success' => 'Adresse wurde erfolgreich hinzugefügt.',
|
||||
'error' => 'Adresse kann nicht hinzugefügt werden.'
|
||||
],
|
||||
|
||||
'edit' => [
|
||||
'page-title' => 'Adresse bearbeiten',
|
||||
'company_name' => 'Name der Firma',
|
||||
'first_name' => 'Vorname',
|
||||
'last_name' => 'Nachname',
|
||||
'vat_id' => 'Umsatzsteuer-ID',
|
||||
'title' => 'Adresse bearbeiten',
|
||||
'street-address' => 'Straße',
|
||||
'submit' => 'Adresse speichern',
|
||||
'success' => 'Adresse erfolgreich aktualisiert.',
|
||||
],
|
||||
'delete' => [
|
||||
'success' => 'Adresse erfolgreich gelöscht',
|
||||
'failure' => 'Adresse kann nicht gelöscht werden',
|
||||
'wrong-password' => 'Falsches Passwort !'
|
||||
]
|
||||
],
|
||||
|
||||
'order' => [
|
||||
'index' => [
|
||||
'page-title' => 'Bestellungen',
|
||||
'title' => 'Bestellungen',
|
||||
'order_id' => 'Auftragsnummer',
|
||||
'date' => 'Datum',
|
||||
'status' => 'Status',
|
||||
'total' => 'Gesamt',
|
||||
'order_number' => 'Bestellnummer',
|
||||
'processing' => 'Wird bearbeitet',
|
||||
'completed' => 'Abgeschlossen',
|
||||
'canceled' => 'Abgebrochen',
|
||||
'closed' => 'Geschlossen',
|
||||
'pending' => 'Ausstehend',
|
||||
'pending-payment' => 'Ausstehende Zahlung',
|
||||
'fraud' => 'Betrug'
|
||||
],
|
||||
|
||||
'view' => [
|
||||
'page-tile' => 'Bestellung #:order_id',
|
||||
'info' => 'Informationen',
|
||||
'placed-on' => 'Vom',
|
||||
'products-ordered' => 'Bestellte Produkte',
|
||||
'invoices' => 'Rechnungen',
|
||||
'shipments' => 'Sendungen',
|
||||
'SKU' => 'SKU',
|
||||
'product-name' => 'Name',
|
||||
'qty' => 'Menge',
|
||||
'item-status' => 'Artikelstatus',
|
||||
'item-ordered' => 'Bestellt (:qty_ordered)',
|
||||
'item-invoice' => 'In Rechnung gestellt (:qty_invoiced)',
|
||||
'item-shipped' => 'Versendet (:qty_shipped)',
|
||||
'item-canceled' => 'Abgebrochen (:qty_canceled)',
|
||||
'item-refunded' => 'Rückerstattet (:qty_refunded)',
|
||||
'price' => 'Preis',
|
||||
'total' => 'Gesamt',
|
||||
'subtotal' => 'Zwischensumme',
|
||||
'shipping-handling' => 'Versand & Bearbeitung',
|
||||
'tax' => 'Umsatzsteuer',
|
||||
'discount' => 'Rabatt',
|
||||
'tax-percent' => 'Umsatzsteuerprozent',
|
||||
'tax-amount' => 'Umsatzsteuerbetrag',
|
||||
'discount-amount' => 'Rabattbetrag',
|
||||
'grand-total' => 'Gesamtsumme',
|
||||
'total-paid' => 'Insgesamt bezahlt',
|
||||
'total-refunded' => 'Insgesamt erstattet',
|
||||
'total-due' => 'Insgesamt fällig',
|
||||
'shipping-address' => 'Lieferanschrift',
|
||||
'billing-address' => 'Rechnungsadresse',
|
||||
'shipping-method' => 'Versandart',
|
||||
'payment-method' => 'Zahlungsmethode',
|
||||
'individual-invoice' => 'Rechnung #:invoice_id',
|
||||
'individual-shipment' => 'Sendung #:shipment_id',
|
||||
'print' => 'Drucken',
|
||||
'invoice-id' => 'Rechnungsnummer',
|
||||
'order-id' => 'Auftragsnummer',
|
||||
'order-date' => 'Bestelldatum',
|
||||
'bill-to' => 'Rechnung an',
|
||||
'ship-to' => 'Versenden an',
|
||||
'contact' => 'Kontakt',
|
||||
'refunds' => 'Rückerstattungen',
|
||||
'individual-refund' => 'Rückerstattung #:refund_id',
|
||||
'adjustment-refund' => 'Anpassungsrückerstattung',
|
||||
'adjustment-fee' => 'Anpassungsgebühr',
|
||||
]
|
||||
],
|
||||
|
||||
'wishlist' => [
|
||||
'page-title' => 'Wunschliste',
|
||||
'title' => 'Wunschliste',
|
||||
'deleteall' => 'Alles löschen',
|
||||
'moveall' => 'Alle Produkte zum Warenkorb hinzufügen',
|
||||
'move-to-cart' => 'In den Warenkorb legen',
|
||||
'error' => 'Das Produkt kann aufgrund unbekannter Probleme nicht zur Wunschliste hinzugefügt werden. Bitte versuchen Sie es später erneut',
|
||||
'add' => 'Artikel erfolgreich zur Wunschliste hinzugefügt',
|
||||
'remove' => 'Artikel erfolgreich von der Wunschliste entfernt',
|
||||
'moved' => 'Artikel erfolgreich in den Warenkorb verschoben',
|
||||
'option-missing' => 'Produktoptionen fehlen, sodass Artikel nicht auf die Wunschliste verschoben werden können.',
|
||||
'move-error' => 'Artikel kann nicht auf die Wunschliste verschoben werden. Bitte versuchen Sie es später erneut',
|
||||
'success' => 'Artikel erfolgreich zur Wunschliste hinzugefügt',
|
||||
'failure' => 'Artikel kann nicht zur Wunschliste hinzugefügt werden. Bitte versuchen Sie es später erneut',
|
||||
'already' => 'Artikel bereits in Ihrer Wunschliste vorhanden',
|
||||
'removed' => 'Artikel erfolgreich von der Wunschliste entfernt',
|
||||
'remove-fail' => 'Artikel kann nicht von der Wunschliste entfernt werden. Bitte versuchen Sie es später erneut',
|
||||
'empty' => 'Sie haben keine Artikel auf Ihrer Wunschliste',
|
||||
'remove-all-success' => 'Alle Artikel von Ihrer Wunschliste wurden entfernt',
|
||||
],
|
||||
|
||||
'downloadable_products' => [
|
||||
'title' => 'Herunterladbare Produkte',
|
||||
'order-id' => 'Auftragsnummer',
|
||||
'date' => 'Datum',
|
||||
'name' => 'Titel',
|
||||
'status' => 'Status',
|
||||
'pending' => 'Ausstehend',
|
||||
'available' => 'Verfügbar',
|
||||
'expired' => 'Abgelaufen',
|
||||
'remaining-downloads' => 'Verbleibende Downloads',
|
||||
'unlimited' => 'Unbegrenzt',
|
||||
'download-error' => 'Der Download-Link ist abgelaufen.'
|
||||
],
|
||||
|
||||
'review' => [
|
||||
'index' => [
|
||||
'title' => 'Bewertungen',
|
||||
'page-title' => 'Bewertungen'
|
||||
],
|
||||
|
||||
'view' => [
|
||||
'page-tile' => 'Bewertung #:id',
|
||||
]
|
||||
]
|
||||
]
|
||||
],
|
||||
|
||||
'products' => [
|
||||
'layered-nav-title' => 'Einkaufen bei',
|
||||
'price-label' => 'Angebotspreis von',
|
||||
'remove-filter-link-title' => 'Alles löschen',
|
||||
'filter-to' => 'bis',
|
||||
'sort-by' => 'Sortieren',
|
||||
'from-a-z' => 'Von A-Z',
|
||||
'from-z-a' => 'Von Z-A',
|
||||
'newest-first' => 'Neuste zuerst',
|
||||
'oldest-first' => 'Älteste zuerst',
|
||||
'cheapest-first' => 'Günstigste zuerst',
|
||||
'expensive-first' => 'Teuerste zuerst',
|
||||
'show' => 'Anzeigen',
|
||||
'pager-info' => 'Zeige :showing von :total Artikeln',
|
||||
'description' => 'Beschreibung',
|
||||
'specification' => 'Spezifikation',
|
||||
'total-reviews' => ':total Bewertungen',
|
||||
'total-rating' => ':total_rating Sterne & :total_reviews Bewertungen',
|
||||
'by' => 'Durch :name',
|
||||
'up-sell-title' => 'Wir haben andere Produkte gefunden, die Ihnen gefallen könnten!',
|
||||
'related-product-title' => 'Verwandte Produkte',
|
||||
'cross-sell-title' => 'Mehr Auswahl',
|
||||
'reviews-title' => 'Sterne & Bewertungen',
|
||||
'write-review-btn' => 'Eine Bewertung schreiben',
|
||||
'choose-option' => 'Wähle eine Option',
|
||||
'sale' => 'Verkauf',
|
||||
'new' => 'Neu',
|
||||
'empty' => 'Keine Produkte in dieser Kategorie verfügbar',
|
||||
'add-to-cart' => 'In Warenkorb',
|
||||
'buy-now' => 'Jetzt kaufen',
|
||||
'whoops' => 'Hoppla!',
|
||||
'quantity' => 'Menge',
|
||||
'in-stock' => 'Auf Lager',
|
||||
'out-of-stock' => 'Nicht vorrättig',
|
||||
'view-all' => 'Alle ansehen',
|
||||
'select-above-options' => 'Bitte wählen Sie zuerst die oben genannten Optionen aus.',
|
||||
'less-quantity' => 'Die Menge kann nicht kleiner als eins sein.',
|
||||
'samples' => 'Beispiele',
|
||||
'links' => 'Links',
|
||||
'sample' => 'Beispiel',
|
||||
'name' => 'Name',
|
||||
'qty' => 'Menge',
|
||||
'starting-at' => 'Beginnt um',
|
||||
'customize-options' => 'Optionen anpassen',
|
||||
'choose-selection' => 'Wählen Sie eine Auswahl',
|
||||
'your-customization' => 'Ihre Anpassung',
|
||||
'total-amount' => 'Gesamtmenge',
|
||||
'none' => 'Keine',
|
||||
'available' => 'Verfügbar'
|
||||
],
|
||||
|
||||
// 'reviews' => [
|
||||
// 'empty' => 'Sie haben noch kein Produkt bewertet'
|
||||
// ]
|
||||
|
||||
'buynow' => [
|
||||
'no-options' => 'Bitte wählen Sie Optionen aus, bevor Sie dieses Produkt kaufen.'
|
||||
],
|
||||
|
||||
'checkout' => [
|
||||
'cart' => [
|
||||
'integrity' => [
|
||||
'missing_fields' => 'Einige erforderliche Felder für dieses Produkt fehlen.',
|
||||
'missing_options' => 'Für dieses Produkt fehlen Optionen.',
|
||||
'missing_links' => 'Für dieses Produkt fehlen herunterladbare Links.',
|
||||
'qty_missing' => 'Mindestens ein Produkt sollte mehr als 1 Menge enthalten.',
|
||||
'qty_impossible' => 'Es kann nicht mehr als eines dieser Produkte zum Warenkorb hinzugefügt werden.'
|
||||
],
|
||||
'create-error' => 'Beim Erstellen des Warenkorbs ist ein Problem aufgetreten.',
|
||||
'title' => 'Warenkorb',
|
||||
'empty' => 'Ihr Einkaufswagen ist leer',
|
||||
'update-cart' => 'Warenkorb aktualisieren',
|
||||
'continue-shopping' => 'Mit dem Einkaufen fortfahren',
|
||||
'proceed-to-checkout' => 'Zur Kasse',
|
||||
'remove' => 'Entfernen',
|
||||
'remove-link' => 'Entfernen',
|
||||
'move-to-wishlist' => 'Zur Wunschliste verschieben',
|
||||
'move-to-wishlist-success' => 'Artikel wurde erfolgreich auf die Wunschliste verschoben.',
|
||||
'move-to-wishlist-error' => 'Das Objekt kann nicht auf die Wunschliste verschoben werden. Bitte versuchen Sie es später erneut.',
|
||||
'add-config-warning' => 'Bitte wählen Sie die Option, bevor Sie sie zum Warenkorb hinzufügen.',
|
||||
'quantity' => [
|
||||
'quantity' => 'Menge',
|
||||
'success' => 'Warenkorbartikel erfolgreich aktualisiert.',
|
||||
'illegal' => 'Die Menge kann nicht kleiner als eins sein.',
|
||||
'inventory_warning' => 'Die angeforderte Menge ist nicht verfügbar. Bitte versuchen Sie es später erneut.',
|
||||
'error' => 'Die Elemente können derzeit nicht aktualisiert werden. Bitte versuchen Sie es später erneut.'
|
||||
],
|
||||
|
||||
'item' => [
|
||||
'error_remove' => 'Keine Artikel aus dem Warenkorb zu entfernen',
|
||||
'success' => 'Artikel wurde erfolgreich zum Warenkorb hinzugefügt',
|
||||
'success-remove' => 'Artikel wurde erfolgreich aus dem Warenkorb entfernt',
|
||||
'error-add' => 'Artikel kann nicht zum Warenkorb hinzugefügt werden. Bitte versuchen Sie es später erneut',
|
||||
],
|
||||
'quantity-error' => 'Die angeforderte Menge ist nicht verfügbar',
|
||||
'cart-subtotal' => 'Warenkorb Zwischensumme',
|
||||
'cart-remove-action' => 'Wollen Sie dies wirklich tun?',
|
||||
'partial-cart-update' => 'Nur einige der Produkte wurden aktualisiert',
|
||||
'link-missing' => ''
|
||||
],
|
||||
|
||||
'onepage' => [
|
||||
'title' => 'Bestellen',
|
||||
'information' => 'Informationen',
|
||||
'shipping' => 'Versand',
|
||||
'payment' => 'Zahlung',
|
||||
'complete' => 'Komplett',
|
||||
'billing-address' => 'Rechnungsadresse',
|
||||
'sign-in' => 'Anmelden',
|
||||
'company-name' => 'Name der Firma',
|
||||
'first-name' => 'Vorname',
|
||||
'last-name' => 'Nachname',
|
||||
'email' => 'E-Mail',
|
||||
'address1' => 'Straße',
|
||||
'city' => 'Stadt',
|
||||
'state' => 'Bundesland',
|
||||
'select-state' => 'Wählen Sie eine Region, ein Bundesland oder eine Provinz aus',
|
||||
'postcode' => 'Postleitzahl',
|
||||
'phone' => 'Telefon',
|
||||
'country' => 'Land',
|
||||
'order-summary' => 'Bestellübersicht',
|
||||
'shipping-address' => 'Lieferanschrift',
|
||||
'use_for_shipping' => 'An diese Adresse liefern',
|
||||
'continue' => 'Weiter',
|
||||
'shipping-method' => 'Versandart wählen',
|
||||
'payment-methods' => 'Zahlungsmethode wählen',
|
||||
'payment-method' => 'Zahlungsmethode',
|
||||
'summary' => 'Bestellübersichty',
|
||||
'price' => 'Preis',
|
||||
'quantity' => 'Menge',
|
||||
'billing-address' => 'Rechnungsadresse',
|
||||
'shipping-address' => 'Lieferanschrift',
|
||||
'contact' => 'Kontakt',
|
||||
'place-order' => 'Bestellung aufgeben',
|
||||
'new-address' => 'Neue Adresse hinzufügen',
|
||||
'save_as_address' => 'Diese Adresse speichern',
|
||||
'apply-coupon' => 'Gutschein einlösen',
|
||||
'amt-payable' => 'Bezahlbarer Betrag',
|
||||
'got' => 'Erhalten',
|
||||
'free' => 'Frei',
|
||||
'coupon-used' => 'Gutschein verwendet',
|
||||
'applied' => 'Angewandt',
|
||||
'back' => 'Zurück',
|
||||
'cash-desc' => 'Barzahlung bei Lieferung',
|
||||
'money-desc' => 'Geldüberweisung',
|
||||
'paypal-desc' => 'Paypal Standard',
|
||||
'free-desc' => 'Dies ist ein kostenloser Versand',
|
||||
'flat-desc' => 'Dies ist eine Flatrate',
|
||||
'password' => 'Passwort',
|
||||
'login-exist-message' => 'Sie haben bereits ein Konto bei uns, melden Sie sich an oder fahren Sie als Gast fort.',
|
||||
'enter-coupon-code' => 'Gutscheincode eingeben'
|
||||
],
|
||||
|
||||
'total' => [
|
||||
'order-summary' => 'Bestellübersicht',
|
||||
'sub-total' => 'Artikel',
|
||||
'grand-total' => 'Gesamtsumme',
|
||||
'delivery-charges' => 'Versandkosten',
|
||||
'tax' => 'Umsatzsteuer',
|
||||
'discount' => 'Rabatt',
|
||||
'price' => 'Preis',
|
||||
'disc-amount' => 'Rabattbetrag',
|
||||
'new-grand-total' => 'Neue Gesamtsumme',
|
||||
'coupon' => 'Gutschein',
|
||||
'coupon-applied' => 'Angewandter Gutschein',
|
||||
'remove-coupon' => 'Gutschein entfernen',
|
||||
'cannot-apply-coupon' => 'Gutschein kann nicht angewendet werden',
|
||||
'invalid-coupon' => 'Gutscheincode ist ungültig.',
|
||||
'success-coupon' => 'Gutscheincode erfolgreich angewendet.',
|
||||
'coupon-apply-issue' => 'Gutscheincode kann nicht angewendet werden.'
|
||||
],
|
||||
|
||||
'success' => [
|
||||
'title' => 'Bestellung erfolgreich aufgegeben',
|
||||
'thanks' => 'Vielen Dank für Ihren Auftrag!',
|
||||
'order-id-info' => 'Ihre Bestellnummer lautet #:order_id',
|
||||
'info' => 'Wir senden Ihnen Ihre Bestelldaten und Tracking-Informationen per E-Mail'
|
||||
]
|
||||
],
|
||||
|
||||
'mail' => [
|
||||
'order' => [
|
||||
'subject' => 'Bestätigung der neuen Bestellung',
|
||||
'heading' => 'Bestellbestätigung!',
|
||||
'dear' => 'Sehr geehrte/r :customer_name',
|
||||
'dear-admin' => 'Sehr geehrte/r :admin_name',
|
||||
'greeting' => 'Danke für Ihre Bestellung :order_id vom :created_at',
|
||||
'greeting-admin' => 'Auftragsnummer :order_id vom :created_at',
|
||||
'summary' => 'Zusammenfassung der Bestellung',
|
||||
'shipping-address' => 'Lieferanschrift',
|
||||
'billing-address' => 'Rechnungsadresse',
|
||||
'contact' => 'Kontakt',
|
||||
'shipping' => 'Versandart',
|
||||
'payment' => 'Zahlungsmethode',
|
||||
'price' => 'Preis',
|
||||
'quantity' => 'Menge',
|
||||
'subtotal' => 'Zwischensumme',
|
||||
'shipping-handling' => 'Versand & Bearbeitung',
|
||||
'tax' => 'Umsatzsteuer',
|
||||
'discount' => 'Rabatt',
|
||||
'grand-total' => 'Gesamtsumme',
|
||||
'final-summary' => 'Vielen Dank für Ihr Interesse an unserem Shop. Nach dem Versand senden wir Ihnen die Sendungsverfolgungsnummer',
|
||||
'help' => 'Wenn Sie Hilfe benötigen, kontaktieren Sie uns bitte unter :support_email',
|
||||
'thanks' => 'Vielen Dank!',
|
||||
'cancel' => [
|
||||
'subject' => 'Bestätigung der Bestellungsstornierung',
|
||||
'heading' => 'Bestellung storniert',
|
||||
'dear' => 'Sehr geehrte/r :customer_name',
|
||||
'greeting' => 'Ihre Bestellung mit der Bestellnummer #:order_id vom :created_at wurde storniert',
|
||||
'summary' => 'Zusammenfassung der Bestellung',
|
||||
'shipping-address' => 'Lieferanschrift',
|
||||
'billing-address' => 'Rechnungsadresse',
|
||||
'contact' => 'Kontakt',
|
||||
'shipping' => 'Versandart',
|
||||
'payment' => 'Zahlungsmethode',
|
||||
'subtotal' => 'Zwischensumme',
|
||||
'shipping-handling' => 'Versand & Bearbeitung',
|
||||
'tax' => 'Umsatzsteuer',
|
||||
'discount' => 'Rabatt',
|
||||
'grand-total' => 'Gesamtsumme',
|
||||
'final-summary' => 'Vielen Dank für Ihr Interesse an unserem Shop',
|
||||
'help' => 'Wenn Sie Hilfe benötigen, kontaktieren Sie uns bitte unter :support_email',
|
||||
'thanks' => 'Vielen Dank!',
|
||||
]
|
||||
],
|
||||
|
||||
'invoice' => [
|
||||
'heading' => 'Ihre Rechnung #:invoice_id für die Bestellung #:order_id',
|
||||
'subject' => 'Rechnung für Ihre Bestellung #:order_id',
|
||||
'summary' => 'Zusammenfassung der Rechnung',
|
||||
],
|
||||
|
||||
'shipment' => [
|
||||
'heading' => 'Sendung #:shipment_id wurde für die Bestellung #:order_id generiert',
|
||||
'inventory-heading' => 'Neue Sendung #:shipment_id wurde für die Bestellung #:order_id generiert',
|
||||
'subject' => 'Versand für Ihre Bestellung #:order_id',
|
||||
'inventory-subject' => 'Für die Bestellung #:order_id wurde eine neue Sendung generiert',
|
||||
'summary' => 'Zusammenfassung der Sendung',
|
||||
'carrier' => 'Zulieferer',
|
||||
'tracking-number' => 'Sendungsnummer',
|
||||
'greeting' => 'Eine Bestellung :order_id wurde aufgelegt am :created_at',
|
||||
],
|
||||
|
||||
'refund' => [
|
||||
'heading' => 'Ihre Rückerstattung #:refund_id für die Bestellung #:order_id',
|
||||
'subject' => 'Rückerstattung für Ihre Bestellung #:order_id',
|
||||
'summary' => 'Zusammenfassung der Rückerstattung',
|
||||
'adjustment-refund' => 'Anpassungsrückerstattung',
|
||||
'adjustment-fee' => 'Anpassungsgebühr'
|
||||
],
|
||||
|
||||
'forget-password' => [
|
||||
'subject' => 'Kundenpasswort zurücksetzen',
|
||||
'dear' => 'Sehr geehrte/r :name',
|
||||
'info' => 'Sie erhalten diese E-Mail, weil wir eine Anfrage zum Zurücksetzen des Passworts für Ihr Konto erhalten haben',
|
||||
'reset-password' => 'Passwort zurücksetzen',
|
||||
'final-summary' => 'Wenn Sie kein Zurücksetzen des Kennworts angefordert haben, sind keine weiteren Maßnahmen erforderlich',
|
||||
'thanks' => 'Vielen Dank!'
|
||||
],
|
||||
|
||||
'customer' => [
|
||||
'new' => [
|
||||
'dear' => 'Sehr geehrte/r :customer_name',
|
||||
'username-email' => 'Nutzername/E-Mail',
|
||||
'subject' => 'Neukundenregistrierung',
|
||||
'password' => 'Passwort',
|
||||
'summary' => 'Ihr Konto wurde erstellt.
|
||||
Ihre Kontodaten weiter unten: ',
|
||||
'thanks' => 'Vielen Dank!',
|
||||
],
|
||||
|
||||
'registration' => [
|
||||
'subject' => 'Neukundenregistrierung',
|
||||
'customer-registration' => 'Kunde erfolgreich registriert',
|
||||
'dear' => 'Sehr geehrte/r :customer_name',
|
||||
'greeting' => 'Willkommen und vielen Dank, dass Sie sich bei uns registriert haben!',
|
||||
'summary' => 'Ihr Konto wurde nun erfolgreich erstellt und Sie können sich mit Ihrer E-Mail-Adresse und Ihrem Passwort anmelden. Nach dem Anmelden können Sie auf andere Dienste zugreifen, einschließlich der Überprüfung früherer Bestellungen, Wunschliste und der Bearbeitung Ihrer Kontoinformationen.',
|
||||
'thanks' => 'Vielen Dank!',
|
||||
],
|
||||
|
||||
'verification' => [
|
||||
'heading' => config('app.name') . ' - E-Mail-Verifizierung',
|
||||
'subject' => 'Bestätigungsmail',
|
||||
'verify' => 'Bestätigen Sie Ihr Konto',
|
||||
'summary' => 'Dies ist die E-Mail, um zu überprüfen, ob die von Ihnen eingegebene E-Mail-Adresse Ihre ist.
|
||||
Klicken Sie unten auf die Schaltfläche "Konto bestätigen", um Ihr Konto zu bestätigen.'
|
||||
],
|
||||
|
||||
'subscription' => [
|
||||
'subject' => 'Abonnement-E-Mail',
|
||||
'greeting' => ' Willkommen zu ' . config('app.name') . ' - E-Mail-Abonnement',
|
||||
'unsubscribe' => 'Abmelden',
|
||||
'summary' => 'Es ist eine Weile her, seit Sie ' . config('app.name') . ' gelesen haben und wir möchten Ihren Posteingang nicht überfluten. Wenn Sie nicht die neuesten
|
||||
E-Mail-Marketing-Nachrichten erhalten möchten, klicken Sie auf die Schaltfläche unten.'
|
||||
]
|
||||
]
|
||||
],
|
||||
|
||||
'webkul' => [
|
||||
'copy-right' => '© Copyright :year Webkul Software, All rights reserved',
|
||||
],
|
||||
|
||||
'response' => [
|
||||
'create-success' => ':name erfolgreich erstellt.',
|
||||
'update-success' => ':name erfolgreich aktualisiert.',
|
||||
'delete-success' => ':name erfolgreich gelöscht.',
|
||||
'submit-success' => ':name erfolgreich eingereicht.'
|
||||
],
|
||||
];
|
||||
|
|
@ -371,6 +371,7 @@ return [
|
|||
'layered-nav-title' => 'Shop By',
|
||||
'price-label' => 'As low as',
|
||||
'remove-filter-link-title' => 'Clear All',
|
||||
'filter-to' => 'to',
|
||||
'sort-by' => 'Sort By',
|
||||
'from-a-z' => 'From A-Z',
|
||||
'from-z-a' => 'From Z-A',
|
||||
|
|
|
|||
|
|
@ -352,6 +352,7 @@ return [
|
|||
'layered-nav-title' => 'Comprado por',
|
||||
'price-label' => 'Tan bajo como',
|
||||
'remove-filter-link-title' => 'Limpiar todo',
|
||||
'filter-to' => 'a',
|
||||
'sort-by' => 'Ordenar por',
|
||||
'from-a-z' => 'De A-Z',
|
||||
'from-z-a' => 'De Z-A',
|
||||
|
|
|
|||
|
|
@ -370,6 +370,7 @@ return [
|
|||
'layered-nav-title' => 'خرید بوسیله ی',
|
||||
'price-label' => 'به اندازه کم',
|
||||
'remove-filter-link-title' => 'همه را پاک کن',
|
||||
'filter-to' => 'to',
|
||||
'sort-by' => 'مرتب سازی بر اساس',
|
||||
'from-a-z' => 'از A-Z',
|
||||
'from-z-a' => 'از Z-A',
|
||||
|
|
|
|||
|
|
@ -375,6 +375,7 @@ return [
|
|||
'layered-nav-title' => 'Winkelen per ',
|
||||
'price-label' => 'Zo laag als',
|
||||
'remove-filter-link-title' => 'Wis alles',
|
||||
'filter-to' => 'tot',
|
||||
'sort-by' => 'Sorteer op',
|
||||
'from-a-z' => 'Van A-Z',
|
||||
'from-z-a' => 'Van Z-A',
|
||||
|
|
|
|||
|
|
@ -363,6 +363,7 @@ return [
|
|||
'layered-nav-title' => 'Compre por',
|
||||
'price-label' => 'Tão baixo quanto',
|
||||
'remove-filter-link-title' => 'Limpar Todos',
|
||||
'filter-to' => 'a',
|
||||
'sort-by' => 'Ordernar por',
|
||||
'from-a-z' => 'De A-Z',
|
||||
'from-z-a' => 'De Z-A',
|
||||
|
|
|
|||
|
|
@ -6,7 +6,14 @@
|
|||
|
||||
@section('seo')
|
||||
<meta name="description" content="{{ trim($category->meta_description) != "" ? $category->meta_description : \Illuminate\Support\Str::limit(strip_tags($category->description), 120, '') }}"/>
|
||||
|
||||
<meta name="keywords" content="{{ $category->meta_keywords }}"/>
|
||||
|
||||
@if (core()->getConfigData('catalog.rich_snippets.categories.enable'))
|
||||
<script type="application/ld+json">
|
||||
{!! app('Webkul\Product\Helpers\SEO')->getCategoryJsonLd($category) !!}
|
||||
</script>
|
||||
@endif
|
||||
@stop
|
||||
|
||||
@section('content-wrapper')
|
||||
|
|
|
|||
|
|
@ -6,7 +6,36 @@
|
|||
|
||||
@section('seo')
|
||||
<meta name="description" content="{{ trim($product->meta_description) != "" ? $product->meta_description : \Illuminate\Support\Str::limit(strip_tags($product->description), 120, '') }}"/>
|
||||
|
||||
<meta name="keywords" content="{{ $product->meta_keywords }}"/>
|
||||
|
||||
@if (core()->getConfigData('catalog.rich_snippets.products.enable'))
|
||||
<script type="application/ld+json">
|
||||
{!! app('Webkul\Product\Helpers\SEO')->getProductJsonLd($product) !!}
|
||||
</script>
|
||||
@endif
|
||||
|
||||
<?php $productBaseImage = app('Webkul\Product\Helpers\ProductImage')->getProductBaseImage($product); ?>
|
||||
|
||||
<meta name="twitter:card" content="summary_large_image" />
|
||||
|
||||
<meta name="twitter:title" content="{{ $product->name }}" />
|
||||
|
||||
<meta name="twitter:description" content="{{ $product->description }}" />
|
||||
|
||||
<meta name="twitter:image:alt" content="" />
|
||||
|
||||
<meta name="twitter:image" content="{{ $productBaseImage['medium_image_url'] }}" />
|
||||
|
||||
<meta property="og:type" content="og:product" />
|
||||
|
||||
<meta property="og:title" content="{{ $product->name }}" />
|
||||
|
||||
<meta property="og:image" content="{{ $productBaseImage['medium_image_url'] }}" />
|
||||
|
||||
<meta property="og:description" content="{{ $product->description }}" />
|
||||
|
||||
<meta property="og:url" content="{{ route('shop.productOrCategory.index', $product->url_key) }}" />
|
||||
@stop
|
||||
|
||||
@section('content-wrapper')
|
||||
|
|
|
|||
|
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
return [
|
||||
'datagrid' => [
|
||||
'actions' => 'Aktionen',
|
||||
'id' => 'Indexspalten haben nur einen Wert größer als Null',
|
||||
|
||||
'massaction' => [
|
||||
'mass-delete-confirm' => 'Möchten Sie die ausgewählten :resource wirklich löschen?',
|
||||
'mass-update-status' => 'Möchten Sie den Status der ausgewählten :resource wirklich aktualisieren?',
|
||||
'delete' => 'Möchten Sie diese Aktion wirklich ausführen?',
|
||||
'edit' => 'Möchten Sie :resource wirklich bearbeiten?',
|
||||
],
|
||||
|
||||
'zero-index' => 'Indexspalten können nur Werte größer als Null haben',
|
||||
'no-records' => 'Keine Aufzeichnungen gefunden',
|
||||
'filter-fields-missing' => 'Einige der erforderlichen Felder sind null. Überprüfen Sie Spalte, Zustand und Wert ordnungsgemäß',
|
||||
'click_on_action' => 'Möchten Sie diese Aktion wirklich ausführen?',
|
||||
'search' => 'Suchen ...',
|
||||
'filter' => 'Filter',
|
||||
'column' => 'Wählen Sie eine Spalte',
|
||||
'condition' => 'Wählen Sie eine Bedingung',
|
||||
'contains' => 'Enthält',
|
||||
'ncontains' => 'Enthält nicht',
|
||||
'equals' => 'Ist gleich',
|
||||
'nequals' => 'Ist nicht gleich',
|
||||
'greater' => 'Größer als',
|
||||
'less' => 'Weniger als',
|
||||
'greatere' => 'Gleich oder größer als',
|
||||
'lesse' => 'Gleich oder weniger als',
|
||||
'value' => 'Wählen Sie einen Wert',
|
||||
'true' => 'Wahr / Aktiv',
|
||||
'false' => 'Falsch / Inaktiv',
|
||||
'between' => 'Ist zwischen',
|
||||
'apply' => 'Anwenden',
|
||||
'items-per-page' => 'Einträge pro Seite',
|
||||
'value-here' => 'Wert hier',
|
||||
'numeric-value-here' => 'Numerischer Wert hier',
|
||||
'submit' => 'Bestätigen'
|
||||
]
|
||||
];
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
'enter-attribute' => 'Enter :attribute',
|
||||
'select-attribute' => 'Select :attribute'
|
||||
];
|
||||
|
|
@ -3,10 +3,14 @@ import accounting from 'accounting';
|
|||
import VueCarousel from 'vue-carousel';
|
||||
import VueToast from 'vue-toast-notification';
|
||||
import 'vue-toast-notification/dist/index.css';
|
||||
import messagesAr from 'vee-validate/dist/locale/ar';
|
||||
import de from 'vee-validate/dist/locale/de';
|
||||
import ar from 'vee-validate/dist/locale/ar';
|
||||
import VeeValidate, { Validator } from 'vee-validate';
|
||||
import axios from 'axios';
|
||||
|
||||
window.axios = require("axios");
|
||||
window.VeeValidate = require("vee-validate");
|
||||
|
||||
window.axios = axios;
|
||||
window.VeeValidate = VeeValidate;
|
||||
window.jQuery = window.$ = require("jquery");
|
||||
window.BootstrapSass = require("bootstrap-sass");
|
||||
|
||||
|
|
@ -17,7 +21,8 @@ Vue.prototype.$http = axios;
|
|||
|
||||
Vue.use(VeeValidate, {
|
||||
dictionary: {
|
||||
ar: messagesAr
|
||||
ar: ar,
|
||||
de: de,
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -198,6 +198,8 @@ return [
|
|||
'removed' => 'تمت إزالة العنصر بنجاح من قائمة المقارنة',
|
||||
'already_added' => 'تمت إضافة العنصر بالفعل لمقارنة القائمة',
|
||||
'empty-text' => "ليس لديك أي عناصر في قائمة المقارنة الخاصة بك",
|
||||
'product_image' => 'Product Image',
|
||||
'actions' => 'Actions',
|
||||
],
|
||||
'login-form' => [
|
||||
'sign-up' => 'سجل',
|
||||
|
|
|
|||
|
|
@ -0,0 +1,295 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
'admin' => [
|
||||
'system' => [
|
||||
'velocity' => [
|
||||
'general' => 'Allgemein',
|
||||
'category' => 'Kategorie',
|
||||
'settings' => 'Einstellungen',
|
||||
'extension_name' => 'Velocity Theme',
|
||||
'error-module-inactive' => 'Warnung: Der Status des Velocity-Themes ist inaktiv',
|
||||
],
|
||||
|
||||
'settings' => [
|
||||
'channels'=> [
|
||||
'subscription_bar' => 'Inhalt der Abonnementleiste'
|
||||
],
|
||||
],
|
||||
|
||||
'general' => [
|
||||
'status' => 'Status',
|
||||
'active' => 'Aktive',
|
||||
'inactive' => 'Inaktiv',
|
||||
],
|
||||
'category' => [
|
||||
'all' => 'Alle',
|
||||
'left' => 'Links',
|
||||
'right' => 'Rechts',
|
||||
'active' => 'Aktiv',
|
||||
'custom' => 'Benutzerdefiniert',
|
||||
'inactive' => 'Inaktiv',
|
||||
'image-alignment' => 'Bildausrichtung',
|
||||
'icon-status' => 'Kategorie Symbol Status',
|
||||
'image-status' => 'Kategorie Bild Status',
|
||||
'sub-category-show' => 'Unterkategorie anzeigen',
|
||||
'image-height' => 'Bild Höhe [in Pixel]',
|
||||
'image-width' => 'Bild Breite [in Pixel]',
|
||||
'show-tooltip' => 'Tooltip der Kategorie anzeigen',
|
||||
'num-sub-category' => 'Anzahl der Unterkategorien',
|
||||
]
|
||||
],
|
||||
'layouts' => [
|
||||
'velocity' => 'Velocity',
|
||||
'cms-pages' => 'CMS Seiten',
|
||||
'meta-data' => 'Metadaten',
|
||||
'category-menu' => 'Kategoriemenü',
|
||||
'header-content' => 'Header-Inhalt',
|
||||
],
|
||||
'contents' => [
|
||||
'self' => 'Selbst',
|
||||
'active' => 'Aktiv',
|
||||
'new-tab' => 'Neuer Tab',
|
||||
'inactive' => 'Inaktiv',
|
||||
'title' => 'Inhaltsangabe',
|
||||
'select' => '-- Auswählen --',
|
||||
'add-title' => 'Inhalt hinzufügen',
|
||||
'btn-add-content' => 'Inhalt hinzufügen',
|
||||
'save-btn-title' => 'Inhalt speichern',
|
||||
'autocomplete' => '[automatisch vervollständigen]',
|
||||
'no-result-found' => 'Kein Eintrag gefunden.',
|
||||
'search-hint' => 'Produkt hier suchen...',
|
||||
'mass-delete-success' => 'Ausgewählter Inhalt erfolgreich gelöscht.',
|
||||
'tab' => [
|
||||
'page' => 'Seiteneinstellung',
|
||||
'content' => 'Inhaltseinstellung',
|
||||
'meta_content' => 'Meta Daten',
|
||||
],
|
||||
'page' => [
|
||||
'title' => 'Titel',
|
||||
'status' => 'Status',
|
||||
'position' => 'Position',
|
||||
],
|
||||
'content' => [
|
||||
'content-type' => 'Inhaltstyp',
|
||||
'custom-title' => 'Benutzerdefinierter Titel',
|
||||
'category-slug' => 'Kategorie Slug',
|
||||
'link-target' => 'Seitenverknüpfungsziel',
|
||||
'custom-product' => 'Shop Produkte',
|
||||
'custom-heading' => 'Benutzerdefinierte Überschrift',
|
||||
'catalog-type' => 'Produktkatalogtyp',
|
||||
'static-description' => 'Inhaltsbeschreibung',
|
||||
'page-link' => 'Seiten Link [Bsp: http://example.com/../../]',
|
||||
],
|
||||
'datagrid' => [
|
||||
'id' => 'Id',
|
||||
'title' => 'Titel',
|
||||
'status' => 'Status',
|
||||
'position' => 'Position',
|
||||
'content-type' => 'Inhaltstyp',
|
||||
]
|
||||
],
|
||||
'meta-data' => [
|
||||
'footer' => 'Fusszeile',
|
||||
'title' => 'Velocity Metadaten',
|
||||
'activate-slider' => 'Slider aktivieren',
|
||||
'home-page-content' => 'Inhalt der Startseite',
|
||||
'footer-left-content' => 'Fußzeile Linker Inhalt',
|
||||
'subscription-content' => 'Abonnementleiste Inhalt',
|
||||
'sidebar-categories' => 'Seitenleisten-Kategorien',
|
||||
'footer-left-raw-content' => '<p>Wir lieben es, Software zu erstellen und die Probleme der realen Welt mit den Binärdateien zu lösen. Wir fühlen uns unseren Zielen sehr verpflichtet. Wir investieren unsere Ressourcen, um benutzerfreundliche Software und Anwendungen von Weltklasse für das Unternehmensgeschäft mit erstklassiger Technologie zu entwickeln.</p>',
|
||||
'slider-path' => 'Slider Pfad',
|
||||
'category-logo' => 'Kategorielogo',
|
||||
'product-policy' => 'Produktrichtlinie',
|
||||
'update-meta-data' => 'Metadaten aktualisieren',
|
||||
'product-view-image' => 'Produktansicht Bild',
|
||||
'advertisement-two' => 'Werbung Zwei Bilder',
|
||||
'advertisement-one' => 'Werbung Eins Bilder',
|
||||
'footer-middle-content' => 'Fußzeile Mittlerer Inhalt',
|
||||
'advertisement-four' => 'Werbung Vier Bilder',
|
||||
'advertisement-three' => 'Werbung Drei Bilder',
|
||||
'images' => 'Bilder',
|
||||
'general' => 'Allgemein',
|
||||
'add-image-btn-title' => 'Bild hinzufügen'
|
||||
],
|
||||
'category' => [
|
||||
'save-btn-title' => 'Menü speichern',
|
||||
'title' => 'Kategoriemenüliste',
|
||||
'add-title' => 'Menüinhalt hinzufügen',
|
||||
'edit-title' => 'Menüinhalt bearbeiten',
|
||||
'btn-add-category' => 'Kategorieinhalt hinzufügen',
|
||||
'datagrid' => [
|
||||
'category-id' => 'Kategorie Id',
|
||||
'category-name' => 'Kategorie Name',
|
||||
'category-icon' => 'Kategorie Symbol',
|
||||
'category-status' => 'Status',
|
||||
],
|
||||
'tab' => [
|
||||
'general' => 'Allgemein',
|
||||
],
|
||||
'status' => 'Status',
|
||||
'active' => 'Aktiv',
|
||||
'inactive' => 'Inaktiv',
|
||||
'select' => '-- Auswählen --',
|
||||
'icon-class' => 'Symbol Klasse',
|
||||
'select-category' => 'Kategorie auswählen',
|
||||
'tooltip-content' => 'Tooltip-Inhalt',
|
||||
'mass-delete-success' => 'Ausgewähltes Kategorienmenü erfolgreich gelöscht.',
|
||||
],
|
||||
'general' => [
|
||||
'locale_logo' => 'Logo Sprache',
|
||||
],
|
||||
],
|
||||
|
||||
'home' => [
|
||||
'view-all' => 'Alle ansehen',
|
||||
'add-to-cart' => 'In den Warenkorb legen',
|
||||
'hot-categories' => 'Trend Kategorien',
|
||||
'payment-methods' => 'Zahlungsmethoden',
|
||||
'customer-reviews' => 'Kundenbewertungen',
|
||||
'shipping-methods' => 'Versandarten',
|
||||
'popular-categories' => 'Beliebte Kategorien',
|
||||
],
|
||||
|
||||
'header' => [
|
||||
'cart' => 'Warenkorb',
|
||||
'cart' => 'Warenkorb',
|
||||
'guest' => 'Gast',
|
||||
'logout' => 'Ausloggen',
|
||||
'title' => 'Konto',
|
||||
'account' => 'Konto',
|
||||
'profile' => 'Profil',
|
||||
'wishlist' => 'Wunschzettel',
|
||||
'all-categories' => 'Alle Kategorien',
|
||||
'search-text' => 'Nach Produkten suchen',
|
||||
'welcome-message' => 'Herzlich willkommen, :customer_name',
|
||||
'dropdown-text' => 'Verwalten Sie Warenkorb, Bestellungen und Wunschliste',
|
||||
],
|
||||
|
||||
'menu-navbar' => [
|
||||
'text-more' => 'Mehr',
|
||||
'text-category' => 'Kategorien',
|
||||
],
|
||||
|
||||
'minicart' => [
|
||||
'cart' => 'Warenkorb',
|
||||
'view-cart' => 'Warenkorb ansehen',
|
||||
],
|
||||
|
||||
'checkout' => [
|
||||
'qty' => 'Menge',
|
||||
'checkout' => 'Bestellen',
|
||||
'cart' => [
|
||||
'view-cart' => 'Warenkorb ansehen',
|
||||
'cart-summary' => 'Warenkorb Zusammenfassung',
|
||||
],
|
||||
'qty' => 'Menge',
|
||||
'items' => 'Artikel',
|
||||
'subtotal' => 'Zwischensumme',
|
||||
'sub-total' => 'Zwischensumme',
|
||||
'proceed' => 'Zur Kasse',
|
||||
],
|
||||
|
||||
'customer' => [
|
||||
'compare' => [
|
||||
'text' => 'Vergleichen',
|
||||
'compare_similar_items' => 'Ähnliche Artikel vergleichen',
|
||||
'added' => 'Element erfolgreich zur Vergleichsliste hinzugefügt',
|
||||
'already_added' => 'Artikel bereits zur Vergleichsliste hinzugefügt',
|
||||
'removed' => 'Element erfolgreich aus Vergleichsliste entfernt',
|
||||
'empty-text' => "Sie haben keine Elemente in Ihrer Vergleichsliste",
|
||||
'product_image' => 'Produktbild',
|
||||
'actions' => 'Aktionen',
|
||||
],
|
||||
'login-form' => [
|
||||
'sign-up' => 'Anmelden',
|
||||
'new-customer' => 'Neukunde',
|
||||
'customer-login' => 'Kundenlogin',
|
||||
'registered-user' => 'Registrierter Nutzer',
|
||||
'your-email-address' => 'Ihre E-mail-Adresse',
|
||||
'form-login-text' => 'Wenn Sie ein Konto haben, melden Sie sich mit Ihrer E-Mail-Adresse an.',
|
||||
],
|
||||
'signup-form' => [
|
||||
'login' => 'Anmelden',
|
||||
'become-user' => 'Benutzer werden',
|
||||
'user-registration' => 'Benutzer Registration',
|
||||
'form-sginup-text' => 'Wenn Sie neu in unserem Shop sind, freuen wir uns, Sie als Mitglied zu begrüßen zu dürfen.',
|
||||
],
|
||||
'forget-password' => [
|
||||
'login' => 'Anmelden',
|
||||
'forgot-password' => 'Passwort vergessen',
|
||||
'recover-password' => 'Passwort wiederherstellen',
|
||||
'recover-password-text' => 'Wenn Sie Ihr Passwort vergessen haben, stellen Sie es durch Eingabe Ihrer E-Mail-Adresse wieder her.',
|
||||
]
|
||||
],
|
||||
|
||||
'error' => [
|
||||
'go-to-home' => 'Zur Startseite',
|
||||
'page-lost-short' => 'Inhalt verloren',
|
||||
'something_went_wrong' => 'Etwas ist schief gelaufen',
|
||||
'page-lost-description' => "Die gesuchte Seite ist nicht verfügbar. Versuchen Sie erneut zu suchen oder verwenden Sie die Schaltfläche Zurück.",
|
||||
],
|
||||
|
||||
'products' => [
|
||||
'text' => 'Produkte',
|
||||
'details' => 'Details',
|
||||
'reviews-title' => 'Bewertungen',
|
||||
'reviewed' => 'Bewertet',
|
||||
'review-by' => 'Bewertung durch',
|
||||
'quick-view' => 'Schnellansicht',
|
||||
'not-available' => 'Nicht verfügbar',
|
||||
'submit-review' => 'Bewertung abschicken',
|
||||
'ratings' => ':totalRatings Sterne',
|
||||
'reviews-count' => ':totalReviews Bewertungen',
|
||||
'customer-rating' => 'Kundenbewertung',
|
||||
'more-infomation' => 'Mehr Informationen',
|
||||
'view-all-reviews' => 'Alle Bewertungen anzeigen',
|
||||
'write-your-review' => 'Schreiben Sie Ihre Bewertung',
|
||||
'short-description' => 'Kurze Beschreibungen',
|
||||
'recently-viewed' => 'Kürzlich angesehene Produkte',
|
||||
'be-first-review' => 'Sei der erste der eine Bewertung schreibt',
|
||||
],
|
||||
|
||||
'shop' => [
|
||||
'gender' => [
|
||||
'male' => 'Männlich',
|
||||
'other' => 'Andere',
|
||||
'female' => 'Weiblich',
|
||||
],
|
||||
'general' => [
|
||||
'no' => 'Nein',
|
||||
'yes' => 'Ja',
|
||||
'view' => 'Ansicht',
|
||||
'filter' => 'Filter',
|
||||
'orders' => 'Bestellungen',
|
||||
'update' => 'Aktualisieren',
|
||||
'reviews' => 'Bewertungen',
|
||||
'addresses' => 'Adressen',
|
||||
'top-brands' => 'Top Marken',
|
||||
'new-password' => 'Neues Passwort',
|
||||
'downloadables' => 'Herunterladbare Produkte',
|
||||
'confirm-new-password' => 'Bestätigen Sie Ihr neues Passwort',
|
||||
'enter-current-password' => 'Geben Sie Ihr aktuelles Passwort ein',
|
||||
|
||||
'alert' => [
|
||||
'info' => 'Information',
|
||||
'error' => 'Fehler',
|
||||
'success' => 'Erfolg',
|
||||
'warning' => 'Warnung',
|
||||
],
|
||||
],
|
||||
'wishlist' => [
|
||||
'add-wishlist-text' => 'Produkt zur Wunschliste hinzufügen',
|
||||
'remove-wishlist-text' => 'Produkt von der Wunschliste entfernen'
|
||||
]
|
||||
],
|
||||
|
||||
'responsive' => [
|
||||
'header' => [
|
||||
'languages' => 'Sprachen',
|
||||
'greeting' => 'Herzlich willkommen, :customer !',
|
||||
]
|
||||
],
|
||||
]
|
||||
|
||||
?>
|
||||
|
|
@ -198,6 +198,8 @@ return [
|
|||
'already_added' => 'Item already added to compare list',
|
||||
'removed' => 'Item successfully removed from compare list',
|
||||
'empty-text' => "You don't have any items in your compare list",
|
||||
'product_image' => 'Product Image',
|
||||
'actions' => 'Actions',
|
||||
],
|
||||
'login-form' => [
|
||||
'sign-up' => 'Sign up',
|
||||
|
|
|
|||
|
|
@ -198,6 +198,8 @@ return [
|
|||
'already_added' => 'مورد در حال حاضر برای مقایسه لیست اضافه شده است',
|
||||
'removed' => 'مورد با موفقیت از لیست مقایسه حذف شد',
|
||||
'empty-text' => "شما هیچ موردی را در لیست مقایسه خود ندارید",
|
||||
'product_image' => 'Product Image',
|
||||
'actions' => 'Actions',
|
||||
],
|
||||
'login-form' => [
|
||||
'sign-up' => 'ثبت نام',
|
||||
|
|
|
|||
|
|
@ -198,6 +198,8 @@ return [
|
|||
'already_added' => 'Item already added to compare list',
|
||||
'removed' => 'Item successfully removed from compare list',
|
||||
'empty-text' => "You don't have any items in your compare list",
|
||||
'product_image' => 'Product Image',
|
||||
'actions' => 'Actions',
|
||||
],
|
||||
'login-form' => [
|
||||
'sign-up' => 'Registreren',
|
||||
|
|
|
|||
|
|
@ -200,6 +200,8 @@ return [
|
|||
'added' => 'Item adicionado com sucesso à lista de comparação',
|
||||
'removed' => 'Item removido com sucesso da lista de comparação',
|
||||
'empty-text' => "Você não possui nenhum item na sua lista de comparação",
|
||||
'product_image' => 'Imagem do Produto',
|
||||
'actions' => 'Ações',
|
||||
],
|
||||
'login-form' => [
|
||||
'sign-up' => 'Cadastrar',
|
||||
|
|
|
|||
|
|
@ -341,10 +341,34 @@
|
|||
let address = this.allAddress.forEach(address => {
|
||||
if (address.id == this.address.billing.address_id) {
|
||||
this.address.billing.address1 = [address.address1];
|
||||
|
||||
if (address.email) {
|
||||
this.address.billing.email = address.email;
|
||||
}
|
||||
|
||||
if (address.first_name) {
|
||||
this.address.billing.first_name = address.first_name;
|
||||
}
|
||||
|
||||
if (address.last_name) {
|
||||
this.address.billing.last_name = address.last_name;
|
||||
}
|
||||
}
|
||||
|
||||
if (address.id == this.address.shipping.address_id) {
|
||||
this.address.shipping.address1 = [address.address1];
|
||||
|
||||
if (address.email) {
|
||||
this.address.shipping.email = address.email;
|
||||
}
|
||||
|
||||
if (address.first_name) {
|
||||
this.address.shipping.first_name = address.first_name;
|
||||
}
|
||||
|
||||
if (address.last_name) {
|
||||
this.address.shipping.last_name = address.last_name;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
@ -499,17 +523,19 @@
|
|||
|
||||
backToSavedBillingAddress: function () {
|
||||
this.new_billing_address = false;
|
||||
setTimeout(() => {
|
||||
this.validateForm('address-form');
|
||||
}, 0);
|
||||
this.validateFormAfterAction()
|
||||
},
|
||||
|
||||
backToSavedShippingAddress: function () {
|
||||
this.new_shipping_address = false;
|
||||
this.validateFormAfterAction()
|
||||
},
|
||||
|
||||
validateFormAfterAction: function () {
|
||||
setTimeout(() => {
|
||||
this.validateForm('address-form');
|
||||
}, 0);
|
||||
},
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -55,7 +55,9 @@
|
|||
|
||||
<div class="col-lg-6 col-md-12 address-holder pl0">
|
||||
<div class="card">
|
||||
<div class="card-body add-address-button">
|
||||
<div
|
||||
@click="validateFormAfterAction"
|
||||
class="card-body add-address-button">
|
||||
<div class="cursor-pointer" @click="newBillingAddress()">
|
||||
<i class="material-icons">
|
||||
add_circle_outline
|
||||
|
|
@ -79,11 +81,11 @@
|
|||
<div class="mt10 mb10" v-if="address.billing.address_id">
|
||||
<span class="checkbox fs16 display-inbl">
|
||||
<input
|
||||
type="checkbox"
|
||||
class="ml0"
|
||||
type="checkbox"
|
||||
id="billing[use_for_shipping]"
|
||||
name="billing[use_for_shipping]"
|
||||
@change="setTimeout(() => validateForm('address-form'), 0)"
|
||||
@change="validateFormAfterAction"
|
||||
v-model="address.billing.use_for_shipping" />
|
||||
|
||||
<span class="ml-5">
|
||||
|
|
@ -183,7 +185,9 @@
|
|||
|
||||
<div class="col-lg-6 address-holder pl0">
|
||||
<div class="card">
|
||||
<div class="card-body add-address-button">
|
||||
<div
|
||||
@click="validateFormAfterAction"
|
||||
class="card-body add-address-button">
|
||||
<div class="cursor-pointer" @click="newShippingAddress()">
|
||||
<i class="material-icons">
|
||||
add_circle_outline
|
||||
|
|
|
|||
|
|
@ -206,7 +206,7 @@
|
|||
v-validate="'required'"
|
||||
name="shipping[postcode]"
|
||||
v-model="address.shipping.postcode"
|
||||
@change="validateForm('address-form')"
|
||||
@keyup="validateForm('address-form')"
|
||||
data-vv-as=""{{ __('shop::app.checkout.onepage.postcode') }}"" />
|
||||
|
||||
<span class="control-error" v-if="errors.has('address-form.shipping[postcode]')">
|
||||
|
|
@ -498,7 +498,7 @@
|
|||
name="billing[phone]"
|
||||
v-validate="'required'"
|
||||
v-model="address.billing.phone"
|
||||
@change="validateForm('address-form')"
|
||||
@keyup="validateForm('address-form')"
|
||||
data-vv-as=""{{ __('shop::app.checkout.onepage.phone') }}"" />
|
||||
|
||||
<span class="control-error" v-if="errors.has('address-form.billing[phone]')">
|
||||
|
|
|
|||
|
|
@ -40,19 +40,19 @@
|
|||
|
||||
array_splice($comparableAttributes, 1, 0, [[
|
||||
'code' => 'image',
|
||||
'admin_name' => 'Product Image'
|
||||
'admin_name' => __('velocity::app.customer.compare.product_image')
|
||||
]]);
|
||||
|
||||
array_splice($comparableAttributes, 2, 0, [[
|
||||
'code' => 'addToCartHtml',
|
||||
'admin_name' => 'Actions'
|
||||
'admin_name' => __('velocity::app.customer.compare.actions')
|
||||
]]);
|
||||
@endphp
|
||||
|
||||
@foreach ($comparableAttributes as $attribute)
|
||||
<tr>
|
||||
<td>
|
||||
<span class="fs16">{{ $attribute['admin_name'] }}</span>
|
||||
<span class="fs16">{{ isset($attribute['name']) ? $attribute['name'] : $attribute['admin_name'] }}</span>
|
||||
</td>
|
||||
|
||||
<td :key="`title-${index}`" v-for="(product, index) in products">
|
||||
|
|
|
|||
|
|
@ -118,7 +118,7 @@
|
|||
:value="sliderConfig.priceFrom"
|
||||
id="price_from" />
|
||||
|
||||
<label class="col text-center" for="to">to</label>
|
||||
<label class="col text-center" for="to">{{ __('shop::app.products.filter-to') }}</label>
|
||||
<input
|
||||
type="text"
|
||||
disabled
|
||||
|
|
|
|||
|
|
@ -24,7 +24,36 @@
|
|||
|
||||
@section('seo')
|
||||
<meta name="description" content="{{ trim($product->meta_description) != "" ? $product->meta_description : str_limit(strip_tags($product->description), 120, '') }}"/>
|
||||
|
||||
<meta name="keywords" content="{{ $product->meta_keywords }}"/>
|
||||
|
||||
@if (core()->getConfigData('catalog.rich_snippets.products.enable'))
|
||||
<script type="application/ld+json">
|
||||
{!! app('Webkul\Product\Helpers\SEO')->getProductJsonLd($product) !!}
|
||||
</script>
|
||||
@endif
|
||||
|
||||
<?php $productBaseImage = app('Webkul\Product\Helpers\ProductImage')->getProductBaseImage($product); ?>
|
||||
|
||||
<meta name="twitter:card" content="summary_large_image" />
|
||||
|
||||
<meta name="twitter:title" content="{{ $product->name }}" />
|
||||
|
||||
<meta name="twitter:description" content="{{ $product->description }}" />
|
||||
|
||||
<meta name="twitter:image:alt" content="" />
|
||||
|
||||
<meta name="twitter:image" content="{{ $productBaseImage['medium_image_url'] }}" />
|
||||
|
||||
<meta property="og:type" content="og:product" />
|
||||
|
||||
<meta property="og:title" content="{{ $product->name }}" />
|
||||
|
||||
<meta property="og:image" content="{{ $productBaseImage['medium_image_url'] }}" />
|
||||
|
||||
<meta property="og:description" content="{{ $product->description }}" />
|
||||
|
||||
<meta property="og:url" content="{{ route('shop.productOrCategory.index', $product->url_key) }}" />
|
||||
@stop
|
||||
|
||||
@push('css')
|
||||
|
|
|
|||
|
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Authentication Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are used during authentication for various
|
||||
| messages that we need to display to the user. You are free to modify
|
||||
| these language lines according to your application's requirements.
|
||||
|
|
||||
*/
|
||||
|
||||
'failed' => 'Diese Zugangsdaten stimmen nicht mit unseren Aufzeichnungen überein.',
|
||||
'throttle' => 'Zu viele Anmeldeversuche. Bitte versuchen Sie es in :seconds erneut.',
|
||||
|
||||
];
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Pagination Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are used by the paginator library to build
|
||||
| the simple pagination links. You are free to change them to anything
|
||||
| you want to customize your views to better match your application.
|
||||
|
|
||||
*/
|
||||
|
||||
'previous' => '« Vorherige',
|
||||
'next' => 'Nächste »',
|
||||
|
||||
];
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Password Reset Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are the default lines which match reasons
|
||||
| that are given by the password broker for a password update attempt
|
||||
| has failed, such as for an invalid token or invalid new password.
|
||||
|
|
||||
*/
|
||||
|
||||
'password' => 'Die Passwörter müssen aus mindestens sechs Zeichen bestehen und mit der Bestätigung übereinstimmen.',
|
||||
'reset' => 'Ihr Passwort wurde zurückgesetzt!',
|
||||
'sent' => 'Wir haben Ihnen einen Link zum Zurücksetzen des Passworts per E-Mail geschickt!',
|
||||
'token' => 'Dieses Token zum Zurücksetzen des Passworts ist ungültig.',
|
||||
'user' => 'Wir können keinen Benutzer mit dieser E-Mail-Adresse finden.',
|
||||
|
||||
];
|
||||
|
|
@ -0,0 +1,146 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Validation Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines contain the default error messages used by
|
||||
| the validator class. Some of these rules have multiple versions such
|
||||
| as the size rules. Feel free to tweak each of these messages here.
|
||||
|
|
||||
*/
|
||||
|
||||
'accepted' => 'Das Attribut :attribute muss akzeptiert werden.',
|
||||
'active_url' => 'Das :attribute ist keine gültige URL.',
|
||||
'after' => 'Das Attribut :attribute muss ein Datum nach :date sein.',
|
||||
'after_or_equal' => 'Das Attribut :attribute muss ein Datum nach oder gleich :date sein.',
|
||||
'alpha' => 'Das Attribut :attribute darf nur Buchstaben enthalten.',
|
||||
'alpha_dash' => 'Das Attribut :darf nur Buchstaben, Zahlen, Striche und Unterstriche enthalten.',
|
||||
'alpha_num' => 'Das Attribut :attribute darf nur Buchstaben und Zahlen enthalten.',
|
||||
'array' => 'Das :attribute muss ein Array sein.',
|
||||
'before' => 'Das Attribut :attribute muss ein Datum vor :date sein.',
|
||||
'before_or_equal' => 'Das Attribut :attribute muss ein Datum vor oder gleich :date sein.',
|
||||
'between' => [
|
||||
'numeric' => 'Das Attribut :attribute muss zwischen :min und :max liegen.',
|
||||
'file' => 'Das Attribut :attribute muss zwischen :min und :max Kilobyte liegen.',
|
||||
'string' => 'Das Attribut :attribute muss zwischen :min und :max Zeichen liegen.',
|
||||
'array' => 'Das Attribut :attribute muss zwischen :min und :max Elemente haben.',
|
||||
],
|
||||
'boolean' => 'Das Feld :attribute muss wahr oder falsch sein.',
|
||||
'confirmed' => 'Die Bestätigung des :attribute stimmt nicht überein.',
|
||||
'date' => 'Das Attribut :attribute ist kein gültiges Datum.',
|
||||
'date_format' => 'Das Attribut :attribute entspricht nicht dem Format :format.',
|
||||
'different' => 'Das Attribut :attribute und :other müssen unterschiedlich sein.',
|
||||
'digits' => 'Das Attribut :attribute muss aus Ziffern bestehen.',
|
||||
'digits_between' => 'Das Attribut :attribute muss zwischen :min und :max Ziffern liegen.',
|
||||
'dimensions' => 'Das Attribut :attribute hat ungültige Bildabmessungen.',
|
||||
'distinct' => 'Das Feld :attribute hat einen doppelten Wert.',
|
||||
'email' => 'Das Attribut :attribute muss eine gültige E-Mail-Adresse sein.',
|
||||
'exists' => 'Das ausgewählte :attribute ist ungültig.',
|
||||
'file' => 'Das Attribut :attribute muss eine Datei sein.',
|
||||
'filled' => 'Das Feld :attribute muss einen Wert haben.',
|
||||
'gt' => [
|
||||
'numeric' => 'Das Attribut :attribute muss größer als :value sein.',
|
||||
'file' => 'Das Attribut :attribute muss größer als der Wert :value kilobytes sein.',
|
||||
'string' => 'Das Attribut :attribute muss größer als :value Zeichen sein.',
|
||||
'array' => 'Das Attribut :attribute muss mehr als :value items haben.',
|
||||
],
|
||||
'gte' => [
|
||||
'numeric' => 'Das Attribut :attribute muss größer oder gleich :value sein.',
|
||||
'file' => 'Das Attribut :attribute muss größer oder gleich :value kilobytes sein.',
|
||||
'string' => 'Das Attribut :attribute muss größer oder gleich :value Zeichen sein.',
|
||||
'array' => 'Das Attribut :attribute muss :value items oder mehr haben.',
|
||||
],
|
||||
'image' => 'Das Attribut :attribute muss ein Bild sein.',
|
||||
'in' => 'Das ausgewählte :attribute ist ungültig.',
|
||||
'in_array' => 'Das Feld :attribute existiert nicht in :other.',
|
||||
'integer' => 'Das Attribut :attribute muss eine ganze Zahl sein.',
|
||||
'ip' => 'Das Attribut :attribute muss eine gültige IP-Adresse sein.',
|
||||
'ipv4' => 'Das :attribute muss eine gültige IPv4-Adresse sein.',
|
||||
'ipv6' => 'Das :attribute muss eine gültige IPv6-Adresse sein.',
|
||||
'json' => 'Das :attribute muss ein gültiger JSON-String sein.',
|
||||
'lt' => [
|
||||
'numeric' => 'Das Attribut :attribute muss kleiner als :value sein.',
|
||||
'file' => 'Das Attribut :attribute muss kleiner als der Wert :value kilobytes sein.',
|
||||
'string' => 'Das Attribut :attribute muss kleiner als :value Zeichen sein.',
|
||||
'array' => 'Das Attribut :attribute muss kleiner als :value items sein.',
|
||||
],
|
||||
'lte' => [
|
||||
'numeric' => 'Das Attribut :attribute muss kleiner oder gleich :value sein.',
|
||||
'file' => 'Das Attribut :attribute muss kleiner oder gleich :value kilobytes sein.',
|
||||
'string' => 'Das Attribut :attribute muss kleiner oder gleich :value Zeichen sein.',
|
||||
'array' => 'Das Attribut :attribute darf nicht mehr als :value items haben.',
|
||||
],
|
||||
'max' => [
|
||||
'numeric' => 'Das Attribut :attribute darf nicht größer als :max sein.',
|
||||
'file' => 'Das Attribut :attribute darf nicht größer als :max Kilobytes sein.',
|
||||
'string' => 'Das Attribut :attribute darf nicht größer als :max Zeichen sein.',
|
||||
'array' => 'Das Attribut :attribute darf nicht mehr als :max Elemente enthalten.',
|
||||
],
|
||||
'mimes' => 'Das Attribut :attribute muss eine Datei vom Typ: :values sein.',
|
||||
'mimetypes' => 'Das Attribut :attribute muss eine Datei vom Typ: :values sein.',
|
||||
'min' => [
|
||||
'numeric' => 'Das Attribut :attribute muss mindestens :min. sein.',
|
||||
'file' => 'Das Attribut :attribute muss mindestens :min Kilobytes betragen.',
|
||||
'string' => 'Das Attribut :attribute muss aus mindestens :min Zeichen bestehen.',
|
||||
'array' => 'Das Attribut :attribute muss mindestens :min Elemente enthalten.',
|
||||
],
|
||||
'not_in' => 'Das ausgewählte :attribute ist ungültig.',
|
||||
'not_regex' => 'Das Format des :attribute ist ungültig.',
|
||||
'numeric' => 'Das Attribut :attribute muss eine Zahl sein.',
|
||||
'present' => 'Das Feld :attribute muss vorhanden sein.',
|
||||
'regex' => 'Das Format des :attribute ist ungültig.',
|
||||
'required' => 'Das Feld :attribute ist erforderlich.',
|
||||
'required_if' => 'Das Feld :attribute wird benötigt, wenn :other der Wert :value ist.',
|
||||
'required_unless' => 'Das Feld :attribute ist erforderlich, es sei denn, :other steht in :values.',
|
||||
'required_with' => 'Das Feld :attribute ist erforderlich, wenn :values vorhanden ist.',
|
||||
'required_with_all' => 'Das Feld :attribute ist erforderlich, wenn :values vorhanden ist.',
|
||||
'required_without' => 'Das Attributfeld :attribute ist erforderlich, wenn :values nicht vorhanden ist.',
|
||||
'required_without_all' => 'Das Attributfeld :attribute wird benötigt, wenn keiner der :values vorhanden ist.',
|
||||
'same' => 'Das Attribut :attribute und :other müssen übereinstimmen.',
|
||||
'size' => [
|
||||
'numeric' => 'Das Attribut :attribute muss :size sein.',
|
||||
'file' => 'Das Attribut :attribute muss :size kilobytes sein.',
|
||||
'string' => 'Das Attribut :attribute muss :size Zeichen sein.',
|
||||
'array' => 'Das Attribut :attribute muss :size Elemente enthalten.',
|
||||
],
|
||||
'string' => 'Das :attribute muss eine Zeichenkette sein.',
|
||||
'timezone' => 'Das Attribut :attribute muss eine gültige Zone sein.',
|
||||
'unique' => 'Das Attribut :attribute wurde bereits vergeben.',
|
||||
'uploaded' => 'Das :attribute konnte nicht hochgeladen werden.',
|
||||
'url' => 'Das Format des :attribute ist ungültig.',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Custom Validation Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify custom validation messages for attributes using the
|
||||
| convention "attribute.rule" to name the lines. This makes it quick to
|
||||
| specify a specific custom language line for a given attribute rule.
|
||||
|
|
||||
*/
|
||||
|
||||
'custom' => [
|
||||
'attribute-name' => [
|
||||
'rule-name' => 'kundenspezifische Nachricht',
|
||||
],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Custom Validation Attributes
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are used to swap attribute place-holders
|
||||
| with something more reader friendly such as E-Mail Address instead
|
||||
| of "email". This simply helps us make messages a little cleaner.
|
||||
|
|
||||
*/
|
||||
|
||||
'attributes' => [],
|
||||
|
||||
];
|
||||
Loading…
Reference in New Issue