Initial import from Docker volume
This commit is contained in:
71
modules/web_shop_shopify/__init__.py
Executable file
71
modules/web_shop_shopify/__init__.py
Executable file
@@ -0,0 +1,71 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
|
||||
from trytond.pool import Pool
|
||||
|
||||
from . import (
|
||||
account, ir, party, product, routes, sale, shopify_retry, stock, web)
|
||||
|
||||
__all__ = ['register', 'routes']
|
||||
|
||||
shopify_retry.patch()
|
||||
|
||||
|
||||
def register():
|
||||
Pool.register(
|
||||
ir.Cron,
|
||||
web.Shop,
|
||||
web.ShopShopifyIdentifier,
|
||||
web.Shop_Warehouse,
|
||||
web.Shop_Attribute,
|
||||
web.ShopShopifyPaymentJournal,
|
||||
product.Category,
|
||||
product.TemplateCategory,
|
||||
product.Template,
|
||||
product.Product,
|
||||
product.ShopifyInventoryItem,
|
||||
product.ProductIdentifier,
|
||||
product.AttributeSet,
|
||||
product.Attribute,
|
||||
party.Party,
|
||||
party.Address,
|
||||
sale.Sale,
|
||||
sale.Line,
|
||||
account.Payment,
|
||||
account.PaymentJournal,
|
||||
stock.ShipmentOut,
|
||||
stock.ShipmentShopifyIdentifier,
|
||||
stock.Move,
|
||||
module='web_shop_shopify', type_='model')
|
||||
Pool.register(
|
||||
product.ShopifyInventoryItem_Customs,
|
||||
product.Product_TariffCode,
|
||||
module='web_shop_shopify', type_='model', depends=['customs'])
|
||||
Pool.register(
|
||||
product.Image,
|
||||
module='web_shop_shopify', type_='model', depends=['product_image'])
|
||||
Pool.register(
|
||||
product.Image_Attribute,
|
||||
module='web_shop_shopify', type_='model',
|
||||
depends=['product_attribute', 'product_image_attribute'])
|
||||
Pool.register(
|
||||
sale.Line_Discount,
|
||||
module='web_shop_shopify', type_='model', depends=['sale_discount'])
|
||||
Pool.register(
|
||||
product.Template_SaleSecondaryUnit,
|
||||
product.Product_SaleSecondaryUnit,
|
||||
sale.Line_SaleSecondaryUnit,
|
||||
module='web_shop_shopify', type_='model',
|
||||
depends=['sale_secondary_unit'])
|
||||
Pool.register(
|
||||
sale.Sale_ShipmentCost,
|
||||
sale.Line_ShipmentCost,
|
||||
module='web_shop_shopify', type_='model',
|
||||
depends=['sale_shipment_cost'])
|
||||
Pool.register(
|
||||
stock.ShipmentOut_PackageShipping,
|
||||
module='web_shop_shopify', type_='model',
|
||||
depends=['stock_package_shipping'])
|
||||
Pool.register(
|
||||
party.Replace,
|
||||
module='web_shop_shopify', type_='wizard')
|
||||
BIN
modules/web_shop_shopify/__pycache__/__init__.cpython-311.opt-1.pyc
Executable file
BIN
modules/web_shop_shopify/__pycache__/__init__.cpython-311.opt-1.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/__pycache__/__init__.cpython-311.pyc
Executable file
BIN
modules/web_shop_shopify/__pycache__/__init__.cpython-311.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/__pycache__/account.cpython-311.opt-1.pyc
Executable file
BIN
modules/web_shop_shopify/__pycache__/account.cpython-311.opt-1.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/__pycache__/account.cpython-311.pyc
Executable file
BIN
modules/web_shop_shopify/__pycache__/account.cpython-311.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/__pycache__/common.cpython-311.opt-1.pyc
Executable file
BIN
modules/web_shop_shopify/__pycache__/common.cpython-311.opt-1.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/__pycache__/common.cpython-311.pyc
Executable file
BIN
modules/web_shop_shopify/__pycache__/common.cpython-311.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/__pycache__/exceptions.cpython-311.opt-1.pyc
Executable file
BIN
modules/web_shop_shopify/__pycache__/exceptions.cpython-311.opt-1.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/__pycache__/exceptions.cpython-311.pyc
Executable file
BIN
modules/web_shop_shopify/__pycache__/exceptions.cpython-311.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/__pycache__/ir.cpython-311.opt-1.pyc
Executable file
BIN
modules/web_shop_shopify/__pycache__/ir.cpython-311.opt-1.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/__pycache__/ir.cpython-311.pyc
Executable file
BIN
modules/web_shop_shopify/__pycache__/ir.cpython-311.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/__pycache__/party.cpython-311.opt-1.pyc
Executable file
BIN
modules/web_shop_shopify/__pycache__/party.cpython-311.opt-1.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/__pycache__/party.cpython-311.pyc
Executable file
BIN
modules/web_shop_shopify/__pycache__/party.cpython-311.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/__pycache__/product.cpython-311.opt-1.pyc
Executable file
BIN
modules/web_shop_shopify/__pycache__/product.cpython-311.opt-1.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/__pycache__/product.cpython-311.pyc
Executable file
BIN
modules/web_shop_shopify/__pycache__/product.cpython-311.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/__pycache__/routes.cpython-311.opt-1.pyc
Executable file
BIN
modules/web_shop_shopify/__pycache__/routes.cpython-311.opt-1.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/__pycache__/routes.cpython-311.pyc
Executable file
BIN
modules/web_shop_shopify/__pycache__/routes.cpython-311.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/__pycache__/sale.cpython-311.opt-1.pyc
Executable file
BIN
modules/web_shop_shopify/__pycache__/sale.cpython-311.opt-1.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/__pycache__/sale.cpython-311.pyc
Executable file
BIN
modules/web_shop_shopify/__pycache__/sale.cpython-311.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/__pycache__/shopify_retry.cpython-311.opt-1.pyc
Executable file
BIN
modules/web_shop_shopify/__pycache__/shopify_retry.cpython-311.opt-1.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/__pycache__/shopify_retry.cpython-311.pyc
Executable file
BIN
modules/web_shop_shopify/__pycache__/shopify_retry.cpython-311.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/__pycache__/stock.cpython-311.opt-1.pyc
Executable file
BIN
modules/web_shop_shopify/__pycache__/stock.cpython-311.opt-1.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/__pycache__/stock.cpython-311.pyc
Executable file
BIN
modules/web_shop_shopify/__pycache__/stock.cpython-311.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/__pycache__/web.cpython-311.opt-1.pyc
Executable file
BIN
modules/web_shop_shopify/__pycache__/web.cpython-311.opt-1.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/__pycache__/web.cpython-311.pyc
Executable file
BIN
modules/web_shop_shopify/__pycache__/web.cpython-311.pyc
Executable file
Binary file not shown.
135
modules/web_shop_shopify/account.py
Executable file
135
modules/web_shop_shopify/account.py
Executable file
@@ -0,0 +1,135 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
from collections import defaultdict
|
||||
from decimal import Decimal
|
||||
|
||||
from trytond.model import Unique
|
||||
from trytond.pool import Pool, PoolMeta
|
||||
|
||||
from .common import IdentifierMixin
|
||||
|
||||
|
||||
class Payment(IdentifierMixin, metaclass=PoolMeta):
|
||||
__name__ = 'account.payment'
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
t = cls.__table__()
|
||||
cls._sql_constraints += [
|
||||
('shopify_identifier_unique',
|
||||
Unique(t, t.shopify_identifier_signed),
|
||||
'web_shop_shopify.msg_identifier_payment_unique'),
|
||||
]
|
||||
|
||||
@classmethod
|
||||
def _get_shopify_payment_journal_pattern(cls, sale, transaction):
|
||||
return {
|
||||
'gateway': transaction.gateway,
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def _get_from_shopify(cls, sale, transaction):
|
||||
assert transaction.kind in {'authorization', 'sale'}
|
||||
payment = cls(shopify_identifier=transaction.id)
|
||||
payment.company = sale.company
|
||||
payment.journal = sale.web_shop.get_payment_journal(
|
||||
transaction.currency,
|
||||
cls._get_shopify_payment_journal_pattern(
|
||||
sale, transaction))
|
||||
payment.kind = 'receivable'
|
||||
payment.amount = Decimal(transaction.amount)
|
||||
payment.origin = sale
|
||||
payment.party = sale.party
|
||||
return payment
|
||||
|
||||
@classmethod
|
||||
def get_from_shopify(cls, sale, order):
|
||||
pool = Pool()
|
||||
Group = pool.get('account.payment.group')
|
||||
|
||||
id2payments = {}
|
||||
to_process = defaultdict(list)
|
||||
transactions = [
|
||||
t for t in order.transactions() if t.status == 'success']
|
||||
# Order transactions to process parent first
|
||||
kinds = ['authorization', 'capture', 'sale', 'void', 'refund']
|
||||
transactions.sort(key=lambda t: kinds.index(t.kind))
|
||||
amounts = defaultdict(Decimal)
|
||||
for transaction in transactions:
|
||||
if transaction.kind not in {'authorization', 'sale'}:
|
||||
continue
|
||||
payments = cls.search([
|
||||
('shopify_identifier', '=', transaction.id),
|
||||
])
|
||||
if payments:
|
||||
payment, = payments
|
||||
else:
|
||||
payment = cls._get_from_shopify(sale, transaction)
|
||||
to_process[payment.company, payment.journal].append(payment)
|
||||
id2payments[transaction.id] = payment
|
||||
amounts[transaction.id] = Decimal(transaction.amount)
|
||||
cls.save(list(id2payments.values()))
|
||||
|
||||
for (company, journal), payments in to_process.items():
|
||||
group = Group(
|
||||
company=company,
|
||||
journal=journal,
|
||||
kind='receivable')
|
||||
group.save()
|
||||
cls.submit(payments)
|
||||
cls.process(payments, lambda: group)
|
||||
|
||||
captured = defaultdict(Decimal)
|
||||
voided = defaultdict(Decimal)
|
||||
refunded = defaultdict(Decimal)
|
||||
for transaction in transactions:
|
||||
if transaction.kind == 'sale':
|
||||
payment = id2payments[transaction.id]
|
||||
captured[payment] += Decimal(transaction.amount)
|
||||
elif transaction.kind == 'capture':
|
||||
payment = id2payments[transaction.parent_id]
|
||||
id2payments[transaction.id] = payment
|
||||
captured[payment] += Decimal(transaction.amount)
|
||||
elif transaction.kind == 'void':
|
||||
payment = id2payments[transaction.parent_id]
|
||||
voided[payment] += Decimal(transaction.amount)
|
||||
elif transaction.kind == 'refund':
|
||||
payment = id2payments[transaction.parent_id]
|
||||
captured[payment] -= Decimal(transaction.amount)
|
||||
refunded[payment] += Decimal(transaction.amount)
|
||||
|
||||
to_save = []
|
||||
for payment in id2payments.values():
|
||||
if captured[payment] and payment.amount != captured[payment]:
|
||||
payment.amount = captured[payment]
|
||||
to_save.append(payment)
|
||||
cls.proceed(to_save)
|
||||
cls.save(to_save)
|
||||
|
||||
to_succeed, to_fail, to_proceed = set(), set(), set()
|
||||
for transaction_id, payment in id2payments.items():
|
||||
if amounts[transaction_id] == (
|
||||
captured[payment] + voided[payment] + refunded[payment]):
|
||||
if payment.amount:
|
||||
if payment.state != 'succeeded':
|
||||
to_succeed.add(payment)
|
||||
else:
|
||||
if payment.state != 'failed':
|
||||
to_fail.add(payment)
|
||||
elif payment.state != 'processing':
|
||||
to_proceed.add(payment)
|
||||
cls.fail(to_fail)
|
||||
cls.proceed(to_proceed)
|
||||
cls.succeed(to_succeed)
|
||||
|
||||
return list(id2payments.values())
|
||||
|
||||
|
||||
class PaymentJournal(metaclass=PoolMeta):
|
||||
__name__ = 'account.payment.journal'
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls.process_method.selection.append(('shopify', "Shopify"))
|
||||
164
modules/web_shop_shopify/common.py
Executable file
164
modules/web_shop_shopify/common.py
Executable file
@@ -0,0 +1,164 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
from trytond.i18n import lazy_gettext
|
||||
from trytond.model import fields
|
||||
from trytond.pool import Pool
|
||||
|
||||
|
||||
class IdentifierMixin:
|
||||
__slots__ = ()
|
||||
|
||||
shopify_identifier_signed = fields.Integer(
|
||||
lazy_gettext('web_shop_shopify.msg_shopify_identifier'))
|
||||
shopify_identifier_signed._sql_type = 'BIGINT'
|
||||
shopify_identifier = fields.Function(fields.Integer(
|
||||
lazy_gettext('web_shop_shopify.msg_shopify_identifier')),
|
||||
'get_shopify_identifier', setter='set_shopify_identifier',
|
||||
searcher='search_shopify_identifier')
|
||||
shopify_identifier_char = fields.Function(fields.Char(
|
||||
lazy_gettext('web_shop_shopify.msg_shopify_identifier')),
|
||||
'get_shopify_identifier', setter='set_shopify_identifier',
|
||||
searcher='search_shopify_identifier')
|
||||
|
||||
def get_shopify_identifier(self, name):
|
||||
if self.shopify_identifier_signed is not None:
|
||||
value = self.shopify_identifier_signed + (1 << 63)
|
||||
if name == 'shopify_identifier_char':
|
||||
value = str(value)
|
||||
return value
|
||||
|
||||
@classmethod
|
||||
def set_shopify_identifier(cls, records, name, value):
|
||||
if value is not None:
|
||||
value = int(value) - (1 << 63)
|
||||
cls.write(records, {
|
||||
'shopify_identifier_signed': value,
|
||||
})
|
||||
|
||||
@classmethod
|
||||
def search_shopify_identifier(cls, name, domain):
|
||||
_, operator, value = domain
|
||||
if operator in {'in', 'not in'}:
|
||||
value = [
|
||||
int(v) - (1 << 63) if v is not None else None for v in value]
|
||||
elif value is not None:
|
||||
value = int(value) - (1 << 63)
|
||||
return [('shopify_identifier_signed', operator, value)]
|
||||
|
||||
@classmethod
|
||||
def copy(cls, records, default=None):
|
||||
if default is None:
|
||||
default = {}
|
||||
else:
|
||||
default = default.copy()
|
||||
default.setdefault('shopify_identifier_signed')
|
||||
return super().copy(records, default=default)
|
||||
|
||||
|
||||
class IdentifiersUpdateMixin:
|
||||
__slots__ = ()
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls._shopify_fields = set()
|
||||
|
||||
@classmethod
|
||||
def set_shopify_to_update(cls, records):
|
||||
pool = Pool()
|
||||
Identifier = pool.get('web.shop.shopify_identifier')
|
||||
identifiers = cls.get_shopify_identifier_to_update(records)
|
||||
Identifier.write(identifiers, {
|
||||
'to_update': True,
|
||||
})
|
||||
|
||||
@classmethod
|
||||
def get_shopify_identifier_to_update(cls, records):
|
||||
raise NotImplementedError
|
||||
|
||||
@classmethod
|
||||
def write(cls, *args):
|
||||
actions = iter(args)
|
||||
to_update = set()
|
||||
for records, values in zip(actions, actions):
|
||||
if values.keys() & cls._shopify_fields:
|
||||
to_update.update(records)
|
||||
if to_update:
|
||||
cls.set_shopify_to_update(cls.browse(list(to_update)))
|
||||
super().write(*args)
|
||||
|
||||
|
||||
class IdentifiersMixin(IdentifiersUpdateMixin):
|
||||
__slots__ = ()
|
||||
|
||||
shopify_identifiers = fields.One2Many(
|
||||
'web.shop.shopify_identifier', 'record',
|
||||
lazy_gettext('web_shop_shopify.msg_shopify_identifiers'))
|
||||
|
||||
def get_shopify_identifier(self, web_shop):
|
||||
for record in self.shopify_identifiers:
|
||||
if record.web_shop == web_shop:
|
||||
return record.shopify_identifier
|
||||
|
||||
def set_shopify_identifier(self, web_shop, identifier=None):
|
||||
pool = Pool()
|
||||
Identifier = pool.get('web.shop.shopify_identifier')
|
||||
for record in self.shopify_identifiers:
|
||||
if record.web_shop == web_shop:
|
||||
if not identifier:
|
||||
Identifier.delete([record])
|
||||
return
|
||||
else:
|
||||
if record.shopify_identifier != identifier:
|
||||
record.shopify_identifier = identifier
|
||||
record.save()
|
||||
return record
|
||||
if identifier:
|
||||
record = Identifier(record=self, web_shop=web_shop)
|
||||
record.shopify_identifier = identifier
|
||||
record.save()
|
||||
return record
|
||||
|
||||
@classmethod
|
||||
def search_shopify_identifier(cls, web_shop, identifier):
|
||||
records = cls.search([
|
||||
('shopify_identifiers', 'where', [
|
||||
('web_shop', '=', web_shop.id),
|
||||
('shopify_identifier', '=', identifier),
|
||||
]),
|
||||
])
|
||||
if records:
|
||||
record, = records
|
||||
return record
|
||||
|
||||
def is_shopify_to_update(self, web_shop, **extra):
|
||||
for record in self.shopify_identifiers:
|
||||
if record.web_shop == web_shop:
|
||||
return (record.to_update
|
||||
or (record.to_update_extra or {}) != extra)
|
||||
return True
|
||||
|
||||
@classmethod
|
||||
def copy(cls, records, default=None):
|
||||
if default is None:
|
||||
default = {}
|
||||
else:
|
||||
default = default.copy()
|
||||
default.setdefault('shopify_identifiers')
|
||||
return super().copy(records, default=default)
|
||||
|
||||
@classmethod
|
||||
def delete(cls, records):
|
||||
pool = Pool()
|
||||
Identifier = pool.get('web.shop.shopify_identifier')
|
||||
Identifier.delete(sum((r.shopify_identifiers for r in records), ()))
|
||||
super().delete(records)
|
||||
|
||||
@classmethod
|
||||
def get_shopify_identifier_to_update(cls, records):
|
||||
return sum((list(r.shopify_identifiers) for r in records), [])
|
||||
|
||||
|
||||
def setattr_changed(record, name, value):
|
||||
if getattr(record, name, None) != value:
|
||||
setattr(record, name, value)
|
||||
7
modules/web_shop_shopify/exceptions.py
Executable file
7
modules/web_shop_shopify/exceptions.py
Executable file
@@ -0,0 +1,7 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
from trytond.exceptions import UserError
|
||||
|
||||
|
||||
class ShopifyError(UserError):
|
||||
pass
|
||||
18
modules/web_shop_shopify/ir.py
Executable file
18
modules/web_shop_shopify/ir.py
Executable file
@@ -0,0 +1,18 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
from trytond.pool import PoolMeta
|
||||
|
||||
|
||||
class Cron(metaclass=PoolMeta):
|
||||
__name__ = 'ir.cron'
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls.method.selection.extend([
|
||||
('web.shop|shopify_update_product', "Update Shopify Products"),
|
||||
('web.shop|shopify_update_inventory',
|
||||
"Update Shopify Inventory"),
|
||||
('web.shop|shopify_fetch_order', "Fetch Shopify Orders"),
|
||||
('web.shop|shopify_update_order', "Update Shopify Orders"),
|
||||
])
|
||||
30
modules/web_shop_shopify/ir.xml
Executable file
30
modules/web_shop_shopify/ir.xml
Executable file
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<tryton>
|
||||
<data noupdate="1">
|
||||
<record model="ir.cron" id="cron_update_product">
|
||||
<field name="method">web.shop|shopify_update_product</field>
|
||||
<field name="interval_number" eval="1"/>
|
||||
<field name="interval_type">days</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.cron" id="cron_update_inventory">
|
||||
<field name="method">web.shop|shopify_update_inventory</field>
|
||||
<field name="interval_number" eval="1"/>
|
||||
<field name="interval_type">hours</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.cron" id="cron_fetch_order">
|
||||
<field name="method">web.shop|shopify_fetch_order</field>
|
||||
<field name="interval_number" eval="1"/>
|
||||
<field name="interval_type">days</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.cron" id="cron_update_order">
|
||||
<field name="method">web.shop|shopify_update_order</field>
|
||||
<field name="interval_number" eval="1"/>
|
||||
<field name="interval_type">days</field>
|
||||
</record>
|
||||
</data>
|
||||
</tryton>
|
||||
304
modules/web_shop_shopify/locale/bg.po
Executable file
304
modules/web_shop_shopify/locale/bg.po
Executable file
@@ -0,0 +1,304 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.product,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.template,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an unit of "
|
||||
"measure without digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
334
modules/web_shop_shopify/locale/ca.po
Executable file
334
modules/web_shop_shopify/locale/ca.po
Executable file
@@ -0,0 +1,334 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr "Opció 1"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr "Opció 2"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr "Opció 3"
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr "SKU"
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr "UdM Shopify"
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr "Producte"
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr "UdM Shopify"
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr "Ajust d'impostos de Shopify"
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr "Venda"
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr "Albarà"
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr "Token d'accés"
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr "Diaris de pagament"
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr "URL de la botiga"
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr "Versió"
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr "Magatzems"
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr "URL Webhook comandes"
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr "Secret compartit del webhook"
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr "ID de Shopify"
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr "Només zona d'emmagatzematge"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr "Registre"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr "A actualitzar"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr "A actualitzar extra"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr "Botiga web"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr "Pasarel·la"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr "Diari"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr "Botiga"
|
||||
|
||||
msgctxt "help:product.product,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr "La unitat de mesura del producte a Shopify."
|
||||
|
||||
msgctxt "help:product.template,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr "La unitat de mesura del producte a Shopify."
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr "L'URL que ha de cridar Shopify per als esdeveniments de la comanda."
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr "Marcar per utilitzar només la quantitat de la zona d'emmagatzematge."
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
"El nom de la passarel·la de pagament per a la qual s’ha d’utilitzar el "
|
||||
"diari."
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Identificadors de Shopify"
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr "Identificadors d'albarà"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No s'ha pogut desar la col·lecció personalitzada \"%(category)s\" amb l'error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No s'ha pogut desar el compliment de la venda \"%(sale)s\" amb error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
"No s'ha pogut trobar una orde de copliment per la quantitat \"%(quantity)s\""
|
||||
" del moviment \"%(move)s\"."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
"Una transacció de Shopify només es pot importar com a pagament una vegada."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
"El registre no pot tenir més d’un identificador de Shopify per botiga web."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr "Una comanda de Shopify només es pot importar com a venda una vegada."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr "L’albarà no pot tenir més d’un identificador de Shopify per venda."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No s'ha pogut desar l'article d'inventari del producte \"%(product)s\" amb error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr "Cada ubicació de Shopify només es pot enllaçar a un magatzem."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
"Per canviar la plantilla del producte \"%(product)s\" l'heu de despublicar "
|
||||
"de les botigues web de Shopify."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No s'ha pogut desar el producte \"%(template)s\" amb l'error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No s'ha pogut desar la imatge \"%(image)s\" per al producte \"%(template)s\" amb error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an unit of "
|
||||
"measure without digits."
|
||||
msgstr ""
|
||||
"Per actualitzar el producte \"%(product)s\" a Shopify, heu d'utilitzar una "
|
||||
"unitat de mesura sense dígits."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No s'ha pogut desar el reemborsament per la venda \"%(sale)s\" amb error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
"Per processar la venda \"%(sale)s\", heu d'establir un producte a la línia "
|
||||
"\"%(line)s\"."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
"Per actualitzar els productes de la botiga \"%(shop)s\", heu d'establir la "
|
||||
"moneda a \"%(shopify_currency)s\" en lloc de \"%(shop_currency)s\"."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
"Per actualitzar els productes de la botiga \"%(shop)s\", heu d'establir "
|
||||
"l'idioma a \"%(shopify_primary_locale)s\" en lloc de \"%(shop_language)s\"."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr "Identificador de Shopify"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Identificadors de Shopify"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No s'ha pogut desar la variant \"%(product)s\" amb l'error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr "Marca per actualitzar"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Identificadors de Shopify"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr "Identificadors d'albarà"
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr "Article d’inventari de Shopify"
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr "Identificador d'albarà de Shopify"
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr "Identificador de Shopify"
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr "Diari de pagament de Shopify"
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr "Obtenir comandes de Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr "Actualitzar l'inventari de Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr "Actualitzar l'inventari de Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr "Actualitzar els productes de Shopify"
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr "Albarà de client"
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr "Opcions de Shopify"
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
304
modules/web_shop_shopify/locale/cs.po
Executable file
304
modules/web_shop_shopify/locale/cs.po
Executable file
@@ -0,0 +1,304 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.product,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.template,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an unit of "
|
||||
"measure without digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
341
modules/web_shop_shopify/locale/de.po
Executable file
341
modules/web_shop_shopify/locale/de.po
Executable file
@@ -0,0 +1,341 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr "Option 1"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr "Option 2"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr "Option 3"
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr "SKU"
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr "Shopify Maßeinheit"
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr "Artikel"
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr "Shopify Maßeinheit"
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr "Shopify Steuerkorrektur"
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr "Verkauf"
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr "Lieferung"
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr "Zugangstoken"
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr "Zahlungsjournale"
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr "Shop URL"
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr "Version"
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr "Logistikstandorte"
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr "Endpoint Webhook Bestellung"
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr "Shared Secret Webhook"
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr "Shopfiy ID"
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr "Nur Lagerzone"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr "Datensatz"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr "Aktualisierung erforderlich"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr "Aktualisierung erforderlich Extra"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr "Webshop"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr "Gateway"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr "Journal"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr "Webshop"
|
||||
|
||||
msgctxt "help:product.product,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr "Die Maßeinheit des Artikels bei Shopify."
|
||||
|
||||
msgctxt "help:product.template,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr "Die Maßeinheit des Artikels bei Shopify."
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
"Die URL die von Shopify bei Auftragsereignissen aufgerufen werden soll."
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr "Aktivieren, um nur den Bestand aus der Lagerzone zu verwenden."
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
"Der Name des Zahlungsanbieters für den das Journal verwendet werden muss."
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Shopfiy Identifikatoren"
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr "Lieferungsidentifkatoren"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Beim Speichern der benutzerdefinierten Zusammenstellung \"%(category)s\" ist folgender Fehler aufgetreten:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Beim Speichern der Auftragsabwicklung für den Verkauf \"%(sale)s\" ist folgender Fehler aufgetreten:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
"Fulfillment-Auftrag für %(quantity)s der Warenbewegung \"%(move)s\" konnte "
|
||||
"nicht gefunden werden."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
"Eine Shopify Transaktion kann nur einmal als Zahlung importiert werden."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
"Es kann für den Datensatz jeweils nur ein Shopify Identifikator pro Webshop "
|
||||
"vergeben werden."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr "Ein Shopify Auftrag kann nur einmal als Verkauf importiert werden."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
"Für die Lieferung kann jeweils nur einen Shopify Identifikator pro Webshop "
|
||||
"vergeben werden."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Beim Speichern der Lagerinformationen für den Artikel \"%(product)s\" ist folgender Fehler aufgetreten:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
"Ein Shopify Lagerort kann jeweils nur einem Logistikstandort zugeordnet "
|
||||
"werden."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
"Um die Vorlage des Artikels \"%(product)s\" bearbeiten zu können, muss "
|
||||
"zuerst die Veröffentlichung im Shopfiy Webshop zurückgenommen werden."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Beim Speichern des Artikels \"%(template)s\" ist folgender Fehler aufgetreten:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Beim Speichern des Bildes \"%(image)s\" für Artikel \"%(template)s\" ist folgender Fehler aufgetreten:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an unit of "
|
||||
"measure without digits."
|
||||
msgstr ""
|
||||
"Damit der Artikel \"%(product)s\" auf Shopify aktualisiert werden kann, muss"
|
||||
" eine Maßeinheit ohne Nachkommastellen verwendet werden."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Beim Speichern der Erstattung für den Verkauf \"%(sale)s\" ist folgender Fehler aufgetreten:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
"Damit der Verkauf \"%(sale)s\" ausgeführt werden kann, muss ein Artikel auf "
|
||||
"Position \"%(line)s\" erfasst werden."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
"Damit die Artikel im Webshop \"%(shop)s\" aktualisiert werden können, muss "
|
||||
"die Währung von \"%(shop_currency)s\" auf \"%(shopify_currency)s\" geändert "
|
||||
"werden."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
"Damit die Artikel für den Webshop \"%(shop)s\" aktualisiert werden können, "
|
||||
"muss die Sprache von \"%(shop_language)s\" auf "
|
||||
"\"%(shopify_primary_locale)s\" geändert werden."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr "Shopify Identifikator"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Shopify Identifikatoren"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Beim Speichern der Variante \"%(product)s\" ist folgender Fehler aufgetreten:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr "Zur Aktualisierung markieren"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Shopify Identifikatoren"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr "Lieferungsidentifikatoren"
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr "Shopify Lagerinformationen"
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr "Shopify Lieferungsidentifikator"
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr "Shopify Identifikator"
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr "Shopify Zahlungsjournal"
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr "Shopify Aufträge abrufen"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr "Shopify Lagerinformationen aktualisieren"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr "Shopify Aufträge aktualisieren"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr "Shopify Artikel aktualisieren"
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr "Kundenlieferung"
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr "Shopify Optionen"
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
334
modules/web_shop_shopify/locale/es.po
Executable file
334
modules/web_shop_shopify/locale/es.po
Executable file
@@ -0,0 +1,334 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr "Opción 1"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr "Opción 2"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr "Opción 3"
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr "SKU"
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr "UdM Shopify"
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr "Producto"
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr "UdM Shopify"
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr "Ajuste de impuestos de Shopify"
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr "Venta"
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr "Albarán"
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr "Token de acceso"
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr "Diarios de pagos"
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr "URL de la tienda"
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr "Versión"
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr "Almacenes"
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr "URL Webhook Ordenes"
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr "Secreto compartido del webhook"
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr "ID de Shopify"
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr "Solo zona de almacenamiento"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr "Registro"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr "A actualizar"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr "A actualizar extra"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr "Tienda web"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr "Pasarela"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr "Diario"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr "Tienda"
|
||||
|
||||
msgctxt "help:product.product,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr "La unidad de medida del producto en Shopify."
|
||||
|
||||
msgctxt "help:product.template,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr "La unidad de medida del producto en Shopify."
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr "La URL que será llamada por Shopify para eventos de pedidos."
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr "Marcar para usar solo la cantidad de la zona de almacenamiento."
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
"El nombre de la pasarela de pago para la que se debe utilizar el diario."
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Identificadores de Shopify"
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr "Identificadores de albarán"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No se ha podido guardar la colección personalizada \"%(category)s\" con el error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No se ha podido guardar el cumplimiento para la venta \"%(sale)s\" con el error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
"No se ha podido encontrar una orden de cumplimiento para la cantidad "
|
||||
"%(quantity)s del movimiento \"%(move)s\"."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr "Una transacción de Shopify solo se puede importar como pago una vez."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
"El registro no puede tener más de un identificador de Shopify por tienda "
|
||||
"web."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr "Un pedido de Shopify solo se puede importar como venta una vez."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
"El albarán no puede tener más de un identificador de Shopify por venta."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No se ha podido guardar el artículo de inventario para el producto \"%(product)s\" con el error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr "Cada ubicación de Shopify solo se puede vincular a un almacén."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
"Para cambiar la plantilla del producto \"%(product)s\" debes anular su "
|
||||
"publicación de las tiendas web de Shopify."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No se ha podido guardar el producto \"%(template)s\" con el error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No se ha podido guardar la imagen \"%(image)s\" para el producto \"%(template)s\" con el error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an unit of "
|
||||
"measure without digits."
|
||||
msgstr ""
|
||||
"Para actualizar el producto \"%(product)s\" en Shopify, debe usar una unidad"
|
||||
" de medida sin dígitos."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No se ha podido guardar el reembolso de la venta \"%(sale)s\" con el error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
"Para procesar la venta \"%(sale)s\" debe establecer un producto en la línea "
|
||||
"\"%(line)s\"."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
"Para actualizar los productos de la tienda \"%(shop)s\", debe establecer la "
|
||||
"moneda en \"%(shopify_currency)s\" en lugar de \"%(shop_currency)s\"."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
"Para actualizar los productos de la tienda \"%(shop)s\", debe establecer el "
|
||||
"idioma en \"%(shopify_primary_locale)s\" en lugar de \"%(shop_language)s\"."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr "Identificador de Shopify"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Identificadores de Shopify"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"No se ha podido guardar la variante \"%(product)s\" con el error:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr "Marcar para actualizar"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Identificadores de Shopify"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr "Identificadores de albarán"
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr "Artículo de inventario de Shopify"
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr "Identificador de albarán de Shopify"
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr "Identificador de Shopify"
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr "Diario de pago de Shopify"
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr "Obtener pedidos de Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr "Actualizar el inventario de Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr "Actualizar pedidos de Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr "Actualizar productos de Shopify"
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr "Albarán de cliente"
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr "Opciones de Shopify"
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
304
modules/web_shop_shopify/locale/es_419.po
Executable file
304
modules/web_shop_shopify/locale/es_419.po
Executable file
@@ -0,0 +1,304 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.product,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.template,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an unit of "
|
||||
"measure without digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
304
modules/web_shop_shopify/locale/et.po
Executable file
304
modules/web_shop_shopify/locale/et.po
Executable file
@@ -0,0 +1,304 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.product,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.template,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an unit of "
|
||||
"measure without digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
304
modules/web_shop_shopify/locale/fa.po
Executable file
304
modules/web_shop_shopify/locale/fa.po
Executable file
@@ -0,0 +1,304 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.product,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.template,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an unit of "
|
||||
"measure without digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
304
modules/web_shop_shopify/locale/fi.po
Executable file
304
modules/web_shop_shopify/locale/fi.po
Executable file
@@ -0,0 +1,304 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.product,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.template,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an unit of "
|
||||
"measure without digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
341
modules/web_shop_shopify/locale/fr.po
Executable file
341
modules/web_shop_shopify/locale/fr.po
Executable file
@@ -0,0 +1,341 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr "Option 1"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr "Option 2"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr "Option 3"
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr "UGS"
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr "UDM Shopify"
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr "Produit"
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr "UDM Shopify"
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr "Ajustement de tax Shopify"
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr "Vente"
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr "Expédition"
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr "Jeton d'accès"
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr "Journaux de paiement"
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr "URL de la boutique"
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr "Version"
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr "Entrepôts"
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr "Point de terminaison du webhook de commande"
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr "Secret partagé du webhook"
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr "ID Shopify"
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr "Zone de magasin uniquement"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr "Enregistrement"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr "À mettre à jour"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr "Supplément à mettre à jour"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr "Boutique en ligne"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr "Passerelle"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr "Journal"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr "Boutique"
|
||||
|
||||
msgctxt "help:product.product,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr "L'unité de mesure du produit sur Shopify."
|
||||
|
||||
msgctxt "help:product.template,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr "L'unité de mesure du produit sur Shopify."
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr "L'URL à appeler par Shopify pour les événements de commande."
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr "Cochez pour n'utiliser que la quantité de la zone de magasin."
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
"Le nom de la passerelle de paiement pour laquelle le journal doit être "
|
||||
"utilisé."
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Identifiants Shopify"
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr "Identifiants d'expédition"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Échec de l'enregistrement de la collection personnalisée « %(category)s » avec l'erreur :\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Échec de l'enregistrement du traitement pour la vente « %(sale)s » avec l'erreur :\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
"Impossible de trouver la commande d'exécution pour %(quantity)s du mouvement"
|
||||
" « %(move)s »."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
"Une transaction Shopify ne peut être importée qu'une seule fois en tant que "
|
||||
"paiement."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
"L'enregistrement ne peut pas avoir plus d'un identifiant Shopify par "
|
||||
"boutique en ligne."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
"Une commande Shopify ne peut être importée qu'une seule fois en tant que "
|
||||
"vente."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
"L'expédition ne peut pas avoir plus d'un identifiant Shopify par vente."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Échec de l'enregistrement de l'article d'inventaire pour le produit « %(product)s » avec l'erreur :\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr "Chaque emplacement Shopify ne peut être lié qu'à un seul entrepôt."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
"Pour modifier le modèle du produit « %(product)s », vous devez le dé-publier"
|
||||
" des boutiques en ligne Shopify."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Échec de l'enregistrement du produit « %(template)s » avec l'erreur :\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Échec de l'enregistrement de l'image « %(image)s » pour le produit « %(template)s » avec l'erreur :\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an unit of "
|
||||
"measure without digits."
|
||||
msgstr ""
|
||||
"Pour mettre à jour le produit « %(product)s » sur Shopify, vous devez "
|
||||
"utiliser une unité de mesure sans décimales."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Échec de l'enregistrement du remboursement pour la vente « %(sale)s » avec l'erreur :\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
"Pour traiter la vente « %(sale)s » vous devez définir un produit sur la "
|
||||
"ligne « %(line)s »."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
"Pour mettre à jour les produits de la boutique « %(shop)s », vous devez "
|
||||
"mettre la devise à « %(shopify_currency)s » au lieu de "
|
||||
"« %(shop_currency)s »."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
"Pour mettre à jour les produits de la boutique « %(shop)s », vous devez "
|
||||
"mettre la langue à « %(shopify_primary_locale)s » au lieu de "
|
||||
"« %(shop_language)s »."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr "Identifiant Shopify"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Identifiants Shopify"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Échec de l'enregistrement du la variante « %(product)s » avec l'erreur :\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr "Définir à mettre à jour"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Identifiants Shopify"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr "Identifiants d'expédition"
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr "Article d'inventaire Shopify"
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr "Identifiant d'expédition Shopify"
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr "Identifiant Shopify"
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr "Journal de paiement Shopify"
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr "Récupérer les commandes Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr "Mettre à jour l'inventaire Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr "Mettre à jour les commandes Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr "Mettre à jour les produits Shopify"
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr "Expédition cliente"
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr "Options Shopify"
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
304
modules/web_shop_shopify/locale/hu.po
Executable file
304
modules/web_shop_shopify/locale/hu.po
Executable file
@@ -0,0 +1,304 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.product,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.template,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an unit of "
|
||||
"measure without digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
304
modules/web_shop_shopify/locale/id.po
Executable file
304
modules/web_shop_shopify/locale/id.po
Executable file
@@ -0,0 +1,304 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr "Produk"
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr "Versi"
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr "Jurnal"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr "Toko"
|
||||
|
||||
msgctxt "help:product.product,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.template,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an unit of "
|
||||
"measure without digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
304
modules/web_shop_shopify/locale/it.po
Executable file
304
modules/web_shop_shopify/locale/it.po
Executable file
@@ -0,0 +1,304 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr "Magazzini"
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.product,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.template,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an unit of "
|
||||
"measure without digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
304
modules/web_shop_shopify/locale/lo.po
Executable file
304
modules/web_shop_shopify/locale/lo.po
Executable file
@@ -0,0 +1,304 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.product,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.template,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an unit of "
|
||||
"measure without digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
304
modules/web_shop_shopify/locale/lt.po
Executable file
304
modules/web_shop_shopify/locale/lt.po
Executable file
@@ -0,0 +1,304 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.product,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.template,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an unit of "
|
||||
"measure without digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
333
modules/web_shop_shopify/locale/nl.po
Executable file
333
modules/web_shop_shopify/locale/nl.po
Executable file
@@ -0,0 +1,333 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr "Optie 1"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr "Optie 2"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr "Optie 3"
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr "SKU"
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr "Shopify maateenheid"
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr "Product"
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr "Shopify maateenheid"
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr "Shopify Belastingaanpassing"
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr "Verkoop"
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr "Levering"
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr "Toegangssleutel"
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr "Betalingsdagboeken"
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr "Winkel-URL"
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr "Versie"
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr "Magazijnen"
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr "Webhook order eindpunt"
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr "Webhook gedeeld geheim"
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr "Shopify-ID"
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr "Enige opslagzone"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr "Record"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr "Bijwerken"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr "Extra bijwerken"
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr "Webwinkel"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr "poort"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr "Dagboek"
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr "Winkel"
|
||||
|
||||
msgctxt "help:product.product,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr "De maateenheid van het product in Shopify."
|
||||
|
||||
msgctxt "help:product.template,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr "De maateenheid van het product in Shopify."
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr "De url die aangeroepen wordt door Shopify voor order gebeurtenissen."
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr "Vink aan om alleen de hoeveelheid van de opslagzone te gebruiken."
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
"De naam van de betalingsgateway waarvoor het journaal moet worden gebruikt."
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Shopify-ID's"
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr "Zendings-ID's"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"De volgende fout is opgetreden tijdens het opslaan van de gepersonaliseerde compilatie \"%(category)s\":\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Kan uitvoering voor verkoop \"%(sale)s\" niet opslaan met fout:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr "Kan opdracht voor %(quantity)s van boeking \"%(move)s\" niet vinden."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
"Een shopify-transactie kan slechts één keer als betaling worden "
|
||||
"geïmporteerd."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr "Het record kan niet meer dan één Shopify-ID per webshop bevatten."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
"Een Shopify-bestelling kan slechts één keer als verkoop worden geïmporteerd."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr "De zending mag niet meer dan één Shopify-ID per verkoop hebben."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"De volgende fout is opgetreden tijdens het opslaan van de voorraadinformatie voor het artikel \"%(product)s\"\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr "Elke Shopify-locatie kan slechts aan één magazijn worden gekoppeld."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
"Om het sjabloon van het artikel \"%(product)s\" te kunnen bewerken, moet de "
|
||||
"publicatie in de Shopfiy webshop eerst worden ingetrokken."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"De volgende fout is opgetreden tijdens het opslaan van het artikel \"%(template)s\":\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"De volgende fout is opgetreden tijdens het opslaan van de afbeelding \"%(image)s\" voor artikel \"%(template)s\":\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an unit of "
|
||||
"measure without digits."
|
||||
msgstr ""
|
||||
"Om product \"%(product)s\" op Shopify bij te werken, moet er een maateenheid"
|
||||
" gebruikt worden zonder decimalen."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"De volgende fout is opgetreden tijdens het opslaan van het tegoed voor de verkoop \"%(sale)s\":\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
"Om de verkoop \"%(sale)s\" te verwerken, moet u een product instellen op de "
|
||||
"regel \"%(line)s\"."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
"Om producten in de winkel \"%(shop)s\" bij te werken, moet u de valuta "
|
||||
"instellen op \"%(shopify_currency)s\" in plaats van \"%(shop_currency)s\"."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
"Om producten in de winkel \"%(shop)s\" bij te werken, moet u de taal "
|
||||
"instellen op \"%(shopify_primary_locale)s\" in plaats van "
|
||||
"\"%(shop_language)s\"."
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr "Shopify-ID"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Shopify-ID's"
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
"Kan variant \"%(product)s\" niet opslaan met fout:\n"
|
||||
"%(error)s"
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr "Instellen om te updaten"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr "Shopify-ID's"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr "Zendings-ID's"
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr "Shopify-voorraaditem"
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr "Shopify Verzend-ID"
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr "Shopify-ID"
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr "Shopify-betalingsdagboek"
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr "Shopify-bestellingen ophalen"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr "Shopify-inventaris bijwerken"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr "Shopify-bestellingen bijwerken"
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr "Update Shopify-producten"
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr "Klant zending"
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr "Shopify-opties"
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr "Shopify"
|
||||
304
modules/web_shop_shopify/locale/pl.po
Executable file
304
modules/web_shop_shopify/locale/pl.po
Executable file
@@ -0,0 +1,304 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.product,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.template,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an unit of "
|
||||
"measure without digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
304
modules/web_shop_shopify/locale/pt.po
Executable file
304
modules/web_shop_shopify/locale/pt.po
Executable file
@@ -0,0 +1,304 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.product,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.template,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an unit of "
|
||||
"measure without digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
304
modules/web_shop_shopify/locale/ro.po
Executable file
304
modules/web_shop_shopify/locale/ro.po
Executable file
@@ -0,0 +1,304 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.product,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.template,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an unit of "
|
||||
"measure without digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
304
modules/web_shop_shopify/locale/ru.po
Executable file
304
modules/web_shop_shopify/locale/ru.po
Executable file
@@ -0,0 +1,304 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.product,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.template,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an unit of "
|
||||
"measure without digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
304
modules/web_shop_shopify/locale/sl.po
Executable file
304
modules/web_shop_shopify/locale/sl.po
Executable file
@@ -0,0 +1,304 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.product,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.template,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an unit of "
|
||||
"measure without digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
304
modules/web_shop_shopify/locale/tr.po
Executable file
304
modules/web_shop_shopify/locale/tr.po
Executable file
@@ -0,0 +1,304 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.product,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.template,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an unit of "
|
||||
"measure without digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
304
modules/web_shop_shopify/locale/uk.po
Executable file
304
modules/web_shop_shopify/locale/uk.po
Executable file
@@ -0,0 +1,304 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.product,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.template,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an unit of "
|
||||
"measure without digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
304
modules/web_shop_shopify/locale/zh_CN.po
Executable file
304
modules/web_shop_shopify/locale/zh_CN.po
Executable file
@@ -0,0 +1,304 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option1:"
|
||||
msgid "Option 1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option2:"
|
||||
msgid "Option 2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.attribute.set,shopify_option3:"
|
||||
msgid "Option 3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_sku:"
|
||||
msgid "SKU"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.product,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.shopify_inventory_item,product:"
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:product.template,shopify_uom:"
|
||||
msgid "Shopify UoM"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:sale.sale,shopify_tax_adjustment:"
|
||||
msgid "Shopify Tax Adjustment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,sale:"
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_password:"
|
||||
msgid "Access Token"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_payment_journals:"
|
||||
msgid "Payment Journals"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_url:"
|
||||
msgid "Shop URL"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_version:"
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_warehouses:"
|
||||
msgid "Warehouses"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "Webhook Order Endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop,shopify_webhook_shared_secret:"
|
||||
msgid "Webhook Shared Secret"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_id:"
|
||||
msgid "Shopify ID"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Only storage zone"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,record:"
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update:"
|
||||
msgid "To Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,to_update_extra:"
|
||||
msgid "To Update Extra"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_identifier,web_shop:"
|
||||
msgid "Web Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "Gateway"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,journal:"
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "field:web.shop.shopify_payment_journal,shop:"
|
||||
msgid "Shop"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.product,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:product.template,shopify_uom:"
|
||||
msgid "The Unit of Measure of the product on Shopify."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop,shopify_webhook_endpoint_order:"
|
||||
msgid "The URL to be called by Shopify for Order events."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop-stock.location,shopify_stock_skip_warehouse:"
|
||||
msgid "Check to use only the quantity of the storage zone."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "help:web.shop.shopify_payment_journal,gateway:"
|
||||
msgid "The payment gateway name for which the journal must be used."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.action,name:act_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_custom_collection_fail"
|
||||
msgid ""
|
||||
"Failed to save custom collection \"%(category)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_fail"
|
||||
msgid ""
|
||||
"Failed to save fulfillment for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_fulfillment_order_line_not_found"
|
||||
msgid "Failed to find fulfillment order for %(quantity)s of move \"%(move)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_payment_unique"
|
||||
msgid "A shopify transaction can only be imported as payment once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_record_web_shop_unique"
|
||||
msgid "The record cannot have more than one Shopify identifier per web shop."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_sale_web_shop_unique"
|
||||
msgid "A Shopify order can only be imported as a sale once."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_identifier_shipment_sale_unique"
|
||||
msgid "The shipment can not have more than one Shopify identifier per sale."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_inventory_item_fail"
|
||||
msgid ""
|
||||
"Failed to save inventory item for product \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_location_id_unique"
|
||||
msgid "Each Shopify location can only be linked to one warehouse."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_change_template"
|
||||
msgid ""
|
||||
"To change the template of product \"%(product)s\" you must unpublish it from"
|
||||
" the Shopify web shops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_fail"
|
||||
msgid ""
|
||||
"Failed to save product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_image_fail"
|
||||
msgid ""
|
||||
"Failed to save image \"%(image)s\" for product \"%(template)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_product_shopify_uom_digits"
|
||||
msgid ""
|
||||
"To update product \"%(product)s\" on Shopify, you must use an unit of "
|
||||
"measure without digits."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_refund_fail"
|
||||
msgid ""
|
||||
"Failed to save refund for sale \"%(sale)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_sale_line_without_product"
|
||||
msgid ""
|
||||
"To process the sale \"%(sale)s\" you must set a product on the line "
|
||||
"\"%(line)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_currency_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the currency to "
|
||||
"\"%(shopify_currency)s\" instead of \"%(shop_currency)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shop_locale_different"
|
||||
msgid ""
|
||||
"To update products on the shop \"%(shop)s\", you must set the language to "
|
||||
"\"%(shopify_primary_locale)s\" instead of \"%(shop_language)s\"."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifier"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_shopify_identifiers"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.message,text:msg_variant_fail"
|
||||
msgid ""
|
||||
"Failed to save variant \"%(product)s\" with error:\n"
|
||||
"%(error)s"
|
||||
msgstr ""
|
||||
|
||||
msgctxt ""
|
||||
"model:ir.model.button,string:shop_shopify_identifier_set_to_update_button"
|
||||
msgid "Set to Update"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_shop_shopify_identifier_form"
|
||||
msgid "Shopify Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_stock_shipment_shopify_identifier_form"
|
||||
msgid "Shipment Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:product.shopify_inventory_item,name:"
|
||||
msgid "Shopify Inventory Item"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:stock.shipment.shopify_identifier,name:"
|
||||
msgid "Shopify Shipment Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_identifier,name:"
|
||||
msgid "Shopify Identifier"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "model:web.shop.shopify_payment_journal,name:"
|
||||
msgid "Shopify Payment Journal"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:account.payment.journal,process_method:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Fetch Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Inventory"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Orders"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:ir.cron,method:"
|
||||
msgid "Update Shopify Products"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:stock.shipment.shopify_identifier,shipment:"
|
||||
msgid "Customer Shipment"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "selection:web.shop,type:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:product.attribute.set:"
|
||||
msgid "Shopify Options"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "view:web.shop:"
|
||||
msgid "Shopify"
|
||||
msgstr ""
|
||||
74
modules/web_shop_shopify/message.xml
Executable file
74
modules/web_shop_shopify/message.xml
Executable file
@@ -0,0 +1,74 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<tryton>
|
||||
<data grouped="1">
|
||||
<record model="ir.message" id="msg_shopify_identifier">
|
||||
<field name="text">Shopify Identifier</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_identifier_record_web_shop_unique">
|
||||
<field name="text">The record cannot have more than one Shopify identifier per web shop.</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_location_id_unique">
|
||||
<field name="text">Each Shopify location can only be linked to one warehouse.</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_shopify_identifiers">
|
||||
<field name="text">Shopify Identifiers</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_identifier_sale_web_shop_unique">
|
||||
<field name="text">A Shopify order can only be imported as a sale once.</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_shop_currency_different">
|
||||
<field name="text">To update products on the shop "%(shop)s", you must set the currency to "%(shopify_currency)s" instead of "%(shop_currency)s".</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_shop_locale_different">
|
||||
<field name="text">To update products on the shop "%(shop)s", you must set the language to "%(shopify_primary_locale)s" instead of "%(shop_language)s".</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_product_shopify_uom_digits">
|
||||
<field name="text">To update product "%(product)s" on Shopify, you must use an unit of measure without digits.</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_product_change_template">
|
||||
<field name="text">To change the template of product "%(product)s" you must unpublish it from the Shopify web shops.</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_custom_collection_fail">
|
||||
<field name="text">Failed to save custom collection "%(category)s" with error:
|
||||
%(error)s</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_product_fail">
|
||||
<field name="text">Failed to save product "%(template)s" with error:
|
||||
%(error)s</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_product_image_fail">
|
||||
<field name="text">Failed to save image "%(image)s" for product "%(template)s" with error:
|
||||
%(error)s</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_variant_fail">
|
||||
<field name="text">Failed to save variant "%(product)s" with error:
|
||||
%(error)s</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_inventory_item_fail">
|
||||
<field name="text">Failed to save inventory item for product "%(product)s" with error:
|
||||
%(error)s</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_fulfillment_fail">
|
||||
<field name="text">Failed to save fulfillment for sale "%(sale)s" with error:
|
||||
%(error)s</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_refund_fail">
|
||||
<field name="text">Failed to save refund for sale "%(sale)s" with error:
|
||||
%(error)s</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_identifier_payment_unique">
|
||||
<field name="text">A shopify transaction can only be imported as payment once.</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_identifier_shipment_sale_unique">
|
||||
<field name="text">The shipment can not have more than one Shopify identifier per sale.</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_sale_line_without_product">
|
||||
<field name="text">To process the sale "%(sale)s" you must set a product on the line "%(line)s".</field>
|
||||
</record>
|
||||
<record model="ir.message" id="msg_fulfillment_order_line_not_found">
|
||||
<field name="text">Failed to find fulfillment order for %(quantity)s of move "%(move)s".</field>
|
||||
</record>
|
||||
</data>
|
||||
</tryton>
|
||||
113
modules/web_shop_shopify/party.py
Executable file
113
modules/web_shop_shopify/party.py
Executable file
@@ -0,0 +1,113 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
from trytond.pool import Pool, PoolMeta
|
||||
from trytond.tools import remove_forbidden_chars
|
||||
|
||||
from .common import IdentifiersMixin, setattr_changed
|
||||
|
||||
|
||||
class Party(IdentifiersMixin, metaclass=PoolMeta):
|
||||
__name__ = 'party.party'
|
||||
|
||||
@classmethod
|
||||
def get_from_shopify(cls, shop, customer):
|
||||
pool = Pool()
|
||||
ContactMechanism = pool.get('party.contact_mechanism')
|
||||
party = cls.search_shopify_identifier(shop, customer.id)
|
||||
if not party:
|
||||
party = cls()
|
||||
setattr_changed(party, 'name', remove_forbidden_chars(
|
||||
' '.join(filter(None, [
|
||||
customer.first_name, customer.last_name]))))
|
||||
contact_mechanisms = list(getattr(party, 'contact_mechanisms', []))
|
||||
for types, value in [
|
||||
(['email'], customer.email),
|
||||
(['phone', 'mobile'], customer.phone),
|
||||
]:
|
||||
value = remove_forbidden_chars(value)
|
||||
if not value:
|
||||
continue
|
||||
for contact_mechanism in contact_mechanisms:
|
||||
if (contact_mechanism.type in types
|
||||
and contact_mechanism.value == value):
|
||||
break
|
||||
else:
|
||||
contact_mechanisms.append(ContactMechanism(
|
||||
type=types[0], value=value))
|
||||
party.contact_mechanisms = contact_mechanisms
|
||||
# TODO tax_exempt
|
||||
return party
|
||||
|
||||
def get_address_from_shopify(self, shopify_address):
|
||||
pool = Pool()
|
||||
Address = pool.get('party.address')
|
||||
shopify_values = Address.get_shopify_values(shopify_address)
|
||||
for address in self.addresses:
|
||||
if address.shopify_values() == shopify_values:
|
||||
return address
|
||||
address = Address(**shopify_values)
|
||||
address.party = self
|
||||
address.save()
|
||||
return address
|
||||
|
||||
|
||||
class Address(metaclass=PoolMeta):
|
||||
__name__ = 'party.address'
|
||||
|
||||
@classmethod
|
||||
def get_shopify_values(self, address):
|
||||
pool = Pool()
|
||||
Country = pool.get('country.country')
|
||||
Subdivision = pool.get('country.subdivision')
|
||||
SubdivisionType = pool.get('party.address.subdivision_type')
|
||||
|
||||
values = {}
|
||||
values['party_name'] = remove_forbidden_chars(address.name or '')
|
||||
values['name'] = remove_forbidden_chars(address.company or '')
|
||||
values['street'] = '\n'.join(filter(None, [
|
||||
address.address1, address.address2]))
|
||||
values['city'] = remove_forbidden_chars(address.city or '')
|
||||
values['postal_code'] = address.zip or ''
|
||||
if address.country_code:
|
||||
country, = Country.search([
|
||||
('code', '=', address.country_code),
|
||||
], limit=1)
|
||||
values['country'] = country.id
|
||||
if address.province_code:
|
||||
subdivision_code = '-'.join(
|
||||
[address.country_code, address.province_code])
|
||||
subdivision_domain = [
|
||||
('country', '=', country.id),
|
||||
('code', 'like', subdivision_code + '%'),
|
||||
]
|
||||
types = SubdivisionType.get_types(country)
|
||||
if types:
|
||||
subdivision_domain.append(('type', 'in', types))
|
||||
subdivisions = Subdivision.search(subdivision_domain, limit=1)
|
||||
if subdivisions:
|
||||
subdivision, = subdivisions
|
||||
values['subdivision'] = subdivision.id
|
||||
return values
|
||||
|
||||
def shopify_values(self):
|
||||
values = {}
|
||||
values['party_name'] = self.party_name or ''
|
||||
values['name'] = self.name or ''
|
||||
values['street'] = self.street or ''
|
||||
values['city'] = self.city or ''
|
||||
values['postal_code'] = self.postal_code or ''
|
||||
if self.country:
|
||||
values['country'] = self.country.id
|
||||
if self.subdivision:
|
||||
values['subdivision'] = self.subdivision.id
|
||||
return values
|
||||
|
||||
|
||||
class Replace(metaclass=PoolMeta):
|
||||
__name__ = 'party.replace'
|
||||
|
||||
@classmethod
|
||||
def fields_to_replace(cls):
|
||||
return super().fields_to_replace() + [
|
||||
('web.shop.shopify_identifier', 'record'),
|
||||
]
|
||||
623
modules/web_shop_shopify/product.py
Executable file
623
modules/web_shop_shopify/product.py
Executable file
@@ -0,0 +1,623 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
from decimal import Decimal
|
||||
|
||||
import pyactiveresource
|
||||
import shopify
|
||||
|
||||
from trytond.i18n import gettext
|
||||
from trytond.model import ModelSQL, ModelView, fields
|
||||
from trytond.model.exceptions import AccessError
|
||||
from trytond.pool import Pool, PoolMeta
|
||||
from trytond.pyson import Bool, Eval, If
|
||||
from trytond.tools import grouped_slice, slugify
|
||||
from trytond.transaction import Transaction
|
||||
|
||||
from .common import IdentifiersMixin, IdentifiersUpdateMixin
|
||||
|
||||
|
||||
class Category(IdentifiersMixin, metaclass=PoolMeta):
|
||||
__name__ = 'product.category'
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls._shopify_fields.add('name')
|
||||
|
||||
def get_shopify(self, shop):
|
||||
shopify_id = self.get_shopify_identifier(shop)
|
||||
custom_collection = None
|
||||
if shopify_id:
|
||||
try:
|
||||
custom_collection = shopify.CustomCollection.find(shopify_id)
|
||||
except pyactiveresource.connection.ResourceNotFound:
|
||||
pass
|
||||
if custom_collection is None:
|
||||
custom_collection = shopify.CustomCollection()
|
||||
custom_collection.title = self.name[:255]
|
||||
custom_collection.published = False
|
||||
return custom_collection
|
||||
|
||||
def get_shopify_metafields(self, shop):
|
||||
return {}
|
||||
|
||||
|
||||
class TemplateCategory(IdentifiersUpdateMixin, metaclass=PoolMeta):
|
||||
__name__ = 'product.template-product.category'
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls._shopify_fields.update(['template', 'category'])
|
||||
|
||||
@classmethod
|
||||
def create(cls, vlist):
|
||||
records = super().create(vlist)
|
||||
cls.set_shopify_to_update(records)
|
||||
return records
|
||||
|
||||
@classmethod
|
||||
def delete(cls, records):
|
||||
cls.set_shopify_to_update(records)
|
||||
super().delete(records)
|
||||
|
||||
@classmethod
|
||||
def get_shopify_identifier_to_update(cls, records):
|
||||
return sum((list(r.template.shopify_identifiers) for r in records), [])
|
||||
|
||||
|
||||
class Template(IdentifiersMixin, metaclass=PoolMeta):
|
||||
__name__ = 'product.template'
|
||||
|
||||
shopify_uom = fields.Many2One(
|
||||
'product.uom', "Shopify UoM",
|
||||
states={
|
||||
'readonly': Bool(Eval('shopify_identifiers', [-1])),
|
||||
'invisible': ~Eval('salable', False),
|
||||
},
|
||||
depends={'default_uom_category'},
|
||||
help="The Unit of Measure of the product on Shopify.")
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls._shopify_fields.update([
|
||||
'name', 'web_shop_description', 'attribute_set',
|
||||
'customs_category', 'tariff_codes_category',
|
||||
'country_of_origin'])
|
||||
categories = cls._shopify_uom_categories()
|
||||
cls.shopify_uom.domain = [
|
||||
('category', 'in', [Eval(c, -1) for c in categories]),
|
||||
('digits', '=', 0),
|
||||
]
|
||||
|
||||
@classmethod
|
||||
def _shopify_uom_categories(cls):
|
||||
return ['default_uom_category']
|
||||
|
||||
def get_shopify_uom(self):
|
||||
return self.sale_uom
|
||||
|
||||
@classmethod
|
||||
def get_shopify_identifier_to_update(cls, templates):
|
||||
pool = Pool()
|
||||
Product = pool.get('product.product')
|
||||
products = [p for t in templates for p in t.products]
|
||||
return (super().get_shopify_identifier_to_update(templates)
|
||||
+ Product.get_shopify_identifier_to_update(products))
|
||||
|
||||
def get_shopify(self, shop):
|
||||
shopify_id = self.get_shopify_identifier(shop)
|
||||
product = None
|
||||
if shopify_id:
|
||||
try:
|
||||
product = shopify.Product.find(shopify_id)
|
||||
except pyactiveresource.connection.ResourceNotFound:
|
||||
pass
|
||||
if product is None:
|
||||
product = shopify.Product()
|
||||
product.title = self.name
|
||||
product.body_html = self.web_shop_description
|
||||
options = []
|
||||
for attribute in self.shopify_attributes:
|
||||
options.append({'name': attribute.string})
|
||||
product.options = options[:3] or [{'name': "Title"}]
|
||||
return product
|
||||
|
||||
def get_shopify_metafields(self, shop):
|
||||
return {}
|
||||
|
||||
@property
|
||||
def shopify_attributes(self):
|
||||
if not self.attribute_set:
|
||||
return []
|
||||
return filter(None, [
|
||||
self.attribute_set.shopify_option1,
|
||||
self.attribute_set.shopify_option2,
|
||||
self.attribute_set.shopify_option3])
|
||||
|
||||
|
||||
class Template_SaleSecondaryUnit(metaclass=PoolMeta):
|
||||
__name__ = 'product.template'
|
||||
|
||||
@classmethod
|
||||
def _shopify_uom_categories(cls):
|
||||
return super()._shopify_uom_categories() + [
|
||||
'sale_secondary_uom_category']
|
||||
|
||||
def get_shopify_uom(self):
|
||||
uom = super().get_shopify_uom()
|
||||
if self.sale_secondary_uom and not self.sale_secondary_uom.digits:
|
||||
uom = self.sale_secondary_uom
|
||||
return uom
|
||||
|
||||
|
||||
class Product(IdentifiersMixin, metaclass=PoolMeta):
|
||||
__name__ = 'product.product'
|
||||
|
||||
shopify_sku = fields.Function(
|
||||
fields.Char("SKU"), 'get_shopify_sku', searcher='search_shopify_sku')
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls._shopify_fields.update([
|
||||
'code', 'weight', 'weight_uom', 'attributes'])
|
||||
|
||||
@classmethod
|
||||
def get_shopify_identifier_to_update(cls, records):
|
||||
pool = Pool()
|
||||
InventoryItem = pool.get('product.shopify_inventory_item')
|
||||
items = InventoryItem.browse(records)
|
||||
return (super().get_shopify_identifier_to_update(records)
|
||||
+ sum((list(i.shopify_identifiers) for i in items), []))
|
||||
|
||||
def set_shopify_identifier(self, web_shop, identifier=None):
|
||||
pool = Pool()
|
||||
InventoryItem = pool.get('product.shopify_inventory_item')
|
||||
if not identifier:
|
||||
inventory_item = InventoryItem(self.id)
|
||||
inventory_item.set_shopify_identifier(web_shop)
|
||||
return super().set_shopify_identifier(web_shop, identifier=identifier)
|
||||
|
||||
def get_shopify_sku(self, name):
|
||||
return self.code
|
||||
|
||||
@classmethod
|
||||
def search_shopify_sku(cls, name, clause):
|
||||
return [('code',) + tuple(clause[1:])]
|
||||
|
||||
def get_shopify(
|
||||
self, shop, price, tax, shop_taxes_included=True,
|
||||
shop_weight_unit=None):
|
||||
pool = Pool()
|
||||
ModelData = pool.get('ir.model.data')
|
||||
Uom = pool.get('product.uom')
|
||||
shopify_id = self.get_shopify_identifier(shop)
|
||||
variant = None
|
||||
if shopify_id:
|
||||
try:
|
||||
variant = shopify.Variant.find(shopify_id)
|
||||
except pyactiveresource.connection.ResourceNotFound:
|
||||
pass
|
||||
if variant is None:
|
||||
variant = shopify.Variant()
|
||||
product_id = self.template.get_shopify_identifier(shop)
|
||||
if product_id is not None:
|
||||
variant.product_id = product_id
|
||||
variant.sku = self.shopify_sku
|
||||
price = self.shopify_price(
|
||||
price, tax, taxes_included=shop_taxes_included)
|
||||
if price is not None:
|
||||
variant.price = str(price.quantize(Decimal('.00')))
|
||||
else:
|
||||
variant.price = None
|
||||
variant.taxable = bool(tax)
|
||||
for identifier in self.identifiers:
|
||||
if identifier.type == 'ean':
|
||||
variant.barcode = identifier.code
|
||||
break
|
||||
for i, attribute in enumerate(self.template.shopify_attributes, 1):
|
||||
if self.attributes:
|
||||
value = self.attributes.get(attribute.name)
|
||||
else:
|
||||
value = None
|
||||
value = attribute.format(value)
|
||||
setattr(variant, 'option%i' % i, value)
|
||||
if getattr(self, 'weight', None) and shop_weight_unit:
|
||||
units = {}
|
||||
units['kg'] = ModelData.get_id('product', 'uom_kilogram')
|
||||
units['g'] = ModelData.get_id('product', 'uom_gram')
|
||||
units['lb'] = ModelData.get_id('product', 'uom_pound')
|
||||
units['oz'] = ModelData.get_id('product', 'uom_ounce')
|
||||
weight = self.weight
|
||||
weight_unit = self.weight_uom
|
||||
if self.weight_uom.id not in units.values():
|
||||
weight_unit = Uom(units[shop_weight_unit])
|
||||
weight = Uom.compute_qty(self.weight_uom, weight, weight_unit)
|
||||
variant.weight = weight
|
||||
variant.weight_unit = {
|
||||
v: k for k, v in units.items()}[weight_unit.id]
|
||||
for image in getattr(self, 'images_used', []):
|
||||
if image.web_shop:
|
||||
variant.image_id = image.get_shopify_identifier(shop)
|
||||
break
|
||||
else:
|
||||
variant.image_id = None
|
||||
return variant
|
||||
|
||||
def get_shopify_metafields(self, shop):
|
||||
return {}
|
||||
|
||||
def shopify_price(self, price, tax, taxes_included=True):
|
||||
pool = Pool()
|
||||
Uom = pool.get('product.uom')
|
||||
if price is None or tax is None:
|
||||
return None
|
||||
if taxes_included:
|
||||
price += tax
|
||||
return Uom.compute_price(
|
||||
self.sale_uom, price, self.shopify_uom,
|
||||
factor=self.shopify_uom_factor, rate=self.shopify_uom_rate)
|
||||
|
||||
@property
|
||||
def shopify_uom_factor(self):
|
||||
return None
|
||||
|
||||
@property
|
||||
def shopify_uom_rate(self):
|
||||
return None
|
||||
|
||||
@property
|
||||
def shopify_quantity(self):
|
||||
pool = Pool()
|
||||
Uom = pool.get('product.uom')
|
||||
quantity = self.forecast_quantity
|
||||
if quantity < 0:
|
||||
quantity = 0
|
||||
return Uom.compute_qty(
|
||||
self.default_uom, quantity, self.shopify_uom, round=True,
|
||||
factor=self.shopify_uom_factor, rate=self.shopify_uom_rate)
|
||||
|
||||
@classmethod
|
||||
def write(cls, *args):
|
||||
actions = iter(args)
|
||||
for products, values in zip(actions, actions):
|
||||
if 'template' in values:
|
||||
for product in products:
|
||||
if (product.template.id != values.get('template')
|
||||
and product.shopify_identifiers):
|
||||
raise AccessError(gettext(
|
||||
'web_shop_shopify.msg_product_change_template',
|
||||
product=product.rec_name))
|
||||
super().write(*args)
|
||||
|
||||
|
||||
class ShopifyInventoryItem(IdentifiersMixin, ModelSQL, ModelView):
|
||||
"Shopify Inventory Item"
|
||||
__name__ = 'product.shopify_inventory_item'
|
||||
|
||||
product = fields.Function(
|
||||
fields.Many2One('product.product', "Product"), 'get_product')
|
||||
|
||||
@classmethod
|
||||
def table_query(cls):
|
||||
return Pool().get('product.product').__table__()
|
||||
|
||||
def get_product(self, name):
|
||||
return self.id
|
||||
|
||||
def get_shopify(self, shop):
|
||||
pool = Pool()
|
||||
Product = pool.get('product.product')
|
||||
Move = pool.get('stock.move')
|
||||
# TODO: replace with product_types from sale line
|
||||
move_types = Move.get_product_types()
|
||||
|
||||
shopify_id = self.get_shopify_identifier(shop)
|
||||
inventory_item = None
|
||||
if shopify_id:
|
||||
try:
|
||||
inventory_item = shopify.InventoryItem.find(shopify_id)
|
||||
except pyactiveresource.connection.ResourceNotFound:
|
||||
pass
|
||||
if inventory_item is None:
|
||||
product = Product(self.id)
|
||||
variant_id = product.get_shopify_identifier(shop)
|
||||
if not variant_id:
|
||||
return
|
||||
try:
|
||||
variant = shopify.Variant.find(variant_id)
|
||||
except pyactiveresource.connection.ResourceNotFound:
|
||||
return
|
||||
inventory_item = shopify.InventoryItem.find(
|
||||
variant.inventory_item_id)
|
||||
inventory_item.tracked = (
|
||||
self.product.type in move_types and not self.product.consumable)
|
||||
inventory_item.requires_shipping = self.product.type in move_types
|
||||
return inventory_item
|
||||
|
||||
|
||||
class ShopifyInventoryItem_Customs(metaclass=PoolMeta):
|
||||
__name__ = 'product.shopify_inventory_item'
|
||||
|
||||
def get_shopify(self, shop):
|
||||
pool = Pool()
|
||||
Date = pool.get('ir.date')
|
||||
inventory_item = super().get_shopify(shop)
|
||||
if inventory_item:
|
||||
with Transaction().set_context(company=shop.company.id):
|
||||
today = Date.today()
|
||||
inventory_item.country_code_of_origin = (
|
||||
self.product.country_of_origin.code
|
||||
if self.product.country_of_origin else None)
|
||||
tariff_code = self.product.get_tariff_code(
|
||||
{'date': today, 'country': None})
|
||||
inventory_item.harmonized_system_code = (
|
||||
tariff_code.code if tariff_code else None)
|
||||
country_harmonized_system_codes = []
|
||||
countries = set()
|
||||
for tariff_code in self.product.get_tariff_codes({'date': today}):
|
||||
if (tariff_code.country
|
||||
and tariff_code.country not in countries):
|
||||
country_harmonized_system_codes.append({
|
||||
'harmonized_system_code': tariff_code.code,
|
||||
'country_code': tariff_code.country.code,
|
||||
})
|
||||
countries.add(tariff_code.country)
|
||||
inventory_item.country_harmonized_system_codes = (
|
||||
country_harmonized_system_codes)
|
||||
return inventory_item
|
||||
|
||||
|
||||
class Product_TariffCode(IdentifiersUpdateMixin, metaclass=PoolMeta):
|
||||
__name__ = 'product-customs.tariff.code'
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls._shopify_fields.update(['product', 'tariff_code'])
|
||||
|
||||
@classmethod
|
||||
def create(cls, vlist):
|
||||
identifiers = super().create(vlist)
|
||||
cls.set_shopify_to_update(identifiers)
|
||||
return identifiers
|
||||
|
||||
@classmethod
|
||||
def delete(cls, records):
|
||||
cls.set_shopify_to_update(records)
|
||||
super().delete(records)
|
||||
|
||||
@classmethod
|
||||
def get_shopify_identifier_to_update(cls, records):
|
||||
pool = Pool()
|
||||
Template = pool.get('product.template')
|
||||
Category = pool.get('product.category')
|
||||
templates = set()
|
||||
categories = set()
|
||||
for record in records:
|
||||
if isinstance(record.product, Template):
|
||||
templates.add(record.product)
|
||||
elif isinstance(record.product, Category):
|
||||
categories.add(record.product)
|
||||
if categories:
|
||||
for sub_categories in grouped_slice(list(categories)):
|
||||
templates.update(Template.search([
|
||||
('customs_category', 'in',
|
||||
[c.id for c in sub_categories]),
|
||||
]))
|
||||
templates = Template.browse(list(templates))
|
||||
return Template.get_shopify_identifier_to_update(templates)
|
||||
|
||||
|
||||
class ProductIdentifier(IdentifiersUpdateMixin, metaclass=PoolMeta):
|
||||
__name__ = 'product.identifier'
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls._shopify_fields.update(['product', 'code'])
|
||||
|
||||
@classmethod
|
||||
def create(cls, vlist):
|
||||
identifiers = super().create(vlist)
|
||||
cls.set_shopify_to_update(identifiers)
|
||||
return identifiers
|
||||
|
||||
@classmethod
|
||||
def delete(cls, identifiers):
|
||||
cls.set_shopify_to_update(identifiers)
|
||||
super().delete(identifiers)
|
||||
|
||||
@classmethod
|
||||
def get_shopify_identifier_to_update(cls, identifiers):
|
||||
return sum((
|
||||
list(i.product.shopify_identifiers) for i in identifiers), [])
|
||||
|
||||
|
||||
class Product_SaleSecondaryUnit(metaclass=PoolMeta):
|
||||
__name__ = 'product.product'
|
||||
|
||||
@property
|
||||
def shopify_uom_factor(self):
|
||||
factor = super().shopify_uom_factor
|
||||
if (self.sale_secondary_uom
|
||||
and self.shopify_uom.category
|
||||
== self.sale_secondary_uom.category):
|
||||
factor = self.sale_secondary_uom_normal_factor
|
||||
return factor
|
||||
|
||||
@property
|
||||
def shopify_uom_rate(self):
|
||||
rate = super().shopify_uom_rate
|
||||
if (self.sale_secondary_uom
|
||||
and self.shopify_uom.category
|
||||
== self.sale_secondary_uom.category):
|
||||
rate = self.sale_secondary_uom_normal_rate
|
||||
return rate
|
||||
|
||||
|
||||
class AttributeSet(IdentifiersUpdateMixin, metaclass=PoolMeta):
|
||||
__name__ = 'product.attribute.set'
|
||||
|
||||
shopify_option1 = fields.Many2One(
|
||||
'product.attribute', "Option 1",
|
||||
domain=[
|
||||
('id', 'in', Eval('attributes', [])),
|
||||
If(Eval('shopify_option2'),
|
||||
('id', '!=', Eval('shopify_option2')),
|
||||
()),
|
||||
If(Eval('shopify_option3'),
|
||||
('id', '!=', Eval('shopify_option3')),
|
||||
()),
|
||||
])
|
||||
shopify_option2 = fields.Many2One(
|
||||
'product.attribute', "Option 2",
|
||||
domain=[
|
||||
('id', 'in', Eval('attributes', [])),
|
||||
If(Eval('shopify_option1'),
|
||||
('id', '!=', Eval('shopify_option1')),
|
||||
('id', '=', None)),
|
||||
If(Eval('shopify_option3'),
|
||||
('id', '!=', Eval('shopify_option3')),
|
||||
()),
|
||||
],
|
||||
states={
|
||||
'invisible': ~Eval('shopify_option1'),
|
||||
})
|
||||
shopify_option3 = fields.Many2One(
|
||||
'product.attribute', "Option 3",
|
||||
domain=[
|
||||
('id', 'in', Eval('attributes', [])),
|
||||
If(Eval('shopify_option1'),
|
||||
('id', '!=', Eval('shopify_option1')),
|
||||
()),
|
||||
If(Eval('shopify_option2'),
|
||||
('id', '!=', Eval('shopify_option2')),
|
||||
('id', '=', None)),
|
||||
],
|
||||
states={
|
||||
'invisible': ~Eval('shopify_option2'),
|
||||
})
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls._shopify_fields.update(
|
||||
['shopify_option1', 'shopify_option2', 'shopify_option3'])
|
||||
|
||||
@classmethod
|
||||
def get_shopify_identifier_to_update(cls, sets):
|
||||
pool = Pool()
|
||||
Template = pool.get('product.template')
|
||||
templates = []
|
||||
for sub_sets in grouped_slice(sets):
|
||||
templates.extend(Template.search([
|
||||
('attribute_set', 'in', [s.id for s in sub_sets]),
|
||||
]))
|
||||
return Template.get_shopify_identifier_to_update(templates)
|
||||
|
||||
|
||||
class Attribute(IdentifiersUpdateMixin, metaclass=PoolMeta):
|
||||
__name__ = 'product.attribute'
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls._shopify_fields.add('selection')
|
||||
domain = [
|
||||
('type', '!=', 'shopify'),
|
||||
]
|
||||
if cls.web_shops.domain:
|
||||
cls.web_shops.domain = [cls.web_shops.domain, domain]
|
||||
else:
|
||||
cls.web_shops.domain = domain
|
||||
|
||||
@classmethod
|
||||
def get_shopify_identifier_to_update(cls, attributes):
|
||||
pool = Pool()
|
||||
Set = pool.get('product.attribute.set')
|
||||
sets = Set.browse(sum((a.sets for a in attributes), ()))
|
||||
return Set.get_shopify_identifier_to_update(sets)
|
||||
|
||||
|
||||
class Image(IdentifiersMixin, metaclass=PoolMeta):
|
||||
__name__ = 'product.image'
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls._shopify_fields.update(['template', 'product', 'attributes'])
|
||||
|
||||
@classmethod
|
||||
def create(cls, vlist):
|
||||
images = super().create(vlist)
|
||||
cls.set_shopify_to_update(images)
|
||||
return images
|
||||
|
||||
@classmethod
|
||||
def write(cls, *args):
|
||||
pool = Pool()
|
||||
Identifier = pool.get('web.shop.shopify_identifier')
|
||||
actions = iter(args)
|
||||
to_delete = []
|
||||
for images, values in zip(actions, actions):
|
||||
if values.keys() & {'image', 'template', 'web_shop'}:
|
||||
for image in images:
|
||||
to_delete.extend(image.shopify_identifiers)
|
||||
super().write(*args)
|
||||
Identifier.delete(to_delete)
|
||||
|
||||
@classmethod
|
||||
def delete(cls, images):
|
||||
cls.set_shopify_to_update(images)
|
||||
super().delete(images)
|
||||
|
||||
@classmethod
|
||||
def get_shopify_identifier_to_update(cls, images):
|
||||
return (
|
||||
sum((list(i.template.shopify_identifiers) for i in images), [])
|
||||
+ sum(
|
||||
(list(p.shopify_identifiers)
|
||||
for i in images for p in i.template.products), []))
|
||||
|
||||
def get_shopify(self, shop):
|
||||
shopify_id = self.get_shopify_identifier(shop)
|
||||
product_id = self.template.get_shopify_identifier(shop)
|
||||
product_image = None
|
||||
if shopify_id and product_id:
|
||||
try:
|
||||
product_image = shopify.Image.find(
|
||||
shopify_id, product_id=product_id)
|
||||
except pyactiveresource.connection.ResourceNotFound:
|
||||
pass
|
||||
if product_image is None:
|
||||
product_image = shopify.Image()
|
||||
product_image.attach_image(
|
||||
self.image, filename=slugify(self.shopify_name))
|
||||
product_image.product_id = self.template.get_shopify_identifier(shop)
|
||||
product_image.alt = self.shopify_name
|
||||
return product_image
|
||||
|
||||
@property
|
||||
def shopify_name(self):
|
||||
if self.product:
|
||||
return self.product.name
|
||||
else:
|
||||
return self.template.name
|
||||
|
||||
|
||||
class Image_Attribute(metaclass=PoolMeta):
|
||||
__name__ = 'product.image'
|
||||
|
||||
@property
|
||||
def shopify_name(self):
|
||||
name = super().shopify_name
|
||||
if self.product:
|
||||
attributes_name = self.product.attributes_name
|
||||
else:
|
||||
attributes_name = self.attributes_name
|
||||
if attributes_name:
|
||||
name += ' ' + attributes_name
|
||||
return name
|
||||
18
modules/web_shop_shopify/product.xml
Executable file
18
modules/web_shop_shopify/product.xml
Executable file
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<tryton>
|
||||
<data>
|
||||
<record model="ir.ui.view" id="product_template_view_form">
|
||||
<field name="model">product.template</field>
|
||||
<field name="inherit" ref="product.template_view_form"/>
|
||||
<field name="name">product_template_form</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="product_attribute_set_view_form">
|
||||
<field name="model">product.attribute.set</field>
|
||||
<field name="inherit" ref="product_attribute.attribute_set_view_form"/>
|
||||
<field name="name">product_attribute_set_form</field>
|
||||
</record>
|
||||
</data>
|
||||
</tryton>
|
||||
56
modules/web_shop_shopify/routes.py
Executable file
56
modules/web_shop_shopify/routes.py
Executable file
@@ -0,0 +1,56 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
import base64
|
||||
import hashlib
|
||||
import hmac
|
||||
import logging
|
||||
|
||||
from trytond.protocols.wrappers import (
|
||||
HTTPStatus, Response, abort, with_pool, with_transaction)
|
||||
from trytond.wsgi import app
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def verify_webhook(data, hmac_header, secret):
|
||||
digest = hmac.new(secret, data, hashlib.sha256).digest()
|
||||
computed_hmac = base64.b64encode(digest)
|
||||
return hmac.compare_digest(computed_hmac, hmac_header.encode('utf-8'))
|
||||
|
||||
|
||||
@app.route(
|
||||
'/<database_name>/web_shop_shopify/webhook/<shop>/order', methods={'POST'})
|
||||
@with_pool
|
||||
@with_transaction(context={'_skip_warnings': True})
|
||||
def order(request, pool, shop):
|
||||
Sale = pool.get('sale.sale')
|
||||
Shop = pool.get('web.shop')
|
||||
shop = Shop.get(shop)
|
||||
data = request.get_data()
|
||||
verified = verify_webhook(
|
||||
data, request.headers.get('X-Shopify-Hmac-SHA256'),
|
||||
shop.shopify_webhook_shared_secret.encode('utf-8'))
|
||||
if not verified:
|
||||
abort(HTTPStatus.UNAUTHORIZED)
|
||||
|
||||
topic = request.headers.get('X-Shopify-Topic')
|
||||
order = request.get_json()
|
||||
if topic == 'orders/create':
|
||||
if not Sale.search([
|
||||
('web_shop', '=', shop.id),
|
||||
('shopify_identifier', '=', order['id']),
|
||||
], order=[], limit=1):
|
||||
Shop.__queue__.shopify_fetch_order([shop])
|
||||
elif topic in {'orders/updated', 'orders/payment'}:
|
||||
sales = Sale.search([
|
||||
('web_shop', '=', shop.id),
|
||||
('shopify_identifier', '=', order['id']),
|
||||
], order=[], limit=1)
|
||||
if not sales:
|
||||
Shop.__queue__.shopify_fetch_order([shop])
|
||||
else:
|
||||
sale, = sales
|
||||
Shop.__queue__.shopify_update_sale([sale], [order])
|
||||
else:
|
||||
logger.info("Unsupported topic '%s'", topic)
|
||||
return Response(status=HTTPStatus.NO_CONTENT)
|
||||
446
modules/web_shop_shopify/sale.py
Executable file
446
modules/web_shop_shopify/sale.py
Executable file
@@ -0,0 +1,446 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
from collections import defaultdict
|
||||
from decimal import Decimal
|
||||
from itertools import zip_longest
|
||||
|
||||
import dateutil
|
||||
import shopify
|
||||
|
||||
from trytond.i18n import gettext
|
||||
from trytond.model import ModelView, Unique, fields
|
||||
from trytond.modules.currency.fields import Monetary
|
||||
from trytond.modules.product import round_price
|
||||
from trytond.modules.sale.exceptions import SaleConfirmError
|
||||
from trytond.pool import Pool, PoolMeta
|
||||
from trytond.transaction import Transaction
|
||||
|
||||
from .common import IdentifierMixin
|
||||
from .exceptions import ShopifyError
|
||||
|
||||
|
||||
class Sale(IdentifierMixin, metaclass=PoolMeta):
|
||||
__name__ = 'sale.sale'
|
||||
|
||||
shopify_tax_adjustment = Monetary(
|
||||
"Shopify Tax Adjustment",
|
||||
currency='currency', digits='currency', readonly=True)
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
t = cls.__table__()
|
||||
cls._sql_constraints += [
|
||||
('web_shop_shopify_identifier_unique',
|
||||
Unique(t, t.web_shop, t.shopify_identifier_signed),
|
||||
'web_shop_shopify.msg_identifier_sale_web_shop_unique'),
|
||||
]
|
||||
|
||||
@fields.depends('shopify_tax_adjustment')
|
||||
def get_tax_amount(self):
|
||||
amount = super().get_tax_amount()
|
||||
if self.shopify_tax_adjustment:
|
||||
amount += self.shopify_tax_adjustment
|
||||
return amount
|
||||
|
||||
@classmethod
|
||||
def get_from_shopify(cls, shop, order, sale=None):
|
||||
pool = Pool()
|
||||
Party = pool.get('party.party')
|
||||
Address = pool.get('party.address')
|
||||
ContactMechanism = pool.get('party.contact_mechanism')
|
||||
Currency = pool.get('currency.currency')
|
||||
Line = pool.get('sale.line')
|
||||
|
||||
if getattr(order, 'customer', None):
|
||||
party = Party.get_from_shopify(shop, order.customer)
|
||||
party.save()
|
||||
party.set_shopify_identifier(shop, order.customer.id)
|
||||
else:
|
||||
party = Party()
|
||||
party.save()
|
||||
|
||||
if not sale:
|
||||
sale = shop.get_sale(party=party)
|
||||
sale.shopify_identifier = order.id
|
||||
assert sale.shopify_identifier == order.id
|
||||
if order.location_id:
|
||||
for shop_warehouse in shop.shopify_warehouses:
|
||||
if shop_warehouse.shopify_id == str(order.location_id):
|
||||
sale.warehouse = shop_warehouse.warehouse
|
||||
break
|
||||
if sale.currency.code != order.currency:
|
||||
sale.currency, = Currency.search([
|
||||
('code', '=', order.currency),
|
||||
], limit=1)
|
||||
|
||||
if getattr(order, 'shipping_address', None):
|
||||
sale.shipment_address = party.get_address_from_shopify(
|
||||
order.shipping_address)
|
||||
if getattr(order, 'billing_address', None):
|
||||
sale.invoice_address = party.get_address_from_shopify(
|
||||
order.billing_address)
|
||||
|
||||
if not party.addresses:
|
||||
address = Address(party=party)
|
||||
address.save()
|
||||
if not sale.shipment_address:
|
||||
sale.shipment_address = address
|
||||
if not sale.invoice_address:
|
||||
sale.invoice_address = address
|
||||
|
||||
sale.reference = order.name
|
||||
sale.comment = order.note
|
||||
sale.sale_date = dateutil.parser.isoparse(
|
||||
order.processed_at or order.created_at).date()
|
||||
|
||||
if order.phone:
|
||||
for contact_mechanism in party.contact_mechanisms:
|
||||
if (contact_mechanism.type in {'phone', 'mobile'}
|
||||
and contact_mechanism.value == order.phone):
|
||||
break
|
||||
else:
|
||||
contact_mechanism = ContactMechanism(
|
||||
party=party, type='phone', value=order.phone)
|
||||
sale.contact = contact_mechanism
|
||||
|
||||
refund_line_items = defaultdict(list)
|
||||
for refund in order.refunds:
|
||||
for refund_line_item in refund.refund_line_items:
|
||||
refund_line_items[refund_line_item.line_item_id].append(
|
||||
refund_line_item)
|
||||
|
||||
id2line = {
|
||||
l.shopify_identifier: l for l in getattr(sale, 'lines', [])
|
||||
if l.shopify_identifier}
|
||||
shipping_lines = [
|
||||
l for l in getattr(sale, 'lines', []) if not
|
||||
l.shopify_identifier]
|
||||
lines = []
|
||||
for line_item in order.line_items:
|
||||
line = id2line.pop(line_item.id, None)
|
||||
quantity = line_item.quantity
|
||||
for refund_line_item in refund_line_items[line_item.id]:
|
||||
if refund_line_item.restock_type == 'cancel':
|
||||
quantity -= refund_line_item.quantity
|
||||
lines.append(Line.get_from_shopify(
|
||||
sale, line_item, quantity, line=line))
|
||||
for shipping_line, line in zip_longest(
|
||||
order.shipping_lines, shipping_lines):
|
||||
if shipping_line:
|
||||
line = Line.get_from_shopify_shipping(
|
||||
sale, shipping_line, line=line)
|
||||
else:
|
||||
line.quantity = 0
|
||||
lines.append(line)
|
||||
for line in id2line.values():
|
||||
line.quantity = 0
|
||||
sale.lines = lines
|
||||
return sale
|
||||
|
||||
@property
|
||||
def invoice_grouping_method(self):
|
||||
method = super().invoice_grouping_method
|
||||
if self.web_shop and self.web_shop.type == 'shopify':
|
||||
# Can not group in order to spread tax adjustment
|
||||
method = None
|
||||
return method
|
||||
|
||||
def create_invoice(self):
|
||||
pool = Pool()
|
||||
Currency = pool.get('currency.currency')
|
||||
invoice = super().create_invoice()
|
||||
if invoice and self.shopify_tax_adjustment:
|
||||
invoice.save()
|
||||
adjustment = Currency.compute(
|
||||
self.currency, self.shopify_tax_adjustment, invoice.currency,
|
||||
round=False)
|
||||
untaxed_amount = Currency.compute(
|
||||
self.currency, self.untaxed_amount, invoice.currency,
|
||||
round=False)
|
||||
remaining = invoice.currency.round(
|
||||
adjustment * (invoice.untaxed_amount / untaxed_amount))
|
||||
taxes = invoice.taxes
|
||||
for tax in taxes:
|
||||
if tax.amount:
|
||||
if invoice.tax_amount:
|
||||
ratio = tax.amount / invoice.tax_amount
|
||||
else:
|
||||
ratio = 1 / len(invoice.taxes)
|
||||
value = invoice.currency.round(adjustment * ratio)
|
||||
tax.amount += value
|
||||
remaining -= value
|
||||
if remaining:
|
||||
for tax in taxes:
|
||||
if tax.amount:
|
||||
tax.amount += remaining
|
||||
break
|
||||
invoice.taxes = taxes
|
||||
invoice.save()
|
||||
return invoice
|
||||
|
||||
@classmethod
|
||||
@ModelView.button
|
||||
def process(cls, sales):
|
||||
for sale in sales:
|
||||
for line in sale.lines:
|
||||
if not line.product and line.shopify_identifier:
|
||||
raise SaleConfirmError(
|
||||
gettext('web_shop_shopify'
|
||||
'.msg_sale_line_without_product',
|
||||
sale=sale.rec_name,
|
||||
line=line.rec_name))
|
||||
super().process(sales)
|
||||
for sale in sales:
|
||||
if not sale.web_shop or not sale.shopify_identifier:
|
||||
continue
|
||||
cls.__queue__._process_shopify(sale)
|
||||
|
||||
def _process_shopify(self):
|
||||
"""Sent updates to shopify
|
||||
|
||||
The transaction is committed if fulfillment is created.
|
||||
"""
|
||||
pool = Pool()
|
||||
Payment = pool.get('account.payment')
|
||||
with self.web_shop.shopify_session():
|
||||
for shipment in self.shipments:
|
||||
fulfillment = shipment.get_shopify(self)
|
||||
if fulfillment:
|
||||
if not fulfillment.save():
|
||||
raise ShopifyError(gettext(
|
||||
'web_shop_shopify.msg_fulfillment_fail',
|
||||
sale=self.rec_name,
|
||||
error="\n".join(
|
||||
fulfillment.errors.full_messages())))
|
||||
shipment.set_shopify_identifier(self, fulfillment.id)
|
||||
Transaction().commit()
|
||||
|
||||
# TODO: manage drop shipment
|
||||
|
||||
if self.shipment_state == 'sent':
|
||||
# TODO: manage shopping refund
|
||||
refund = self.get_shopify_refund(shipping={
|
||||
'full_refund': False,
|
||||
})
|
||||
if refund:
|
||||
if not refund.save():
|
||||
raise ShopifyError(gettext(
|
||||
'web_shop_shopify.msg_refund_fail',
|
||||
sale=self.rec_name,
|
||||
error="\n".join(
|
||||
refund.errors.full_messages())))
|
||||
order = shopify.Order.find(self.shopify_identifier)
|
||||
Payment.get_from_shopify(self, order)
|
||||
|
||||
if self.state == 'done':
|
||||
order = shopify.Order.find(self.shopify_identifier)
|
||||
order.close()
|
||||
|
||||
def get_shopify_refund(self, shipping):
|
||||
order = shopify.Order.find(self.shopify_identifier)
|
||||
fulfillable_quantities = {
|
||||
l.id: l.fulfillable_quantity for l in order.line_items}
|
||||
refund_line_items = list(
|
||||
self.get_shopify_refund_line_items(fulfillable_quantities))
|
||||
if not refund_line_items:
|
||||
return
|
||||
|
||||
refund = shopify.Refund.calculate(
|
||||
self.shopify_identifier, shipping={
|
||||
'full_refund': False,
|
||||
},
|
||||
refund_line_items=refund_line_items)
|
||||
refund.refund_line_items = refund_line_items
|
||||
for transaction in refund.transactions:
|
||||
transaction.kind = 'refund'
|
||||
return refund
|
||||
|
||||
def get_shopify_refund_line_items(self, fulfillable_quantities):
|
||||
pool = Pool()
|
||||
Uom = pool.get('product.uom')
|
||||
|
||||
assert self.shipment_state == 'sent'
|
||||
location_id = None
|
||||
for shop_warehouse in self.web_shop.shopify_warehouses:
|
||||
if shop_warehouse.warehouse == self.warehouse:
|
||||
location_id = shop_warehouse.shopify_id
|
||||
for line in self.lines:
|
||||
if (line.type != 'line'
|
||||
or not line.shopify_identifier):
|
||||
continue
|
||||
fulfillable_quantity = fulfillable_quantities.get(
|
||||
line.shopify_identifier, 0)
|
||||
quantity = line.quantity
|
||||
for move in line.moves:
|
||||
if move.state == 'done':
|
||||
quantity -= Uom.compute_qty(
|
||||
move.unit, move.quantity, line.unit)
|
||||
quantity = min(fulfillable_quantity, quantity)
|
||||
if quantity > 0:
|
||||
yield {
|
||||
'line_item_id': line.shopify_identifier,
|
||||
'quantity': int(quantity),
|
||||
'restock_type': 'cancel',
|
||||
'location_id': location_id,
|
||||
}
|
||||
|
||||
|
||||
class Sale_ShipmentCost(metaclass=PoolMeta):
|
||||
__name__ = 'sale.sale'
|
||||
|
||||
def set_shipment_cost(self):
|
||||
if self.web_shop and self.web_shop.type == 'shopify':
|
||||
return []
|
||||
return super().set_shipment_cost()
|
||||
|
||||
@classmethod
|
||||
def get_from_shopify(cls, shop, order, sale=None):
|
||||
pool = Pool()
|
||||
Tax = pool.get('account.tax')
|
||||
|
||||
sale = super().get_from_shopify(shop, order, sale=sale)
|
||||
|
||||
sale.shipment_cost_method = 'order'
|
||||
if order.shipping_lines:
|
||||
available_carriers = sale.on_change_with_available_carriers()
|
||||
if available_carriers:
|
||||
sale.carrier = available_carriers[0]
|
||||
if sale.carrier:
|
||||
for line in sale.lines:
|
||||
if getattr(line, 'shipment_cost', None) is not None:
|
||||
unit_price = line.unit_price
|
||||
base_price = getattr(line, 'base_price', None)
|
||||
line.product = sale.carrier.carrier_product
|
||||
line.on_change_product()
|
||||
line.unit_price = round_price(Tax.reverse_compute(
|
||||
unit_price, line.taxes, sale.sale_date))
|
||||
if base_price is not None:
|
||||
line.base_price = round_price(Tax.reverse_compute(
|
||||
base_price, line.taxes, sale.sale_date))
|
||||
return sale
|
||||
|
||||
|
||||
class Line(IdentifierMixin, metaclass=PoolMeta):
|
||||
__name__ = 'sale.line'
|
||||
|
||||
@classmethod
|
||||
def get_from_shopify(cls, sale, line_item, quantity, line=None):
|
||||
pool = Pool()
|
||||
Product = pool.get('product.product')
|
||||
Tax = pool.get('account.tax')
|
||||
|
||||
if not line:
|
||||
line = cls(type='line')
|
||||
line.sale = sale
|
||||
line.shopify_identifier = line_item.id
|
||||
assert line.shopify_identifier == line_item.id
|
||||
if getattr(line_item, 'variant_id', None):
|
||||
line.product = Product.search_shopify_identifier(
|
||||
sale.web_shop, line_item.variant_id)
|
||||
else:
|
||||
line.product = None
|
||||
if line.product:
|
||||
line._set_shopify_quantity(line.product, quantity)
|
||||
line.on_change_product()
|
||||
else:
|
||||
line.quantity = quantity
|
||||
line.description = line_item.title
|
||||
line.taxes = []
|
||||
total_discount = sum(
|
||||
Decimal(d.amount) for d in line_item.discount_allocations)
|
||||
unit_price = ((
|
||||
(Decimal(line_item.price) * line_item.quantity)
|
||||
- Decimal(total_discount))
|
||||
/ line_item.quantity)
|
||||
unit_price = round_price(Tax.reverse_compute(
|
||||
unit_price, line.taxes, sale.sale_date))
|
||||
if line.product:
|
||||
line._set_shopify_unit_price(line.product, unit_price)
|
||||
else:
|
||||
line.unit_price = unit_price
|
||||
return line
|
||||
|
||||
def _set_shopify_quantity(self, product, quantity):
|
||||
if product.shopify_uom.category == product.sale_uom.category:
|
||||
self.unit = self.product.shopify_uom
|
||||
self.quantity = quantity
|
||||
|
||||
def _set_shopify_unit_price(self, product, unit_price):
|
||||
if product.shopify_uom.category == product.sale_uom.category:
|
||||
self.unit_price = unit_price
|
||||
|
||||
@classmethod
|
||||
def get_from_shopify_shipping(cls, sale, shipping_line, line=None):
|
||||
if not line:
|
||||
line = cls(type='line')
|
||||
line.sale = sale
|
||||
line.quantity = 1
|
||||
line.unit_price = round_price(Decimal(shipping_line.discounted_price))
|
||||
line.description = shipping_line.title
|
||||
return line
|
||||
|
||||
def _get_invoice_line_quantity(self):
|
||||
quantity = super()._get_invoice_line_quantity()
|
||||
if self.sale.web_shop and self.sale.web_shop.type == 'shopify':
|
||||
if (self.sale.get_shipment_state() != 'sent'
|
||||
and any(l.product.type != 'service'
|
||||
for l in self.sale.lines if l.product)):
|
||||
quantity = 0
|
||||
return quantity
|
||||
|
||||
|
||||
class Line_Discount(metaclass=PoolMeta):
|
||||
__name__ = 'sale.line'
|
||||
|
||||
@classmethod
|
||||
def get_from_shopify(cls, sale, line_item, quantity, line=None):
|
||||
pool = Pool()
|
||||
Tax = pool.get('account.tax')
|
||||
line = super().get_from_shopify(sale, line_item, quantity, line=line)
|
||||
line.base_price = round_price(Tax.reverse_compute(
|
||||
Decimal(line_item.price), line.taxes, sale.sale_date))
|
||||
return line
|
||||
|
||||
@classmethod
|
||||
def get_from_shopify_shipping(cls, sale, shipping_line, line=None):
|
||||
line = super().get_from_shopify_shipping(
|
||||
sale, shipping_line, line=line)
|
||||
line.base_price = Decimal(shipping_line.price)
|
||||
return line
|
||||
|
||||
|
||||
class Line_SaleSecondaryUnit(metaclass=PoolMeta):
|
||||
__name__ = 'sale.line'
|
||||
|
||||
def _set_shopify_quantity(self, product, quantity):
|
||||
super()._set_shopify_quantity(product, quantity)
|
||||
if (product.sale_secondary_uom
|
||||
and product.shopify_uom.category
|
||||
== product.sale_secondary_uom.category):
|
||||
self.unit = product.sale_uom
|
||||
self.secondary_unit = product.shopify_uom
|
||||
self.on_change_product()
|
||||
self.secondary_quantity = quantity
|
||||
self.on_change_secondary_quantity()
|
||||
|
||||
def _set_shopify_unit_price(self, product, unit_price):
|
||||
super()._set_shopify_unit_price(product, unit_price)
|
||||
if (product.sale_secondary_uom
|
||||
and product.shopify_uom.category
|
||||
== product.sale_secondary_uom.category):
|
||||
self.secondary_unit_price = unit_price
|
||||
self.on_change_secondary_unit_price()
|
||||
|
||||
|
||||
class Line_ShipmentCost(metaclass=PoolMeta):
|
||||
__name__ = 'sale.line'
|
||||
|
||||
@classmethod
|
||||
def get_from_shopify_shipping(cls, sale, shipping_line, line=None):
|
||||
line = super().get_from_shopify_shipping(
|
||||
sale, shipping_line, line=line)
|
||||
line.shipment_cost = Decimal(shipping_line.price)
|
||||
return line
|
||||
|
||||
# TODO: refund as return sale
|
||||
34
modules/web_shop_shopify/shopify_retry.py
Executable file
34
modules/web_shop_shopify/shopify_retry.py
Executable file
@@ -0,0 +1,34 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
import time
|
||||
|
||||
from pyactiveresource.connection import ClientError
|
||||
from shopify import Limits
|
||||
from shopify.base import ShopifyConnection
|
||||
|
||||
from trytond.protocols.wrappers import HTTPStatus
|
||||
|
||||
|
||||
def patch():
|
||||
def _open(*args, **kwargs):
|
||||
while True:
|
||||
try:
|
||||
return func(*args, **kwargs)
|
||||
except ClientError as e:
|
||||
if e.response.code == HTTPStatus.TOO_MANY_REQUESTS:
|
||||
retry_after = float(
|
||||
e.response.headers.get('Retry-After', 2))
|
||||
time.sleep(retry_after)
|
||||
else:
|
||||
raise
|
||||
else:
|
||||
try:
|
||||
if Limits.credit_maxed():
|
||||
time.sleep(0.5)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
if ShopifyConnection._open == _open:
|
||||
return
|
||||
func = ShopifyConnection._open
|
||||
ShopifyConnection._open = _open
|
||||
172
modules/web_shop_shopify/stock.py
Executable file
172
modules/web_shop_shopify/stock.py
Executable file
@@ -0,0 +1,172 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
|
||||
from collections import defaultdict
|
||||
|
||||
import shopify
|
||||
from shopify.resources.fulfillment import FulfillmentV2
|
||||
|
||||
from trytond.i18n import gettext, lazy_gettext
|
||||
from trytond.model import ModelSQL, ModelView, Unique, fields
|
||||
from trytond.pool import Pool, PoolMeta
|
||||
|
||||
from .common import IdentifierMixin
|
||||
from .exceptions import ShopifyError
|
||||
|
||||
|
||||
class ShipmentOut(metaclass=PoolMeta):
|
||||
__name__ = 'stock.shipment.out'
|
||||
|
||||
shopify_identifiers = fields.One2Many(
|
||||
'stock.shipment.shopify_identifier', 'shipment',
|
||||
lazy_gettext('web_shop_shopify.msg_shopify_identifiers'))
|
||||
|
||||
def get_shopify(self, sale):
|
||||
if self.state != 'done':
|
||||
return
|
||||
shopify_id = self.get_shopify_identifier(sale)
|
||||
if shopify_id:
|
||||
# Fulfillment can not be modified
|
||||
return
|
||||
else:
|
||||
fulfillment = FulfillmentV2()
|
||||
for shop_warehouse in sale.web_shop.shopify_warehouses:
|
||||
if shop_warehouse.warehouse == self.warehouse:
|
||||
location_id = int(shop_warehouse.shopify_id)
|
||||
break
|
||||
else:
|
||||
location_id = None
|
||||
fulfillment_orders = shopify.FulfillmentOrders.find(
|
||||
order_id=sale.shopify_identifier)
|
||||
line_items = defaultdict(list)
|
||||
for move in self.outgoing_moves:
|
||||
if move.sale == sale:
|
||||
for order_id, line_item in move.get_shopify(
|
||||
fulfillment_orders, location_id):
|
||||
line_items[order_id].append(line_item)
|
||||
if not line_items:
|
||||
return
|
||||
fulfillment.line_items_by_fulfillment_order = [{
|
||||
'fulfillment_order_id': order_id,
|
||||
'fulfillment_order_line_items': line_items,
|
||||
}
|
||||
for order_id, line_items in line_items.items()]
|
||||
return fulfillment
|
||||
|
||||
def get_shopify_identifier(self, sale):
|
||||
for record in self.shopify_identifiers:
|
||||
if record.sale == sale:
|
||||
return record.shopify_identifier
|
||||
|
||||
def set_shopify_identifier(self, sale, identifier=None):
|
||||
pool = Pool()
|
||||
Identifier = pool.get('stock.shipment.shopify_identifier')
|
||||
for record in self.shopify_identifiers:
|
||||
if record.sale == sale:
|
||||
if not identifier:
|
||||
Identifier.delete([record])
|
||||
return
|
||||
else:
|
||||
if record.shopify_identifier != identifier:
|
||||
record.shopify_identifier = identifier
|
||||
record.save()
|
||||
return record
|
||||
if identifier:
|
||||
record = Identifier(shipment=self, sale=sale)
|
||||
record.shopify_identifier = identifier
|
||||
record.save()
|
||||
return record
|
||||
|
||||
@classmethod
|
||||
def search_shopify_identifier(cls, sale, identifier):
|
||||
records = cls.search([
|
||||
('shopify_identifiers', 'where', [
|
||||
('sale', '=', sale.id),
|
||||
('shopify_identifier', '=', identifier),
|
||||
]),
|
||||
])
|
||||
if records:
|
||||
record, = records
|
||||
return record
|
||||
|
||||
@classmethod
|
||||
def copy(cls, records, default=None):
|
||||
if default is None:
|
||||
default = {}
|
||||
else:
|
||||
default = default.copy()
|
||||
default.setdefault('shopify_identifiers')
|
||||
return super().copy(records, default=default)
|
||||
|
||||
|
||||
class ShipmentShopifyIdentifier(IdentifierMixin, ModelSQL, ModelView):
|
||||
"Shopify Shipment Identifier"
|
||||
__name__ = 'stock.shipment.shopify_identifier'
|
||||
|
||||
shipment = fields.Reference("Shipment", [
|
||||
('stock.shipment.out', "Customer Shipment"),
|
||||
], required=True)
|
||||
sale = fields.Many2One('sale.sale', "Sale", required=True)
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls.shopify_identifier_signed.states = {
|
||||
'required': True,
|
||||
}
|
||||
t = cls.__table__()
|
||||
cls._sql_constraints += [
|
||||
('shipment_sale_unique',
|
||||
Unique(t, t.shipment, t.sale, t.shopify_identifier_signed),
|
||||
'web_shop_shopify.msg_identifier_shipment_sale_unique'),
|
||||
]
|
||||
|
||||
|
||||
class ShipmentOut_PackageShipping(metaclass=PoolMeta):
|
||||
__name__ = 'stock.shipment.out'
|
||||
|
||||
def get_shopify(self, sale):
|
||||
fulfillment = super().get_shopify(sale)
|
||||
if fulfillment and self.packages:
|
||||
tracking_info = []
|
||||
for package in self.packages:
|
||||
tracking_info.append({
|
||||
'number': package.shipping_reference,
|
||||
'url': package.shipping_tracking_url,
|
||||
})
|
||||
fulfillment.tracking_info = tracking_info
|
||||
return fulfillment
|
||||
|
||||
|
||||
class Move(metaclass=PoolMeta):
|
||||
__name__ = 'stock.move'
|
||||
|
||||
def get_shopify(self, fulfillment_orders, location_id):
|
||||
pool = Pool()
|
||||
SaleLine = pool.get('sale.line')
|
||||
Uom = pool.get('product.uom')
|
||||
if not isinstance(self.origin, SaleLine):
|
||||
return
|
||||
identifier = self.origin.shopify_identifier
|
||||
quantity = int(Uom.compute_qty(
|
||||
self.unit, self.quantity, self.origin.unit))
|
||||
for fulfillment_order in fulfillment_orders:
|
||||
if fulfillment_order.assigned_location_id != location_id:
|
||||
continue
|
||||
for line_item in fulfillment_order.line_items:
|
||||
if line_item.line_item_id == identifier:
|
||||
qty = min(quantity, line_item.fulfillable_quantity)
|
||||
qty = quantity
|
||||
yield fulfillment_order.id, {
|
||||
'id': line_item.id,
|
||||
'quantity': qty,
|
||||
}
|
||||
quantity -= qty
|
||||
if quantity <= 0:
|
||||
return
|
||||
else:
|
||||
raise ShopifyError(gettext(
|
||||
'web_shop_shopify.msg_fulfillment_order_line_not_found',
|
||||
quantity=quantity,
|
||||
move=self.rec_name,
|
||||
))
|
||||
55
modules/web_shop_shopify/stock.xml
Executable file
55
modules/web_shop_shopify/stock.xml
Executable file
@@ -0,0 +1,55 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<tryton>
|
||||
<data>
|
||||
<record model="ir.ui.view" id="stock_shipment_shopify_identifier_view_form">
|
||||
<field name="model">stock.shipment.shopify_identifier</field>
|
||||
<field name="type">form</field>
|
||||
<field name="name">stock_shipment_shopify_identifier_form</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="stock_shipment_shopify_identifier_view_list">
|
||||
<field name="model">stock.shipment.shopify_identifier</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="name">stock_shipment_shopify_identifier_list</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.action.act_window" id="act_stock_shipment_shopify_identifier_form">
|
||||
<field name="name">Shipment Identifiers</field>
|
||||
<field name="res_model">stock.shipment.shopify_identifier</field>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view" id="act_stock_shipment_shopify_identifier_form_view1">
|
||||
<field name="sequence" eval="10"/>
|
||||
<field name="view" ref="stock_shipment_shopify_identifier_view_list"/>
|
||||
<field name="act_window" ref="act_stock_shipment_shopify_identifier_form"/>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view" id="act_stock_shipment_shopify_identifier_form_view2">
|
||||
<field name="sequence" eval="20"/>
|
||||
<field name="view" ref="stock_shipment_shopify_identifier_view_form"/>
|
||||
<field name="act_window" ref="act_stock_shipment_shopify_identifier_form"/>
|
||||
</record>
|
||||
<menuitem
|
||||
parent="menu_shop_shopify_identifier_form"
|
||||
action="act_stock_shipment_shopify_identifier_form"
|
||||
sequence="50"
|
||||
id="menu_stock_shipment_shopify_identifier_form"/>
|
||||
|
||||
<record model="ir.model.access" id="access_stock_shipment_shopify_identifier">
|
||||
<field name="model">stock.shipment.shopify_identifier</field>
|
||||
<field name="perm_read" eval="True"/>
|
||||
<field name="perm_write" eval="False"/>
|
||||
<field name="perm_create" eval="False"/>
|
||||
<field name="perm_delete" eval="False"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.model.access" id="access_stock_shipment_shopify_identifier_admin">
|
||||
<field name="model">stock.shipment.shopify_identifier</field>
|
||||
<field name="group" ref="res.group_admin"/>
|
||||
<field name="perm_read" eval="True"/>
|
||||
<field name="perm_write" eval="True"/>
|
||||
<field name="perm_create" eval="True"/>
|
||||
<field name="perm_delete" eval="True"/>
|
||||
</record>
|
||||
</data>
|
||||
</tryton>
|
||||
2
modules/web_shop_shopify/tests/__init__.py
Executable file
2
modules/web_shop_shopify/tests/__init__.py
Executable file
@@ -0,0 +1,2 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
BIN
modules/web_shop_shopify/tests/__pycache__/__init__.cpython-311.opt-1.pyc
Executable file
BIN
modules/web_shop_shopify/tests/__pycache__/__init__.cpython-311.opt-1.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/tests/__pycache__/__init__.cpython-311.pyc
Executable file
BIN
modules/web_shop_shopify/tests/__pycache__/__init__.cpython-311.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/tests/__pycache__/test_module.cpython-311.opt-1.pyc
Executable file
BIN
modules/web_shop_shopify/tests/__pycache__/test_module.cpython-311.opt-1.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/tests/__pycache__/test_module.cpython-311.pyc
Executable file
BIN
modules/web_shop_shopify/tests/__pycache__/test_module.cpython-311.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/tests/__pycache__/test_scenario.cpython-311.opt-1.pyc
Executable file
BIN
modules/web_shop_shopify/tests/__pycache__/test_scenario.cpython-311.opt-1.pyc
Executable file
Binary file not shown.
BIN
modules/web_shop_shopify/tests/__pycache__/test_scenario.cpython-311.pyc
Executable file
BIN
modules/web_shop_shopify/tests/__pycache__/test_scenario.cpython-311.pyc
Executable file
Binary file not shown.
635
modules/web_shop_shopify/tests/scenario_web_shop_shopify.rst
Executable file
635
modules/web_shop_shopify/tests/scenario_web_shop_shopify.rst
Executable file
@@ -0,0 +1,635 @@
|
||||
=========================
|
||||
Web Shop Shopify Scenario
|
||||
=========================
|
||||
|
||||
Imports::
|
||||
|
||||
>>> import os
|
||||
>>> import random
|
||||
>>> import string
|
||||
>>> import time
|
||||
>>> import urllib.request
|
||||
>>> from decimal import Decimal
|
||||
|
||||
>>> import shopify
|
||||
>>> from shopify.api_version import ApiVersion
|
||||
|
||||
>>> from proteus import Model
|
||||
>>> from trytond.modules.account.tests.tools import (
|
||||
... create_chart, create_fiscalyear, create_tax, get_accounts)
|
||||
>>> from trytond.modules.account_invoice.tests.tools import (
|
||||
... set_fiscalyear_invoice_sequences)
|
||||
>>> from trytond.modules.company.tests.tools import create_company, get_company
|
||||
>>> from trytond.modules.web_shop_shopify.product import Template
|
||||
>>> from trytond.modules.web_shop_shopify.web import Shop
|
||||
>>> from trytond.tests.tools import activate_modules, assertEqual
|
||||
|
||||
>>> FETCH_SLEEP, MAX_SLEEP = 1, 10
|
||||
|
||||
Activate modules::
|
||||
|
||||
>>> config = activate_modules([
|
||||
... 'web_shop_shopify',
|
||||
... 'account_payment_clearing',
|
||||
... 'customs',
|
||||
... 'product_measurements',
|
||||
... 'product_image',
|
||||
... 'sale_discount',
|
||||
... 'sale_shipment_cost',
|
||||
... ])
|
||||
|
||||
>>> Account = Model.get('account.account')
|
||||
>>> Carrier = Model.get('carrier')
|
||||
>>> CarrierSelection = Model.get('carrier.selection')
|
||||
>>> Category = Model.get('product.category')
|
||||
>>> Country = Model.get('country.country')
|
||||
>>> Cron = Model.get('ir.cron')
|
||||
>>> Inventory = Model.get('stock.inventory')
|
||||
>>> Journal = Model.get('account.journal')
|
||||
>>> Location = Model.get('stock.location')
|
||||
>>> Party = Model.get('party.party')
|
||||
>>> PaymentJournal = Model.get('account.payment.journal')
|
||||
>>> Product = Model.get('product.product')
|
||||
>>> ProductAttribute = Model.get('product.attribute')
|
||||
>>> ProductAttributeSet = Model.get('product.attribute.set')
|
||||
>>> ProductInventoryItem = Model.get('product.shopify_inventory_item')
|
||||
>>> ProductTemplate = Model.get('product.template')
|
||||
>>> Sale = Model.get('sale.sale')
|
||||
>>> ShopifyIdentifier = Model.get('web.shop.shopify_identifier')
|
||||
>>> Tariff = Model.get('customs.tariff.code')
|
||||
>>> Uom = Model.get('product.uom')
|
||||
>>> WebShop = Model.get('web.shop')
|
||||
|
||||
Set metafields to product::
|
||||
|
||||
>>> def get_shopify_metafields(self, shop):
|
||||
... return {
|
||||
... 'global.test': {
|
||||
... 'value': self.name,
|
||||
... },
|
||||
... }
|
||||
|
||||
>>> Template.get_shopify_metafields = get_shopify_metafields
|
||||
|
||||
>>> def managed_metafields(self):
|
||||
... return {'global.test'}
|
||||
|
||||
>>> Shop.managed_metafields = managed_metafields
|
||||
|
||||
Create country::
|
||||
|
||||
>>> belgium = Country(name="Belgium", code='BE')
|
||||
>>> belgium.save()
|
||||
>>> china = Country(name="China", code='CN')
|
||||
>>> china.save()
|
||||
|
||||
Create company::
|
||||
|
||||
>>> _ = create_company()
|
||||
>>> company = get_company()
|
||||
|
||||
Create chart of accounts::
|
||||
|
||||
>>> _ = create_chart(company)
|
||||
>>> accounts = get_accounts(company)
|
||||
|
||||
Create tax::
|
||||
|
||||
>>> tax = create_tax(Decimal('.10'))
|
||||
|
||||
Create fiscal year::
|
||||
|
||||
>>> fiscalyear = set_fiscalyear_invoice_sequences(
|
||||
... create_fiscalyear(company))
|
||||
>>> fiscalyear.click('create_period')
|
||||
|
||||
Create payment journal::
|
||||
|
||||
>>> shopify_account = Account(parent=accounts['receivable'].parent)
|
||||
>>> shopify_account.name = "Shopify"
|
||||
>>> shopify_account.type = accounts['receivable'].type
|
||||
>>> shopify_account.reconcile = True
|
||||
>>> shopify_account.save()
|
||||
|
||||
>>> payment_journal = PaymentJournal()
|
||||
>>> payment_journal.name = "Shopify"
|
||||
>>> payment_journal.process_method = 'shopify'
|
||||
>>> payment_journal.clearing_journal, = Journal.find([('code', '=', 'REV')])
|
||||
>>> payment_journal.clearing_account = shopify_account
|
||||
>>> payment_journal.save()
|
||||
|
||||
Define a web shop::
|
||||
|
||||
>>> web_shop = WebShop(name="Web Shop")
|
||||
>>> web_shop.type = 'shopify'
|
||||
>>> web_shop.shopify_url = os.getenv('SHOPIFY_URL')
|
||||
>>> web_shop.shopify_password = os.getenv('SHOPIFY_PASSWORD')
|
||||
>>> web_shop.shopify_version = sorted(ApiVersion.versions, reverse=True)[1]
|
||||
>>> shop_warehouse = web_shop.shopify_warehouses.new()
|
||||
>>> shop_warehouse.warehouse, = Location.find([('type', '=', 'warehouse')])
|
||||
>>> shopify_payment_journal = web_shop.shopify_payment_journals.new()
|
||||
>>> shopify_payment_journal.journal = payment_journal
|
||||
>>> web_shop.save()
|
||||
|
||||
>>> shopify.ShopifyResource.activate_session(shopify.Session(
|
||||
... web_shop.shopify_url,
|
||||
... web_shop.shopify_version,
|
||||
... web_shop.shopify_password))
|
||||
|
||||
>>> location = shopify.Location.find_first()
|
||||
|
||||
>>> shop_warehouse, = web_shop.shopify_warehouses
|
||||
>>> shop_warehouse.shopify_id = str(location.id)
|
||||
>>> web_shop.save()
|
||||
|
||||
Create categories::
|
||||
|
||||
>>> category1 = Category(name="Category 1")
|
||||
>>> category1.save()
|
||||
>>> sub_category = Category(name="Sub Category", parent=category1)
|
||||
>>> sub_category.save()
|
||||
>>> category2 = Category(name="Category 2")
|
||||
>>> category2.save()
|
||||
|
||||
>>> account_category = Category(name="Account Category")
|
||||
>>> account_category.accounting = True
|
||||
>>> account_category.account_expense = accounts['expense']
|
||||
>>> account_category.account_revenue = accounts['revenue']
|
||||
>>> account_category.customer_taxes.append(tax)
|
||||
>>> account_category.save()
|
||||
|
||||
>>> account_category_shipping = Category(name="Account Category Shipping")
|
||||
>>> account_category_shipping.accounting = True
|
||||
>>> account_category_shipping.account_expense = accounts['expense']
|
||||
>>> account_category_shipping.account_revenue = accounts['revenue']
|
||||
>>> account_category_shipping.save()
|
||||
|
||||
Create attribute set::
|
||||
|
||||
>>> attribute_set = ProductAttributeSet(name="Attributes")
|
||||
>>> attribute = attribute_set.attributes.new()
|
||||
>>> attribute.name = 'color'
|
||||
>>> attribute.string = "Color"
|
||||
>>> attribute.type_ = 'selection'
|
||||
>>> attribute.selection = "blue:Blue\nred:Red"
|
||||
>>> attribute_set.save()
|
||||
>>> attribute = attribute_set.attributes.new()
|
||||
>>> attribute.name = 'check'
|
||||
>>> attribute.string = "Check"
|
||||
>>> attribute.type_ = 'boolean'
|
||||
>>> attribute_set.save()
|
||||
>>> attribute1, attribute2 = attribute_set.attributes
|
||||
>>> attribute_set.shopify_option1 = attribute1
|
||||
>>> attribute_set.shopify_option2 = attribute2
|
||||
>>> attribute_set.save()
|
||||
|
||||
Create tariff codes::
|
||||
|
||||
>>> tariff1 = Tariff(code='170390')
|
||||
>>> tariff1.save()
|
||||
>>> tariff2 = Tariff(code='17039099', country=belgium)
|
||||
>>> tariff2.save()
|
||||
|
||||
Create products::
|
||||
|
||||
>>> unit, = Uom.find([('name', '=', "Unit")])
|
||||
|
||||
>>> template = ProductTemplate()
|
||||
>>> template.name = "Product 1"
|
||||
>>> template.default_uom = unit
|
||||
>>> template.type = 'goods'
|
||||
>>> template.salable = True
|
||||
>>> template.web_shop_description = "<p>Product description</p>"
|
||||
>>> template.list_price = round(Decimal('9.99') / (1 + tax.rate), 4)
|
||||
>>> template.account_category = account_category
|
||||
>>> template.categories.append(Category(sub_category.id))
|
||||
>>> template.country_of_origin = china
|
||||
>>> _ = template.tariff_codes.new(tariff_code=tariff1)
|
||||
>>> _ = template.tariff_codes.new(tariff_code=tariff2)
|
||||
>>> template.weight = 10
|
||||
>>> template.weight_uom, = Uom.find([('name', '=', "Carat")])
|
||||
>>> template.save()
|
||||
>>> product1, = template.products
|
||||
>>> product1.suffix_code = 'PROD1'
|
||||
>>> product1.save()
|
||||
|
||||
>>> template = ProductTemplate()
|
||||
>>> template.name = "Product 2"
|
||||
>>> template.default_uom = unit
|
||||
>>> template.type = 'service'
|
||||
>>> template.salable = True
|
||||
>>> template.list_price = round(Decimal('20') / (1 + tax.rate), 4)
|
||||
>>> template.account_category = account_category
|
||||
>>> template.categories.append(Category(category2.id))
|
||||
>>> template.save()
|
||||
>>> product2, = template.products
|
||||
>>> product2.suffix_code = 'PROD2'
|
||||
>>> product2.save()
|
||||
|
||||
>>> variant = ProductTemplate()
|
||||
>>> variant.name = "Variant"
|
||||
>>> variant.code = "VAR"
|
||||
>>> variant.default_uom = unit
|
||||
>>> variant.type = 'goods'
|
||||
>>> variant.salable = True
|
||||
>>> variant.list_price = round(Decimal('50') / (1 + tax.rate), 4)
|
||||
>>> variant.attribute_set = attribute_set
|
||||
>>> variant.account_category = account_category
|
||||
>>> variant.categories.append(Category(category1.id))
|
||||
>>> variant.categories.append(Category(category2.id))
|
||||
>>> image = variant.images.new(web_shop=True)
|
||||
>>> image.image = urllib.request.urlopen('https://picsum.photos/200').read()
|
||||
>>> variant1, = variant.products
|
||||
>>> variant1.suffix_code = "1"
|
||||
>>> variant1.attributes = {
|
||||
... 'color': 'blue',
|
||||
... 'check': True,
|
||||
... }
|
||||
>>> variant2 = variant.products.new()
|
||||
>>> variant2.suffix_code = "2"
|
||||
>>> variant2.attributes = {
|
||||
... 'color': 'red',
|
||||
... 'check': False,
|
||||
... }
|
||||
>>> variant.save()
|
||||
>>> variant1, variant2 = variant.products
|
||||
|
||||
>>> image = variant1.images.new(web_shop=True, template=variant)
|
||||
>>> image.image = urllib.request.urlopen('https://picsum.photos/200').read()
|
||||
>>> variant1.save()
|
||||
|
||||
>>> image = variant2.images.new(web_shop=True, template=variant)
|
||||
>>> image.image = urllib.request.urlopen('https://picsum.photos/200').read()
|
||||
>>> variant2.save()
|
||||
|
||||
Create carrier::
|
||||
|
||||
>>> carrier_template = ProductTemplate()
|
||||
>>> carrier_template.name = 'Carrier Product'
|
||||
>>> carrier_template.default_uom = unit
|
||||
>>> carrier_template.type = 'service'
|
||||
>>> carrier_template.salable = True
|
||||
>>> carrier_template.list_price = Decimal('3')
|
||||
>>> carrier_template.account_category = account_category_shipping
|
||||
>>> carrier_template.save()
|
||||
>>> carrier_product, = carrier_template.products
|
||||
>>> carrier_product.cost_price = Decimal('2')
|
||||
>>> carrier_product.save()
|
||||
|
||||
>>> carrier = Carrier()
|
||||
>>> party = Party(name='Carrier')
|
||||
>>> party.save()
|
||||
>>> carrier.party = party
|
||||
>>> carrier.carrier_product = carrier_product
|
||||
>>> carrier.save()
|
||||
|
||||
Fill warehouse::
|
||||
|
||||
>>> inventory = Inventory()
|
||||
>>> inventory.location, = Location.find([('code', '=', 'STO')])
|
||||
>>> line = inventory.lines.new()
|
||||
>>> line.product = product1
|
||||
>>> line.quantity = 10
|
||||
>>> line = inventory.lines.new()
|
||||
>>> line.product = variant1
|
||||
>>> line.quantity = 5
|
||||
>>> inventory.click('confirm')
|
||||
>>> inventory.state
|
||||
'done'
|
||||
|
||||
Set categories, products and attributes to web shop::
|
||||
|
||||
>>> web_shop.categories.extend([
|
||||
... Category(category1.id),
|
||||
... Category(sub_category.id),
|
||||
... Category(category2.id)])
|
||||
>>> web_shop.products.extend([
|
||||
... Product(product1.id),
|
||||
... Product(product2.id),
|
||||
... Product(variant1.id),
|
||||
... Product(variant2.id)])
|
||||
>>> web_shop.save()
|
||||
|
||||
Run update product::
|
||||
|
||||
>>> cron_update_product, = Cron.find([
|
||||
... ('method', '=', 'web.shop|shopify_update_product'),
|
||||
... ])
|
||||
>>> cron_update_product.click('run_once')
|
||||
|
||||
>>> category1.reload()
|
||||
>>> len(category1.shopify_identifiers)
|
||||
1
|
||||
>>> category2.reload()
|
||||
>>> len(category2.shopify_identifiers)
|
||||
1
|
||||
|
||||
>>> product1.reload()
|
||||
>>> len(product1.shopify_identifiers)
|
||||
1
|
||||
>>> len(product1.template.shopify_identifiers)
|
||||
1
|
||||
>>> product2.reload()
|
||||
>>> len(product2.shopify_identifiers)
|
||||
1
|
||||
>>> len(product2.template.shopify_identifiers)
|
||||
1
|
||||
>>> variant1.reload()
|
||||
>>> len(variant1.shopify_identifiers)
|
||||
1
|
||||
>>> variant2.reload()
|
||||
>>> len(variant2.shopify_identifiers)
|
||||
1
|
||||
>>> variant.reload()
|
||||
>>> len(variant.shopify_identifiers)
|
||||
1
|
||||
>>> all(i.shopify_identifiers for i in variant.images)
|
||||
True
|
||||
|
||||
Run update inventory::
|
||||
|
||||
>>> cron_update_inventory, = Cron.find([
|
||||
... ('method', '=', 'web.shop|shopify_update_inventory'),
|
||||
... ])
|
||||
>>> cron_update_inventory.click('run_once')
|
||||
|
||||
Check inventory item::
|
||||
|
||||
>>> inventory_items = ProductInventoryItem.find([])
|
||||
>>> inventory_item_ids = [i.shopify_identifier
|
||||
... for inv in inventory_items for i in inv.shopify_identifiers]
|
||||
>>> for _ in range(MAX_SLEEP):
|
||||
... inventory_levels = location.inventory_levels()
|
||||
... if inventory_levels and len(inventory_levels) == 2:
|
||||
... break
|
||||
... time.sleep(FETCH_SLEEP)
|
||||
>>> sorted(l.available for l in inventory_levels
|
||||
... if l.available and l.inventory_item_id in inventory_item_ids)
|
||||
[5, 10]
|
||||
|
||||
Remove a category, a product and an image::
|
||||
|
||||
>>> _ = web_shop.categories.pop(web_shop.categories.index(category2))
|
||||
>>> _ = web_shop.products.pop(web_shop.products.index(product2))
|
||||
>>> web_shop.save()
|
||||
>>> variant2.images.remove(variant2.images[0])
|
||||
>>> variant2.save()
|
||||
|
||||
Rename a category::
|
||||
|
||||
>>> sub_category.name = "Sub-category"
|
||||
>>> sub_category.save()
|
||||
>>> identifier, = sub_category.shopify_identifiers
|
||||
>>> bool(identifier.to_update)
|
||||
True
|
||||
|
||||
Update attribute::
|
||||
|
||||
>>> attribute, = [a for a in attribute_set.attributes if a.name == 'color']
|
||||
>>> attribute.selection += "\ngreen:Green"
|
||||
>>> attribute.save()
|
||||
|
||||
Run update product::
|
||||
|
||||
>>> cron_update_product, = Cron.find([
|
||||
... ('method', '=', 'web.shop|shopify_update_product'),
|
||||
... ])
|
||||
>>> cron_update_product.click('run_once')
|
||||
|
||||
>>> category1.reload()
|
||||
>>> len(category1.shopify_identifiers)
|
||||
1
|
||||
>>> category2.reload()
|
||||
>>> len(category2.shopify_identifiers)
|
||||
0
|
||||
|
||||
>>> sub_category.reload()
|
||||
>>> identifier, = sub_category.shopify_identifiers
|
||||
>>> bool(identifier.to_update)
|
||||
False
|
||||
|
||||
>>> product1.reload()
|
||||
>>> len(product1.shopify_identifiers)
|
||||
1
|
||||
>>> len(product1.template.shopify_identifiers)
|
||||
1
|
||||
>>> product2.reload()
|
||||
>>> len(product2.shopify_identifiers)
|
||||
0
|
||||
>>> len(product2.template.shopify_identifiers)
|
||||
0
|
||||
>>> variant1.reload()
|
||||
>>> len(variant1.shopify_identifiers)
|
||||
1
|
||||
>>> variant2.reload()
|
||||
>>> len(variant2.shopify_identifiers)
|
||||
1
|
||||
>>> variant.reload()
|
||||
>>> len(variant.shopify_identifiers)
|
||||
1
|
||||
>>> all(i.shopify_identifiers for i in variant1.images)
|
||||
True
|
||||
>>> any(i.shopify_identifiers for i in variant2.images)
|
||||
False
|
||||
|
||||
Create an order on Shopify::
|
||||
|
||||
>>> customer = shopify.Customer()
|
||||
>>> customer.last_name = "Customer"
|
||||
>>> customer.email = (
|
||||
... ''.join(random.choice(string.ascii_letters) for _ in range(10))
|
||||
... + '@example.com')
|
||||
>>> customer.addresses = [{
|
||||
... 'address1': "Street",
|
||||
... 'city': "City",
|
||||
... 'country': "Belgium",
|
||||
... }]
|
||||
>>> customer.save()
|
||||
True
|
||||
|
||||
>>> order = shopify.Order.create({
|
||||
... 'customer': customer.to_dict(),
|
||||
... 'shipping_address': customer.addresses[0].to_dict(),
|
||||
... 'billing_address': customer.addresses[0].to_dict(),
|
||||
... 'line_items': [{
|
||||
... 'variant_id': product1.shopify_identifiers[0].shopify_identifier,
|
||||
... 'quantity': 1,
|
||||
... }, {
|
||||
... 'variant_id': product1.shopify_identifiers[0].shopify_identifier,
|
||||
... 'quantity': 1,
|
||||
... }, {
|
||||
... 'variant_id': variant1.shopify_identifiers[0].shopify_identifier,
|
||||
... 'quantity': 5,
|
||||
... }],
|
||||
... 'financial_status': 'authorized',
|
||||
... 'transactions': [{
|
||||
... 'kind': 'authorization',
|
||||
... 'status': 'success',
|
||||
... 'amount': '258.98',
|
||||
... 'test': True,
|
||||
... }],
|
||||
... 'discount_codes': [{
|
||||
... 'code': 'CODE',
|
||||
... 'amount': '15',
|
||||
... 'type': 'fixed_amount',
|
||||
... }],
|
||||
... 'shipping_lines': [{
|
||||
... 'code': 'SHIP',
|
||||
... 'title': "Shipping",
|
||||
... 'price': '4.00',
|
||||
... }],
|
||||
... })
|
||||
>>> order.total_price
|
||||
'258.98'
|
||||
>>> order.financial_status
|
||||
'authorized'
|
||||
>>> order.fulfillment_status
|
||||
|
||||
Run fetch order::
|
||||
|
||||
>>> with config.set_context(shopify_orders=order.id):
|
||||
... cron_fetch_order, = Cron.find([
|
||||
... ('method', '=', 'web.shop|shopify_fetch_order'),
|
||||
... ])
|
||||
... cron_fetch_order.click('run_once')
|
||||
|
||||
>>> sale, = Sale.find([])
|
||||
>>> sale.shopify_tax_adjustment
|
||||
Decimal('0.01')
|
||||
>>> len(sale.lines)
|
||||
4
|
||||
>>> sorted([l.unit_price for l in sale.lines])
|
||||
[Decimal('4.0000'), Decimal('8.5727'), Decimal('8.5727'), Decimal('42.9309')]
|
||||
>>> sale.total_amount
|
||||
Decimal('258.98')
|
||||
>>> len(sale.payments)
|
||||
1
|
||||
>>> payment, = sale.payments
|
||||
>>> payment.state
|
||||
'processing'
|
||||
>>> payment.amount
|
||||
Decimal('258.98')
|
||||
>>> assertEqual(sale.carrier, carrier)
|
||||
>>> sale.state
|
||||
'quotation'
|
||||
|
||||
Capture full amount::
|
||||
|
||||
>>> transaction = order.capture('258.98')
|
||||
>>> test_transaction_id = transaction.parent_id
|
||||
|
||||
>>> with config.set_context(shopify_orders=order.id):
|
||||
... cron_update_order, = Cron.find([
|
||||
... ('method', '=', 'web.shop|shopify_update_order'),
|
||||
... ])
|
||||
... cron_update_order.click('run_once')
|
||||
|
||||
>>> sale.reload()
|
||||
>>> len(sale.payments)
|
||||
1
|
||||
>>> payment, = sale.payments
|
||||
>>> payment.state
|
||||
'succeeded'
|
||||
>>> sale.state
|
||||
'processing'
|
||||
>>> len(sale.invoices)
|
||||
0
|
||||
|
||||
Make a partial shipment::
|
||||
|
||||
>>> shipment, = sale.shipments
|
||||
>>> move, = [m for m in shipment.inventory_moves if m.product == variant1]
|
||||
>>> move.quantity = 3
|
||||
>>> shipment.click('pick')
|
||||
>>> shipment.click('pack')
|
||||
>>> shipment.click('do')
|
||||
>>> shipment.state
|
||||
'done'
|
||||
|
||||
>>> sale.reload()
|
||||
>>> len(sale.invoices)
|
||||
0
|
||||
|
||||
>>> order.reload()
|
||||
>>> order.fulfillment_status
|
||||
'partial'
|
||||
>>> len(order.fulfillments)
|
||||
1
|
||||
>>> order.financial_status
|
||||
'paid'
|
||||
|
||||
Cancel remaining shipment::
|
||||
|
||||
>>> shipment, = [s for s in sale.shipments if s.state != 'done']
|
||||
>>> shipment.click('cancel')
|
||||
>>> shipment.state
|
||||
'cancelled'
|
||||
|
||||
>>> sale.reload()
|
||||
>>> sale.shipment_state
|
||||
'exception'
|
||||
>>> len(sale.invoices)
|
||||
0
|
||||
|
||||
>>> order.reload()
|
||||
>>> order.fulfillment_status
|
||||
'partial'
|
||||
>>> len(order.fulfillments)
|
||||
1
|
||||
>>> order.financial_status
|
||||
'paid'
|
||||
|
||||
Ignore shipment exception::
|
||||
|
||||
>>> shipment_exception = sale.click('handle_shipment_exception')
|
||||
>>> move = shipment_exception.form.recreate_moves.pop()
|
||||
>>> shipment_exception.execute('handle')
|
||||
|
||||
>>> order.reload()
|
||||
>>> order.fulfillment_status
|
||||
'fulfilled'
|
||||
>>> len(order.fulfillments)
|
||||
1
|
||||
>>> order.financial_status
|
||||
'partially_refunded'
|
||||
|
||||
>>> sale.reload()
|
||||
>>> invoice, = sale.invoices
|
||||
>>> invoice.total_amount
|
||||
Decimal('164.52')
|
||||
>>> payment, = sale.payments
|
||||
>>> payment.state
|
||||
'succeeded'
|
||||
|
||||
Correct taxes as partial invoice can get rounding gap::
|
||||
|
||||
>>> tax_line, = invoice.taxes
|
||||
>>> tax_line.amount += payment.amount - invoice.total_amount
|
||||
>>> invoice.save()
|
||||
>>> assertEqual(invoice.total_amount, payment.amount)
|
||||
|
||||
Post invoice::
|
||||
|
||||
>>> invoice.click('post')
|
||||
>>> invoice.state
|
||||
'paid'
|
||||
>>> sale.reload()
|
||||
>>> sale.state
|
||||
'done'
|
||||
>>> order.reload()
|
||||
>>> bool(order.closed_at)
|
||||
True
|
||||
|
||||
Clean up::
|
||||
|
||||
>>> order.destroy()
|
||||
>>> for product in ShopifyIdentifier.find(
|
||||
... [('record', 'like', 'product.template,%')]):
|
||||
... shopify.Product.find(product.shopify_identifier).destroy()
|
||||
>>> for category in ShopifyIdentifier.find(
|
||||
... [('record', 'like', 'product.category,%')]):
|
||||
... shopify.CustomCollection.find(category.shopify_identifier).destroy()
|
||||
>>> time.sleep(FETCH_SLEEP)
|
||||
>>> customer.destroy()
|
||||
|
||||
>>> shopify.ShopifyResource.clear_session()
|
||||
227
modules/web_shop_shopify/tests/scenario_web_shop_shopify_secondary_unit.rst
Executable file
227
modules/web_shop_shopify/tests/scenario_web_shop_shopify_secondary_unit.rst
Executable file
@@ -0,0 +1,227 @@
|
||||
========================================
|
||||
Web Shop Shopify Secondary Unit Scenario
|
||||
========================================
|
||||
|
||||
Imports::
|
||||
|
||||
>>> import os
|
||||
>>> import random
|
||||
>>> import string
|
||||
>>> import time
|
||||
>>> from decimal import Decimal
|
||||
|
||||
>>> import shopify
|
||||
>>> from shopify.api_version import ApiVersion
|
||||
|
||||
>>> from proteus import Model
|
||||
>>> from trytond.modules.account.tests.tools import (
|
||||
... create_chart, create_fiscalyear, get_accounts)
|
||||
>>> from trytond.modules.account_invoice.tests.tools import (
|
||||
... set_fiscalyear_invoice_sequences)
|
||||
>>> from trytond.modules.company.tests.tools import create_company, get_company
|
||||
>>> from trytond.tests.tools import activate_modules, assertEqual
|
||||
|
||||
>>> FETCH_SLEEP, MAX_SLEEP = 1, 10
|
||||
|
||||
Activate modules::
|
||||
|
||||
>>> config = activate_modules([
|
||||
... 'web_shop_shopify',
|
||||
... 'sale_secondary_unit',
|
||||
... ])
|
||||
|
||||
>>> Account = Model.get('account.account')
|
||||
>>> Category = Model.get('product.category')
|
||||
>>> Cron = Model.get('ir.cron')
|
||||
>>> Location = Model.get('stock.location')
|
||||
>>> PaymentJournal = Model.get('account.payment.journal')
|
||||
>>> Product = Model.get('product.product')
|
||||
>>> ProductTemplate = Model.get('product.template')
|
||||
>>> Sale = Model.get('sale.sale')
|
||||
>>> ShopifyIdentifier = Model.get('web.shop.shopify_identifier')
|
||||
>>> Uom = Model.get('product.uom')
|
||||
>>> WebShop = Model.get('web.shop')
|
||||
|
||||
Create company::
|
||||
|
||||
>>> _ = create_company()
|
||||
>>> company = get_company()
|
||||
|
||||
Create chart of accounts::
|
||||
|
||||
>>> _ = create_chart(company)
|
||||
>>> accounts = get_accounts(company)
|
||||
|
||||
Create fiscal year::
|
||||
|
||||
>>> fiscalyear = set_fiscalyear_invoice_sequences(
|
||||
... create_fiscalyear(company))
|
||||
>>> fiscalyear.click('create_period')
|
||||
|
||||
Create payment journal::
|
||||
|
||||
>>> shopify_account = Account(parent=accounts['receivable'].parent)
|
||||
>>> shopify_account.name = "Shopify"
|
||||
>>> shopify_account.type = accounts['receivable'].type
|
||||
>>> shopify_account.reconcile = True
|
||||
>>> shopify_account.save()
|
||||
|
||||
>>> payment_journal = PaymentJournal()
|
||||
>>> payment_journal.name = "Shopify"
|
||||
>>> payment_journal.process_method = 'shopify'
|
||||
>>> payment_journal.save()
|
||||
|
||||
Define a web shop::
|
||||
|
||||
>>> web_shop = WebShop(name="Web Shop")
|
||||
>>> web_shop.type = 'shopify'
|
||||
>>> web_shop.shopify_url = os.getenv('SHOPIFY_URL')
|
||||
>>> web_shop.shopify_password = os.getenv('SHOPIFY_PASSWORD')
|
||||
>>> web_shop.shopify_version = sorted(ApiVersion.versions, reverse=True)[1]
|
||||
>>> shop_warehouse = web_shop.shopify_warehouses.new()
|
||||
>>> shop_warehouse.warehouse, = Location.find([('type', '=', 'warehouse')])
|
||||
>>> shopify_payment_journal = web_shop.shopify_payment_journals.new()
|
||||
>>> shopify_payment_journal.journal = payment_journal
|
||||
>>> web_shop.save()
|
||||
|
||||
>>> shopify.ShopifyResource.activate_session(shopify.Session(
|
||||
... web_shop.shopify_url,
|
||||
... web_shop.shopify_version,
|
||||
... web_shop.shopify_password))
|
||||
|
||||
>>> location = shopify.Location.find_first()
|
||||
|
||||
>>> shop_warehouse, = web_shop.shopify_warehouses
|
||||
>>> shop_warehouse.shopify_id = str(location.id)
|
||||
>>> web_shop.save()
|
||||
|
||||
Create categories::
|
||||
|
||||
>>> category = Category(name="Category")
|
||||
>>> category.save()
|
||||
|
||||
>>> account_category = Category(name="Account Category")
|
||||
>>> account_category.accounting = True
|
||||
>>> account_category.account_expense = accounts['expense']
|
||||
>>> account_category.account_revenue = accounts['revenue']
|
||||
>>> account_category.save()
|
||||
|
||||
Create product::
|
||||
|
||||
>>> unit, = Uom.find([('name', '=', "Unit")])
|
||||
>>> unit.digits = 2
|
||||
>>> unit.rounding = 0.01
|
||||
>>> unit.save()
|
||||
>>> cm, = Uom.find([('name', '=', "Centimeter")])
|
||||
>>> cm, = cm.duplicate(default={'digits': 0, 'rounding': 1})
|
||||
|
||||
>>> template = ProductTemplate()
|
||||
>>> template.name = "Product 1"
|
||||
>>> template.default_uom = unit
|
||||
>>> template.type = 'goods'
|
||||
>>> template.salable = True
|
||||
>>> template.sale_secondary_uom = cm
|
||||
>>> template.sale_secondary_uom_factor = 25
|
||||
>>> template.list_price = Decimal('100.0000')
|
||||
>>> template.account_category = account_category
|
||||
>>> template.categories.append(Category(category.id))
|
||||
>>> template.save()
|
||||
>>> product, = template.products
|
||||
>>> product.suffix_code = 'PROD'
|
||||
>>> product.save()
|
||||
|
||||
Set categories, products and attributes to web shop::
|
||||
|
||||
>>> web_shop.categories.append(Category(category.id))
|
||||
>>> web_shop.products.append(Product(product.id))
|
||||
>>> web_shop.save()
|
||||
|
||||
Run update product::
|
||||
|
||||
>>> cron_update_product, = Cron.find([
|
||||
... ('method', '=', 'web.shop|shopify_update_product'),
|
||||
... ])
|
||||
>>> cron_update_product.click('run_once')
|
||||
|
||||
Create an order on Shopify::
|
||||
|
||||
>>> customer = shopify.Customer()
|
||||
>>> customer.last_name = "Customer"
|
||||
>>> customer.email = (
|
||||
... ''.join(random.choice(string.ascii_letters) for _ in range(10))
|
||||
... + '@example.com')
|
||||
>>> customer.addresses = [{
|
||||
... 'address1': "Street",
|
||||
... 'city': "City",
|
||||
... }]
|
||||
>>> customer.save()
|
||||
True
|
||||
|
||||
>>> order = shopify.Order.create({
|
||||
... 'customer': customer.to_dict(),
|
||||
... 'shipping_address': customer.addresses[0].to_dict(),
|
||||
... 'billing_address': customer.addresses[0].to_dict(),
|
||||
... 'line_items': [{
|
||||
... 'variant_id': product.shopify_identifiers[0].shopify_identifier,
|
||||
... 'quantity': 50,
|
||||
... }],
|
||||
... 'financial_status': 'authorized',
|
||||
... 'transactions': [{
|
||||
... 'kind': 'authorization',
|
||||
... 'status': 'success',
|
||||
... 'amount': '202.00',
|
||||
... 'test': True,
|
||||
... }],
|
||||
... 'shipping_lines': [{
|
||||
... 'code': 'SHIP',
|
||||
... 'title': "Shipping",
|
||||
... 'price': '2.00',
|
||||
... }],
|
||||
... })
|
||||
>>> order.total_price
|
||||
'202.00'
|
||||
>>> order.financial_status
|
||||
'authorized'
|
||||
|
||||
Run fetch order::
|
||||
|
||||
>>> with config.set_context(shopify_orders=order.id):
|
||||
... cron_fetch_order, = Cron.find([
|
||||
... ('method', '=', 'web.shop|shopify_fetch_order'),
|
||||
... ])
|
||||
... for _ in range(MAX_SLEEP):
|
||||
... cron_fetch_order.click('run_once')
|
||||
... if Sale.find([]):
|
||||
... break
|
||||
... time.sleep(FETCH_SLEEP)
|
||||
|
||||
>>> sale, = Sale.find([])
|
||||
>>> len(sale.lines)
|
||||
2
|
||||
>>> sale.total_amount
|
||||
Decimal('202.00')
|
||||
>>> line, = [l for l in sale.lines if l.product]
|
||||
>>> line.quantity
|
||||
2.0
|
||||
>>> assertEqual(line.unit, unit)
|
||||
>>> line.unit_price
|
||||
Decimal('100.0000')
|
||||
>>> line.secondary_quantity
|
||||
50.0
|
||||
>>> assertEqual(line.secondary_unit, cm)
|
||||
>>> line.secondary_unit_price
|
||||
Decimal('4.0000')
|
||||
|
||||
Clean up::
|
||||
|
||||
>>> order.destroy()
|
||||
>>> for product in ShopifyIdentifier.find(
|
||||
... [('record', 'like', 'product.template,%')]):
|
||||
... shopify.Product.find(product.shopify_identifier).destroy()
|
||||
>>> for category in ShopifyIdentifier.find(
|
||||
... [('record', 'like', 'product.category,%')]):
|
||||
... shopify.CustomCollection.find(category.shopify_identifier).destroy()
|
||||
>>> time.sleep(2)
|
||||
>>> customer.destroy()
|
||||
|
||||
>>> shopify.ShopifyResource.clear_session()
|
||||
12
modules/web_shop_shopify/tests/test_module.py
Executable file
12
modules/web_shop_shopify/tests/test_module.py
Executable file
@@ -0,0 +1,12 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
|
||||
from trytond.tests.test_tryton import ModuleTestCase
|
||||
|
||||
|
||||
class WebShopShopifyTestCase(ModuleTestCase):
|
||||
'Test Web Shop Shopify module'
|
||||
module = 'web_shop_shopify'
|
||||
|
||||
|
||||
del ModuleTestCase
|
||||
10
modules/web_shop_shopify/tests/test_scenario.py
Executable file
10
modules/web_shop_shopify/tests/test_scenario.py
Executable file
@@ -0,0 +1,10 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
|
||||
import os
|
||||
|
||||
from trytond.tests.test_tryton import load_doc_tests
|
||||
|
||||
if os.getenv('SHOPIFY_PASSWORD') and os.getenv('SHOPIFY_URL'):
|
||||
def load_tests(*args, **kwargs):
|
||||
return load_doc_tests(__name__, __file__, *args, **kwargs)
|
||||
30
modules/web_shop_shopify/tryton.cfg
Executable file
30
modules/web_shop_shopify/tryton.cfg
Executable file
@@ -0,0 +1,30 @@
|
||||
[tryton]
|
||||
version=7.2.2
|
||||
depends:
|
||||
account_payment
|
||||
currency
|
||||
ir
|
||||
party
|
||||
product
|
||||
product_attribute
|
||||
sale
|
||||
sale_amendment
|
||||
sale_payment
|
||||
stock
|
||||
web_shop
|
||||
extras_depend:
|
||||
customs
|
||||
product_image
|
||||
product_image_attribute
|
||||
product_measurements
|
||||
sale_discount
|
||||
sale_invoice_grouping
|
||||
sale_secondary_unit
|
||||
sale_shipment_cost
|
||||
stock_package_shipping
|
||||
xml:
|
||||
ir.xml
|
||||
product.xml
|
||||
web.xml
|
||||
stock.xml
|
||||
message.xml
|
||||
12
modules/web_shop_shopify/view/product_attribute_set_form.xml
Executable file
12
modules/web_shop_shopify/view/product_attribute_set_form.xml
Executable file
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<data>
|
||||
<xpath expr="//field[@name='attributes']" position="after">
|
||||
<group id="shopify_options" string="Shopify Options" colspan="4" col="-1">
|
||||
<field name="shopify_option1"/>
|
||||
<field name="shopify_option2"/>
|
||||
<field name="shopify_option3"/>
|
||||
</group>
|
||||
</xpath>
|
||||
</data>
|
||||
9
modules/web_shop_shopify/view/product_template_form.xml
Executable file
9
modules/web_shop_shopify/view/product_template_form.xml
Executable file
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<data>
|
||||
<xpath expr="//page[@id='customers']" position="inside">
|
||||
<label name="shopify_uom"/>
|
||||
<field name="shopify_uom"/>
|
||||
</xpath>
|
||||
</data>
|
||||
27
modules/web_shop_shopify/view/shop_form.xml
Executable file
27
modules/web_shop_shopify/view/shop_form.xml
Executable file
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<data>
|
||||
<xpath expr="//page[@name='warehouses']" position="after">
|
||||
<page name="shopify_warehouses">
|
||||
<field name="shopify_warehouses" colspan="4" view_ids="web_shop_shopify.shop_stock_location_view_list,web_shop_shopify.shop_stock_location_view_form"/>
|
||||
</page>
|
||||
</xpath>
|
||||
<xpath expr="//page[@id='products']" position="after">
|
||||
<page string="Shopify" id="shopify" col="6">
|
||||
<label name="shopify_url"/>
|
||||
<field name="shopify_url"/>
|
||||
<label name="shopify_password"/>
|
||||
<field name="shopify_password" widget="password"/>
|
||||
<label name="shopify_version"/>
|
||||
<field name="shopify_version"/>
|
||||
|
||||
<label name="shopify_webhook_shared_secret"/>
|
||||
<field name="shopify_webhook_shared_secret"/>
|
||||
<label name="shopify_webhook_endpoint_order"/>
|
||||
<field name="shopify_webhook_endpoint_order"/>
|
||||
|
||||
<field name="shopify_payment_journals" colspan="6"/>
|
||||
</page>
|
||||
</xpath>
|
||||
</data>
|
||||
15
modules/web_shop_shopify/view/shop_shopify_identifier_form.xml
Executable file
15
modules/web_shop_shopify/view/shop_shopify_identifier_form.xml
Executable file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<form>
|
||||
<label name="web_shop"/>
|
||||
<field name="web_shop" colspan="3"/>
|
||||
|
||||
<label name="record"/>
|
||||
<field name="record"/>
|
||||
<label name="shopify_identifier"/>
|
||||
<field name="shopify_identifier" width="20"/>
|
||||
|
||||
<label name="to_update"/>
|
||||
<field name="to_update"/>
|
||||
</form>
|
||||
10
modules/web_shop_shopify/view/shop_shopify_identifier_list.xml
Executable file
10
modules/web_shop_shopify/view/shop_shopify_identifier_list.xml
Executable file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<tree>
|
||||
<field name="web_shop" expand="1"/>
|
||||
<field name="record" expand="1"/>
|
||||
<field name="shopify_identifier" expand="2"/>
|
||||
<field name="to_update"/>
|
||||
<button name="set_to_update" tree_invisible="1"/>
|
||||
</tree>
|
||||
15
modules/web_shop_shopify/view/shop_shopify_payment_journal_form.xml
Executable file
15
modules/web_shop_shopify/view/shop_shopify_payment_journal_form.xml
Executable file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<form>
|
||||
<label name="shop"/>
|
||||
<field name="shop" colspan="3"/>
|
||||
|
||||
<label name="journal"/>
|
||||
<field name="journal" widget="selection"/>
|
||||
<label name="sequence"/>
|
||||
<field name="sequence"/>
|
||||
|
||||
<label name="gateway"/>
|
||||
<field name="gateway"/>
|
||||
</form>
|
||||
8
modules/web_shop_shopify/view/shop_shopify_payment_journal_list.xml
Executable file
8
modules/web_shop_shopify/view/shop_shopify_payment_journal_list.xml
Executable file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<tree sequence="sequence">
|
||||
<field name="shop" expand="1"/>
|
||||
<field name="gateway"/>
|
||||
<field name="journal" expand="2"/>
|
||||
</tree>
|
||||
15
modules/web_shop_shopify/view/shop_stock_location_form.xml
Executable file
15
modules/web_shop_shopify/view/shop_stock_location_form.xml
Executable file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<form>
|
||||
<label name="shop"/>
|
||||
<field name="shop" colspan="3"/>
|
||||
|
||||
<label name="warehouse"/>
|
||||
<field name="warehouse"/>
|
||||
<label name="shopify_id"/>
|
||||
<field name="shopify_id"/>
|
||||
|
||||
<label name="shopify_stock_skip_warehouse"/>
|
||||
<field name="shopify_stock_skip_warehouse"/>
|
||||
</form>
|
||||
8
modules/web_shop_shopify/view/shop_stock_location_list.xml
Executable file
8
modules/web_shop_shopify/view/shop_stock_location_list.xml
Executable file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<tree>
|
||||
<field name="shop" expand="1"/>
|
||||
<field name="warehouse" expand="1"/>
|
||||
<field name="shopify_id"/>
|
||||
</tree>
|
||||
12
modules/web_shop_shopify/view/stock_shipment_shopify_identifier_form.xml
Executable file
12
modules/web_shop_shopify/view/stock_shipment_shopify_identifier_form.xml
Executable file
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<form>
|
||||
<label name="shipment"/>
|
||||
<field name="shipment" colspan="3"/>
|
||||
|
||||
<label name="sale"/>
|
||||
<field name="sale"/>
|
||||
<label name="shopify_identifier"/>
|
||||
<field name="shopify_identifier" width="20"/>
|
||||
</form>
|
||||
8
modules/web_shop_shopify/view/stock_shipment_shopify_identifier_list.xml
Executable file
8
modules/web_shop_shopify/view/stock_shipment_shopify_identifier_list.xml
Executable file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<tree>
|
||||
<field name="shipment" expand="1"/>
|
||||
<field name="sale" expand="1"/>
|
||||
<field name="shopify_identifier" expand="2"/>
|
||||
</tree>
|
||||
717
modules/web_shop_shopify/web.py
Executable file
717
modules/web_shop_shopify/web.py
Executable file
@@ -0,0 +1,717 @@
|
||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
import datetime as dt
|
||||
import urllib.parse
|
||||
from decimal import Decimal
|
||||
|
||||
import pyactiveresource
|
||||
import shopify
|
||||
from shopify.api_version import ApiVersion
|
||||
|
||||
from trytond.cache import Cache
|
||||
from trytond.config import config
|
||||
from trytond.i18n import gettext
|
||||
from trytond.model import (
|
||||
MatchMixin, ModelSQL, ModelView, Unique, fields, sequence_ordered)
|
||||
from trytond.pool import Pool, PoolMeta
|
||||
from trytond.pyson import Eval
|
||||
from trytond.tools import grouped_slice
|
||||
from trytond.transaction import Transaction
|
||||
from trytond.url import http_host
|
||||
|
||||
from .common import IdentifierMixin, IdentifiersMixin
|
||||
from .exceptions import ShopifyError
|
||||
|
||||
EDIT_ORDER_DELAY = dt.timedelta(days=60 + 1)
|
||||
|
||||
|
||||
class Shop(metaclass=PoolMeta):
|
||||
__name__ = 'web.shop'
|
||||
|
||||
_states = {
|
||||
'required': Eval('type') == 'shopify',
|
||||
'invisible': Eval('type') != 'shopify',
|
||||
}
|
||||
|
||||
shopify_url = fields.Char("Shop URL", states=_states)
|
||||
shopify_version = fields.Selection(
|
||||
'get_shopify_versions', "Version", states=_states)
|
||||
shopify_password = fields.Char("Access Token", states=_states, strip=False)
|
||||
shopify_webhook_shared_secret = fields.Char(
|
||||
"Webhook Shared Secret", strip=False,
|
||||
states={
|
||||
'invisible': _states['invisible'],
|
||||
})
|
||||
shopify_webhook_endpoint_order = fields.Function(
|
||||
fields.Char(
|
||||
"Webhook Order Endpoint",
|
||||
help="The URL to be called by Shopify for Order events."),
|
||||
'on_change_with_shopify_webhook_endpoint_order')
|
||||
shopify_warehouses = fields.One2Many(
|
||||
'web.shop-stock.location', 'shop', "Warehouses", states=_states)
|
||||
shopify_payment_journals = fields.One2Many(
|
||||
'web.shop.shopify_payment_journal', 'shop', "Payment Journals",
|
||||
states=_states)
|
||||
|
||||
del _states
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls.type.selection.append(('shopify', "Shopify"))
|
||||
invisible = Eval('type') == 'shopify'
|
||||
for field in [cls.attributes, cls.attributes_removed, cls.warehouses]:
|
||||
if field.states.get('invisible'):
|
||||
field.states['invisible'] |= invisible
|
||||
else:
|
||||
field.states['invisible'] = invisible
|
||||
|
||||
@classmethod
|
||||
def get_shopify_versions(cls):
|
||||
return [(None, "")] + sorted(
|
||||
((v, v) for v in ApiVersion.versions), reverse=True)
|
||||
|
||||
@fields.depends('name')
|
||||
def on_change_with_shopify_webhook_endpoint_order(self, name=None):
|
||||
if not self.name:
|
||||
return
|
||||
url_part = {
|
||||
'database_name': Transaction().database.name,
|
||||
'shop': self.name,
|
||||
}
|
||||
return http_host() + (
|
||||
urllib.parse.quote(
|
||||
'/%(database_name)s/web_shop_shopify/webhook/%(shop)s/order' %
|
||||
url_part))
|
||||
|
||||
@classmethod
|
||||
def view_attributes(cls):
|
||||
return super().view_attributes() + [
|
||||
('//page[@id="shopify"]', 'states', {
|
||||
'invisible': Eval('type') != 'shopify',
|
||||
}),
|
||||
]
|
||||
|
||||
@classmethod
|
||||
def validate_fields(cls, shops, field_names):
|
||||
super().validate_fields(shops, field_names)
|
||||
if field_names & {'type', 'products'}:
|
||||
for shop in shops:
|
||||
if shop.type == 'shopify':
|
||||
for product in shop.products:
|
||||
shop._shopify_check_product(product)
|
||||
|
||||
def _shopify_check_product(self, product):
|
||||
if not product.template.shopify_uom:
|
||||
shopify_uom = product.template.get_shopify_uom()
|
||||
if shopify_uom.digits:
|
||||
raise ShopifyError(gettext(
|
||||
'web_shop_shopify.'
|
||||
'msg_product_shopify_uom_digits',
|
||||
product=product.rec_name))
|
||||
|
||||
@property
|
||||
def to_sync(self):
|
||||
result = super().to_sync
|
||||
if self.type == 'shopify':
|
||||
result = True
|
||||
return result
|
||||
|
||||
def get_sale(self, party=None):
|
||||
sale = super().get_sale(party=party)
|
||||
if self.type == 'shopify':
|
||||
sale.invoice_method = 'shipment'
|
||||
return sale
|
||||
|
||||
def shopify_session(self):
|
||||
return shopify.Session.temp(
|
||||
self.shopify_url, self.shopify_version, self.shopify_password)
|
||||
|
||||
def get_payment_journal(self, currency_code, pattern):
|
||||
for payment_journal in self.shopify_payment_journals:
|
||||
if (payment_journal.journal.currency.code == currency_code
|
||||
and payment_journal.match(pattern)):
|
||||
return payment_journal.journal
|
||||
|
||||
def managed_metafields(self):
|
||||
return set()
|
||||
|
||||
def __sync_metafields(self, resource, metafields):
|
||||
metafields = metafields.copy()
|
||||
managed_metafields = self.managed_metafields()
|
||||
assert metafields.keys() <= managed_metafields
|
||||
for metafield in resource.metafields():
|
||||
key = '.'.join([metafield.namespace, metafield.key])
|
||||
value = metafield.to_dict()
|
||||
if key not in metafields:
|
||||
if key in managed_metafields:
|
||||
metafield.destroy()
|
||||
elif metafields[key] != value:
|
||||
for k, v in metafields.pop(key).items():
|
||||
setattr(metafield, k, v)
|
||||
metafield.save()
|
||||
for key, value in metafields.items():
|
||||
namespace, key = key.split('.', 1)
|
||||
value['namespace'] = namespace
|
||||
value['key'] = key
|
||||
resource.add_metafield(shopify.Metafield(value))
|
||||
|
||||
@classmethod
|
||||
def shopify_update_product(cls, shops=None):
|
||||
"""Update Shopify Products
|
||||
|
||||
The transaction is committed after the creation of each new resource.
|
||||
"""
|
||||
pool = Pool()
|
||||
InventoryItem = pool.get('product.shopify_inventory_item')
|
||||
transaction = Transaction()
|
||||
if shops is None:
|
||||
shops = cls.search([
|
||||
('type', '=', 'shopify'),
|
||||
])
|
||||
for shop in shops:
|
||||
with shop.shopify_session():
|
||||
shopify_shop = shopify.Shop.current()
|
||||
shop_language = (
|
||||
shop.language.code if shop.language
|
||||
else transaction.language)
|
||||
categories = shop.get_categories()
|
||||
products, prices, taxes = shop.get_products()
|
||||
if shopify_shop.currency.lower() != shop.currency.code.lower():
|
||||
raise ShopifyError(gettext(
|
||||
'web_shop_shopify.msg_shop_currency_different',
|
||||
shop=shop.rec_name,
|
||||
shop_currency=shop.currency.code,
|
||||
shopify_currency=shopify_shop.currency))
|
||||
if (shopify_shop.primary_locale.lower()
|
||||
!= shop_language.lower()):
|
||||
raise ShopifyError(gettext(
|
||||
'web_shop_shopify.msg_shop_locale_different',
|
||||
shop=shop.rec_name,
|
||||
shop_language=shop_language,
|
||||
shopify_primary_locale=shopify_shop.primary_locale
|
||||
))
|
||||
|
||||
for category in categories:
|
||||
shop.__shopify_update_category(category)
|
||||
|
||||
categories = set(categories)
|
||||
inventory_items = InventoryItem.browse(products)
|
||||
for product, inventory_item in zip(products, inventory_items):
|
||||
price = prices[product.id]
|
||||
tax = taxes[product.id]
|
||||
|
||||
template = product.template
|
||||
if not template.shopify_uom:
|
||||
shop._shopify_check_product(product)
|
||||
template.shopify_uom = template.get_shopify_uom()
|
||||
template.save()
|
||||
|
||||
shop.__shopify_update_template(
|
||||
shopify_shop, categories, template,
|
||||
product, price, tax)
|
||||
shop.__shopify_update_product(
|
||||
shopify_shop, product, price, tax)
|
||||
shop.__shopify_update_inventory_item(inventory_item)
|
||||
|
||||
for category in shop.categories_removed:
|
||||
shop.__shopify_remove_category(category)
|
||||
shop.categories_removed = []
|
||||
|
||||
products = set(products)
|
||||
for product in shop.products_removed:
|
||||
template = product.template
|
||||
if set(template.products).isdisjoint(products):
|
||||
shop.__shopify_remove_template(template)
|
||||
else:
|
||||
shop.__shopify_remove_product(product)
|
||||
shop.products_removed = []
|
||||
cls.save(shops)
|
||||
|
||||
def __shopify_update_category(self, category):
|
||||
if not category.is_shopify_to_update(self):
|
||||
return
|
||||
custom_collection = category.get_shopify(self)
|
||||
if not custom_collection.save():
|
||||
raise ShopifyError(gettext(
|
||||
'web_shop_shopify.msg_custom_collection_fail',
|
||||
category=category.rec_name,
|
||||
error="\n".join(
|
||||
custom_collection.errors.full_messages())))
|
||||
identifier = category.set_shopify_identifier(
|
||||
self, custom_collection.id)
|
||||
if identifier.to_update:
|
||||
identifier.to_update = False
|
||||
identifier.save()
|
||||
Transaction().commit()
|
||||
|
||||
self.__sync_metafields(
|
||||
custom_collection, category.get_shopify_metafields(self))
|
||||
|
||||
def __shopify_remove_category(self, category):
|
||||
shopify_id = category.get_shopify_identifier(self)
|
||||
if shopify_id:
|
||||
if shopify.CustomCollection.exists(shopify_id):
|
||||
shopify.CustomCollection.find(shopify_id).destroy()
|
||||
category.set_shopify_identifier(self)
|
||||
|
||||
def __shopify_update_template(
|
||||
self, shopify_shop, categories, template, product, price, tax):
|
||||
if not template.is_shopify_to_update(self):
|
||||
return
|
||||
shopify_product = template.get_shopify(self)
|
||||
new = shopify_product.is_new()
|
||||
if new:
|
||||
shopify_product.variants = [
|
||||
product.get_shopify(
|
||||
self, price, tax,
|
||||
shop_taxes_included=shopify_shop.taxes_included,
|
||||
shop_weight_unit=shopify_shop.weight_unit)]
|
||||
else:
|
||||
# Set fake value for missing new options
|
||||
for j, variant in enumerate(shopify_product.variants):
|
||||
for i, _ in range(len(shopify_product.options), 1):
|
||||
name = 'option%i' % i
|
||||
if not getattr(variant, name, None):
|
||||
setattr(variant, name, '_option%i-%i' % (i, j))
|
||||
if not shopify_product.save():
|
||||
raise ShopifyError(gettext(
|
||||
'web_shop_shopify.msg_product_fail',
|
||||
template=template.rec_name,
|
||||
error="\n".join(shopify_product.errors.full_messages())))
|
||||
identifier = template.set_shopify_identifier(
|
||||
self, shopify_product.id)
|
||||
if identifier.to_update:
|
||||
identifier.to_update = False
|
||||
identifier.save()
|
||||
if new:
|
||||
variant, = shopify_product.variants
|
||||
product.set_shopify_identifier(self, variant.id)
|
||||
Transaction().commit()
|
||||
|
||||
self.__sync_metafields(
|
||||
shopify_product, template.get_shopify_metafields(self))
|
||||
|
||||
collection_ids = {
|
||||
c.id for c in shopify_product.collections()}
|
||||
for category in template.categories_all:
|
||||
while category:
|
||||
if category in categories:
|
||||
custom_collection = (
|
||||
shopify.CustomCollection.find(
|
||||
category.get_shopify_identifier(
|
||||
self)))
|
||||
if custom_collection.id in collection_ids:
|
||||
collection_ids.remove(
|
||||
custom_collection.id)
|
||||
else:
|
||||
shopify_product.add_to_collection(
|
||||
custom_collection)
|
||||
category = category.parent
|
||||
for collection_id in collection_ids:
|
||||
collection = shopify.CustomCollection.find(
|
||||
collection_id)
|
||||
shopify_product.remove_from_collection(collection)
|
||||
|
||||
self.__shopify_update_images(template, shopify_product)
|
||||
|
||||
def __shopify_remove_template(self, template):
|
||||
shopify_id = template.get_shopify_identifier(self)
|
||||
if not shopify_id:
|
||||
return
|
||||
if shopify.Product.exists(shopify_id):
|
||||
shopify.Product.find(shopify_id).destroy()
|
||||
template.set_shopify_identifier(self)
|
||||
for product in template.products:
|
||||
product.set_shopify_identifier(self)
|
||||
if getattr(template, 'images', None):
|
||||
for image in template.images:
|
||||
image.set_shopify_identifier(self)
|
||||
|
||||
def __shopify_update_images(self, template, shopify_product):
|
||||
if not getattr(template, 'images', None):
|
||||
return
|
||||
transaction = Transaction()
|
||||
image_ids = set()
|
||||
for i, image in enumerate(filter(
|
||||
lambda i: i.web_shop,
|
||||
template.images_used), 1):
|
||||
product_image = image.get_shopify(self)
|
||||
new_image = not product_image.id
|
||||
product_image.position = i
|
||||
if not product_image.save():
|
||||
raise ShopifyError(gettext(
|
||||
'web_shop_shopify'
|
||||
'.msg_product_image_fail',
|
||||
image=image.rec_name,
|
||||
template=template.rec_name,
|
||||
error="\n".join(
|
||||
product_image.errors
|
||||
.full_messages())))
|
||||
image_ids.add(product_image.id)
|
||||
if new_image:
|
||||
image.set_shopify_identifier(
|
||||
self, product_image.id)
|
||||
transaction.commit()
|
||||
|
||||
for image in shopify_product.images:
|
||||
if image.id not in image_ids:
|
||||
image.destroy()
|
||||
|
||||
def __shopify_update_product(self, shopify_shop, product, price, tax):
|
||||
update_extra = {'price': str(price), 'tax': str(tax)}
|
||||
if not product.is_shopify_to_update(self, **update_extra):
|
||||
return
|
||||
variant = product.get_shopify(
|
||||
self, price, tax,
|
||||
shop_taxes_included=shopify_shop.taxes_included,
|
||||
shop_weight_unit=shopify_shop.weight_unit)
|
||||
if not variant.save():
|
||||
raise ShopifyError(gettext(
|
||||
'web_shop_shopify.msg_variant_fail',
|
||||
product=product.rec_name,
|
||||
error="\n".join(variant.errors.full_messages())
|
||||
))
|
||||
identifier = product.set_shopify_identifier(self, variant.id)
|
||||
if identifier.to_update or identifier.to_update_extra != update_extra:
|
||||
identifier.to_update = False
|
||||
identifier.to_update_extra = update_extra
|
||||
identifier.save()
|
||||
Transaction().commit()
|
||||
|
||||
self.__sync_metafields(variant, product.get_shopify_metafields(self))
|
||||
|
||||
def __shopify_update_inventory_item(self, inventory_item):
|
||||
if not inventory_item.is_shopify_to_update(self):
|
||||
return
|
||||
shopify_inventory_item = inventory_item.get_shopify(self)
|
||||
if shopify_inventory_item:
|
||||
if not shopify_inventory_item.save():
|
||||
raise ShopifyError(gettext(
|
||||
'web_shop_shopify.msg_inventory_item_fail',
|
||||
product=inventory_item.product.rec_name,
|
||||
error="\n".join(
|
||||
inventory_item.errors.full_messages())))
|
||||
identifier = inventory_item.set_shopify_identifier(
|
||||
self, shopify_inventory_item.id if
|
||||
shopify_inventory_item.tracked else None)
|
||||
if identifier and identifier.to_update:
|
||||
identifier.to_update = False
|
||||
identifier.save()
|
||||
Transaction().commit()
|
||||
|
||||
def __shopify_remove_product(self, product):
|
||||
shopify_id = product.get_shopify_identifier(self)
|
||||
if shopify_id:
|
||||
if shopify.Variant.exists(shopify_id):
|
||||
shopify.Variant.find(shopify_id).destroy()
|
||||
product.set_shopify_identifier(self)
|
||||
|
||||
@classmethod
|
||||
def shopify_update_inventory(cls, shops=None):
|
||||
"""Update Shopify Inventory"""
|
||||
pool = Pool()
|
||||
Product = pool.get('product.product')
|
||||
if shops is None:
|
||||
shops = cls.search([
|
||||
('type', '=', 'shopify'),
|
||||
])
|
||||
for shop in shops:
|
||||
for shop_warehouse in shop.shopify_warehouses:
|
||||
location_id = shop_warehouse.shopify_id
|
||||
if not location_id:
|
||||
continue
|
||||
location_id = int(location_id)
|
||||
with Transaction().set_context(
|
||||
shop.get_context(),
|
||||
**shop_warehouse.get_shopify_inventory_context()):
|
||||
products = Product.browse([
|
||||
p for p in shop.products if p.shopify_uom])
|
||||
with shop.shopify_session():
|
||||
shop.__shopify_update_inventory(products, location_id)
|
||||
|
||||
def __shopify_update_inventory(self, products, location_id):
|
||||
pool = Pool()
|
||||
InventoryItem = pool.get('product.shopify_inventory_item')
|
||||
inventory_items = InventoryItem.browse(products)
|
||||
product2quantity = {p.id: int(p.shopify_quantity) for p in products}
|
||||
shopify2product = {
|
||||
i.get_shopify_identifier(self): i.id for i in inventory_items}
|
||||
shopify2product.pop(None, None)
|
||||
product2shopify = {v: k for k, v in shopify2product.items()}
|
||||
|
||||
location = shopify.Location.find(location_id)
|
||||
for i, inventory_level in enumerate(
|
||||
location.inventory_levels(limit=250, no_iter_next=False)):
|
||||
inventory_item_id = inventory_level.inventory_item_id
|
||||
product_id = shopify2product.get(inventory_item_id)
|
||||
if product_id is None:
|
||||
continue
|
||||
quantity = product2quantity.pop(product_id)
|
||||
if inventory_level.available != quantity:
|
||||
try:
|
||||
shopify.InventoryLevel.set(
|
||||
location_id, inventory_item_id, quantity)
|
||||
except pyactiveresource.connection.ResourceNotFound:
|
||||
pass
|
||||
|
||||
for product_id, quantity in product2quantity.items():
|
||||
inventory_item_id = product2shopify.get(product_id)
|
||||
if inventory_item_id is None:
|
||||
continue
|
||||
try:
|
||||
shopify.InventoryLevel.set(
|
||||
location_id, inventory_item_id, quantity)
|
||||
except pyactiveresource.connection.ResourceNotFound:
|
||||
pass
|
||||
|
||||
@classmethod
|
||||
def shopify_fetch_order(cls, shops=None):
|
||||
"""Fetch new Shopify Order"""
|
||||
pool = Pool()
|
||||
Sale = pool.get('sale.sale')
|
||||
Payment = pool.get('account.payment')
|
||||
context = Transaction().context
|
||||
if shops is None:
|
||||
shops = cls.search([
|
||||
('type', '=', 'shopify'),
|
||||
])
|
||||
cls.lock(shops)
|
||||
for shop in shops:
|
||||
last_sales = Sale.search([
|
||||
('web_shop', '=', shop.id),
|
||||
], order=[('shopify_identifier_signed', 'DESC')], limit=1)
|
||||
if last_sales:
|
||||
last_sale, = last_sales
|
||||
last_order_id = last_sale.shopify_identifier
|
||||
else:
|
||||
last_order_id = ''
|
||||
with shop.shopify_session():
|
||||
if 'shopify_orders' in context:
|
||||
orders = shopify.Order.find(
|
||||
ids=context['shopify_orders'],
|
||||
limit=250, no_iter_next=False)
|
||||
else:
|
||||
orders = shopify.Order.find(
|
||||
status='open', since_id=last_order_id,
|
||||
limit=250, no_iter_next=False)
|
||||
sales = []
|
||||
for i, order in enumerate(orders):
|
||||
sales.append(Sale.get_from_shopify(shop, order))
|
||||
Sale.save(sales)
|
||||
for sale, order in zip(sales, orders):
|
||||
sale.shopify_tax_adjustment = (
|
||||
Decimal(order.total_price) - sale.total_amount)
|
||||
Sale.save(sales)
|
||||
Sale.quote(sales)
|
||||
for sale, order in zip(sales, orders):
|
||||
Payment.get_from_shopify(sale, order)
|
||||
|
||||
@classmethod
|
||||
def shopify_update_order(cls, shops=None):
|
||||
"""Update existing sale from Shopify"""
|
||||
pool = Pool()
|
||||
Sale = pool.get('sale.sale')
|
||||
if shops is None:
|
||||
shops = cls.search([
|
||||
('type', '=', 'shopify'),
|
||||
])
|
||||
cls.lock(shops)
|
||||
now = dt.datetime.now()
|
||||
for shop in shops:
|
||||
sales = Sale.search([
|
||||
('web_shop', '=', shop.id),
|
||||
('shopify_identifier', '!=', None),
|
||||
['OR',
|
||||
('state', 'in',
|
||||
['quotation', 'confirmed', 'processing']),
|
||||
('create_date', '>=', now - EDIT_ORDER_DELAY),
|
||||
],
|
||||
])
|
||||
for sub_sales in grouped_slice(sales, count=250):
|
||||
cls._shopify_update_order(shop, list(sub_sales))
|
||||
|
||||
@classmethod
|
||||
def _shopify_update_order(cls, shop, sales):
|
||||
assert shop.type == 'shopify'
|
||||
assert all(s.web_shop == shop for s in sales)
|
||||
with shop.shopify_session():
|
||||
orders = shopify.Order.find(
|
||||
ids=','.join(str(s.shopify_identifier) for s in sales),
|
||||
status='any')
|
||||
id2order = {o.id: o for o in orders}
|
||||
|
||||
to_update = []
|
||||
orders = []
|
||||
for sale in sales:
|
||||
try:
|
||||
order = id2order[sale.shopify_identifier]
|
||||
except KeyError:
|
||||
continue
|
||||
to_update.append(sale)
|
||||
orders.append(order)
|
||||
cls.shopify_update_sale(to_update, orders)
|
||||
|
||||
@classmethod
|
||||
def shopify_update_sale(cls, sales, orders):
|
||||
"""Update sales based on Shopify orders"""
|
||||
pool = Pool()
|
||||
Amendment = pool.get('sale.amendment')
|
||||
Payment = pool.get('account.payment')
|
||||
Sale = pool.get('sale.sale')
|
||||
assert len(sales) == len(orders)
|
||||
to_update = {}
|
||||
for sale, order in zip(sales, orders):
|
||||
assert sale.shopify_identifier == order.id
|
||||
shop = sale.web_shop
|
||||
with shop.shopify_session():
|
||||
sale = Sale.get_from_shopify(shop, order, sale=sale)
|
||||
if sale._changed_values:
|
||||
sale.untaxed_amount_cache = None
|
||||
sale.tax_amount_cache = None
|
||||
sale.total_amount_cache = None
|
||||
to_update[sale] = order
|
||||
Payment.get_from_shopify(sale, order)
|
||||
Sale.save(to_update.keys())
|
||||
for sale, order in to_update.items():
|
||||
sale.shopify_tax_adjustment = (
|
||||
Decimal(order.current_total_price) - sale.total_amount)
|
||||
Sale.store_cache(to_update.keys())
|
||||
Amendment._clear_sale(to_update.keys())
|
||||
Sale.__queue__.process(to_update.keys())
|
||||
|
||||
|
||||
class ShopShopifyIdentifier(IdentifierMixin, ModelSQL, ModelView):
|
||||
"Shopify Identifier"
|
||||
__name__ = 'web.shop.shopify_identifier'
|
||||
|
||||
record = fields.Reference("Record", 'get_records', required=True)
|
||||
web_shop = fields.Many2One(
|
||||
'web.shop', "Web Shop", required=True, ondelete='CASCADE')
|
||||
to_update = fields.Boolean("To Update")
|
||||
to_update_extra = fields.Dict(None, "To Update Extra")
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls.shopify_identifier_signed.states = {
|
||||
'required': True,
|
||||
}
|
||||
t = cls.__table__()
|
||||
cls._sql_constraints += [
|
||||
('record_web_shop_unique',
|
||||
Unique(t, t.record, t.shopify_identifier_signed),
|
||||
'web_shop_shopify.msg_identifier_record_web_shop_unique'),
|
||||
]
|
||||
cls._buttons.update({
|
||||
'set_to_update': {},
|
||||
})
|
||||
|
||||
@classmethod
|
||||
def get_records(cls):
|
||||
pool = Pool()
|
||||
Model = pool.get('ir.model')
|
||||
get_name = Model.get_name
|
||||
models = (klass.__name__ for _, klass in pool.iterobject()
|
||||
if issubclass(klass, IdentifiersMixin))
|
||||
return [(m, get_name(m)) for m in models]
|
||||
|
||||
@classmethod
|
||||
def set_to_update(cls, identifiers):
|
||||
cls.write(identifiers, {'to_update': True})
|
||||
|
||||
|
||||
class Shop_Warehouse(ModelView, metaclass=PoolMeta):
|
||||
__name__ = 'web.shop-stock.location'
|
||||
|
||||
shopify_stock_skip_warehouse = fields.Boolean(
|
||||
"Only storage zone",
|
||||
help="Check to use only the quantity of the storage zone.")
|
||||
shopify_id = fields.Selection(
|
||||
'get_shopify_locations', "Shopify ID")
|
||||
_shopify_locations_cache = Cache(
|
||||
__name__ + '.get_shopify_locations',
|
||||
duration=config.getint(
|
||||
'web_shop_shopify', 'locations_cache', default=15 * 60),
|
||||
context=False)
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls.__access__.add('shop')
|
||||
t = cls.__table__()
|
||||
cls._sql_constraints += [
|
||||
('shopify_id_unique',
|
||||
Unique(t, t.shopify_id),
|
||||
'web_shop_shopify.msg_location_id_unique'),
|
||||
]
|
||||
|
||||
@fields.depends(
|
||||
'shop', '_parent_shop.shopify_url', '_parent_shop.shopify_version',
|
||||
'_parent_shop.shopify_password')
|
||||
def get_shopify_locations(self):
|
||||
locations = [(None, "")]
|
||||
if self.shop:
|
||||
locations_cache = self._shopify_locations_cache.get(self.shop.id)
|
||||
if locations_cache is not None:
|
||||
return locations_cache
|
||||
try:
|
||||
with self.shop.shopify_session():
|
||||
locations += [
|
||||
(str(l.id), l.name)
|
||||
for l in shopify.Location.find(no_iter_next=False)]
|
||||
self._shopify_locations_cache.set(self.shop.id, locations)
|
||||
except (AttributeError,
|
||||
shopify.VersionNotFoundError,
|
||||
pyactiveresource.connection.Error):
|
||||
pass
|
||||
return locations
|
||||
|
||||
def get_shopify_inventory_context(self):
|
||||
return {
|
||||
'locations': [self.warehouse.id],
|
||||
'stock_skip_warehouse': self.shopify_stock_skip_warehouse,
|
||||
'with_childs': True,
|
||||
}
|
||||
|
||||
|
||||
class Shop_Attribute(metaclass=PoolMeta):
|
||||
__name__ = 'web.shop-product.attribute'
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
domain = [
|
||||
('type', '!=', 'shopify'),
|
||||
]
|
||||
if cls.shop.domain:
|
||||
cls.shop.domain = [cls.shop.domain, domain]
|
||||
else:
|
||||
cls.shop.domain = domain
|
||||
|
||||
|
||||
class ShopShopifyPaymentJournal(
|
||||
sequence_ordered(), MatchMixin, ModelSQL, ModelView):
|
||||
"Shopify Payment Journal"
|
||||
__name__ = 'web.shop.shopify_payment_journal'
|
||||
|
||||
shop = fields.Many2One(
|
||||
'web.shop', "Shop", required=True, ondelete='CASCADE',
|
||||
domain=[
|
||||
('type', '=', 'shopify'),
|
||||
])
|
||||
gateway = fields.Char(
|
||||
"Gateway",
|
||||
help="The payment gateway name for which the journal must be used.")
|
||||
journal = fields.Many2One(
|
||||
'account.payment.journal', "Journal", required=True,
|
||||
domain=[
|
||||
('process_method', '=', 'shopify'),
|
||||
])
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls.__access__.add('shop')
|
||||
|
||||
# TODO: add wizard to export translations
|
||||
93
modules/web_shop_shopify/web.xml
Executable file
93
modules/web_shop_shopify/web.xml
Executable file
@@ -0,0 +1,93 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
this repository contains the full copyright notices and license terms. -->
|
||||
<tryton>
|
||||
<data>
|
||||
<record model="ir.ui.view" id="shop_view_form">
|
||||
<field name="model">web.shop</field>
|
||||
<field name="inherit" ref="web_shop.shop_view_form"/>
|
||||
<field name="name">shop_form</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="shop_stock_location_view_form">
|
||||
<field name="model">web.shop-stock.location</field>
|
||||
<field name="type">form</field>
|
||||
<field name="priority" eval="20"/>
|
||||
<field name="name">shop_stock_location_form</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="shop_stock_location_view_list">
|
||||
<field name="model">web.shop-stock.location</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="priority" eval="20"/>
|
||||
<field name="name">shop_stock_location_list</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="shop_shopify_identifier_view_form">
|
||||
<field name="model">web.shop.shopify_identifier</field>
|
||||
<field name="type">form</field>
|
||||
<field name="name">shop_shopify_identifier_form</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="shop_shopify_identifier_view_list">
|
||||
<field name="model">web.shop.shopify_identifier</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="name">shop_shopify_identifier_list</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.action.act_window" id="act_shop_shopify_identifier_form">
|
||||
<field name="name">Shopify Identifiers</field>
|
||||
<field name="res_model">web.shop.shopify_identifier</field>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view" id="act_shop_shopify_identifier_form_view1">
|
||||
<field name="sequence" eval="10"/>
|
||||
<field name="view" ref="shop_shopify_identifier_view_list"/>
|
||||
<field name="act_window" ref="act_shop_shopify_identifier_form"/>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view" id="act_shop_shopify_identifier_form_view2">
|
||||
<field name="sequence" eval="20"/>
|
||||
<field name="view" ref="shop_shopify_identifier_view_form"/>
|
||||
<field name="act_window" ref="act_shop_shopify_identifier_form"/>
|
||||
</record>
|
||||
<menuitem
|
||||
parent="ir.menu_models"
|
||||
action="act_shop_shopify_identifier_form"
|
||||
sequence="50"
|
||||
id="menu_shop_shopify_identifier_form"/>
|
||||
|
||||
<record model="ir.model.access" id="access_shop_shopify_identifier">
|
||||
<field name="model">web.shop.shopify_identifier</field>
|
||||
<field name="perm_read" eval="True"/>
|
||||
<field name="perm_write" eval="False"/>
|
||||
<field name="perm_create" eval="False"/>
|
||||
<field name="perm_delete" eval="False"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.model.access" id="access_shop_shopify_identifier_admin">
|
||||
<field name="model">web.shop.shopify_identifier</field>
|
||||
<field name="group" ref="res.group_admin"/>
|
||||
<field name="perm_read" eval="True"/>
|
||||
<field name="perm_write" eval="True"/>
|
||||
<field name="perm_create" eval="True"/>
|
||||
<field name="perm_delete" eval="True"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.model.button" id="shop_shopify_identifier_set_to_update_button">
|
||||
<field name="model">web.shop.shopify_identifier</field>
|
||||
<field name="name">set_to_update</field>
|
||||
<field name="string">Set to Update</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="shop_shopify_payment_journal_view_form">
|
||||
<field name="model">web.shop.shopify_payment_journal</field>
|
||||
<field name="type">form</field>
|
||||
<field name="name">shop_shopify_payment_journal_form</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="shop_shopify_payment_journal_view_list">
|
||||
<field name="model">web.shop.shopify_payment_journal</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="name">shop_shopify_payment_journal_list</field>
|
||||
</record>
|
||||
</data>
|
||||
</tryton>
|
||||
Reference in New Issue
Block a user